【问题标题】:Setting data used by a line graph using EPPlus使用 EPPlus 设置折线图使用的数据
【发布时间】:2012-11-13 16:30:51
【问题描述】:

我正在尝试使用 EPPlus 在 Excel 中自动添加一个简单的折线图。我有并且知道包含我要使用的数据的单元格范围。我希望图表如下所示:

Before 和 After 列的含义远不止所示。

我正在使用此代码创建图表并定位它,但我不确定如何设置图表使用的数据:

ExcelChart ec = ws.Drawings.AddChart("Line Time Graph", OfficeOpenXml.Drawing.Chart.eChartType.Line);
ec.Title.Text = "Benchmarks";
ec.SetPosition(_times.Count + 2, 0, 1, 0);

这可能与ec.Series.Add 有关,但我不确定如何正确使用它。如果你能指出我正确的方向,那就太好了。

【问题讨论】:

    标签: c# excel epplus


    【解决方案1】:

    希望对您有所帮助:

    ExcelChart ec = ws.Drawings.AddChart("Line Time Graph", OfficeOpenXml.Drawing.Chart.eChartType.Line);
    ec.Title.Text = "Benchmarks";
    ec.SetPosition(_times.Count + 2, 0, 1, 0);
    ec.SetSize(800, 600);
    
    var ran1 = sheet.Cells["A3:A10"];
    var ran2 = sheet.Cells["G3:G10"]; // label range if there is. Otherwise, let select blank range then edit XML data later to remove 'c:cat' tags (bellow example)
    
    var serie1 = ec.Series.Add(ran1, ran2);
    // use serie1 variable to format and so on
    // set serie1.HeaderAddress to A2 also
    
    var ran1 = sheet.Cells["B3:B10"];
    var serie2 = ec.Series.Add(ran1, ran2);
    // use serie2 variable to format and so on
    

    我刚刚测试的另一个完整示例:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using OfficeOpenXml;
    using System.IO;
    using OfficeOpenXml.Drawing.Chart;
    
    namespace TestExcelEPPluss
    {
        class Program
        {
            static void Main(string[] args)
            {
                ExcelPackage package = new ExcelPackage();
                var sheet = package.Workbook.Worksheets.Add("TestingGraph");
    
                Random r = new Random();
                var cell = sheet.Cells["A1"];
                cell.Value = "Before";
    
                cell = sheet.Cells["B1"];
                cell.Value = "After";
    
                for (int i = 0; i < 100; i++)
                {
                    cell = sheet.Cells[i + 2, 1];
                    cell.Value = r.Next(300, 500);
                    cell = sheet.Cells[i + 2, 2];
                    cell.Value = r.Next(300, 500);
                }
    
                ExcelChart ec = (ExcelLineChart)sheet.Drawings.AddChart("chart_1", eChartType.Line);
                ec.SetPosition(1, 0, 3, 0);
                ec.SetSize(800, 300);
                //ec.Legend.Add();
    
                var ran1 = sheet.Cells["A2:A101"];
                var ran2 = sheet.Cells["0:0"];
    
                var serie1 = (ExcelLineChartSerie)ec.Series.Add(ran1, ran2);
                serie1.Header = sheet.Cells["A1"].Value.ToString();
    
                ran1 = sheet.Cells["B2:B101"];
                var serie2 = ec.Series.Add(ran1, ran2);
                serie2.Header = sheet.Cells["B1"].Value.ToString();
    
                var xml = ec.ChartXml;
                var lst = xml.GetElementsByTagName("c:lineChart");
                foreach (System.Xml.XmlNode item in lst[0].ChildNodes)
                {
                    if (item.Name.Equals("ser"))
                    {
                        foreach (System.Xml.XmlNode subitem in item.ChildNodes)
                        {
                            if (subitem.Name.Equals("c:cat"))
                            {
                                item.RemoveChild(subitem);
                                break;
                            }
                        }
                    }
                }
    
                string path = @"C:\test1.xlsx";
                File.WriteAllBytes(path, package.GetAsByteArray());
                package.Dispose();
    
                Console.WriteLine("Done - Path: {0}", path);
                Console.ReadLine();
            }
        }
    }
    

    c:cat 是 ser 系列的类别,让我们从图表 xml 中删除 c:cat 标签,然后您的图表将使用 1,2,3,4,5,... 作为该类别的默认值(此处为 x 轴)。

    【讨论】:

    • 谢谢,我会尽快尝试。标签范围是指我是否希望图表在 x 和 y 轴上具有特定值,例如1 2 3 4 5 6?
    • X 轴值范围。它可以为 null,然后 X 值将是 1 2 3 4 5 6 ...,就像您的插图中一样。
    • 我已经对其进行了测试,但是当我调用ec.Series.Add(ran1, null) 时,它会抛出NullReferenceException。我假设这是因为 null 通过了。你确定你可以传递null吗?
    • 我只是认为它有效。让我们尝试传递一个空白范围,否则您应该相应地使 X 值范围。很抱歉这个错误。
    • 没问题,我会尽快或明天试试(这里晚了)。
    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    相关资源
    最近更新 更多