2012-11-10 40 views
5

Tôi đang cố gắng thêm biểu đồ đường đơn giản trong excel tự động bằng cách sử dụng EPPlus. Tôi có và biết phạm vi ô chứa dữ liệu mà tôi muốn sử dụng. Tôi muốn các đồ thị để trông giống như sau:Thiết lập dữ liệu được sử dụng bởi biểu đồ đường kẻ sử dụng EPPlus

enter image description here

Các cột BeforeAfter đi cho rất nhiều nhiều hơn những gì được hiển thị.

Tôi đang sử dụng mã này để tạo ra các đồ thị và vị trí của nó, nhưng tôi không chắc chắn làm thế nào để thiết lập các dữ liệu mà biểu đồ sử dụng:

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); 

Nó có thể có cái gì để làm với ec.Series.Add nhưng tôi không chắc chắn cách sử dụng đúng cách. Nếu bạn có thể chỉ cho tôi đúng hướng sẽ tuyệt vời.

Trả lời

10

Hy vọng điều này sẽ giúp bạn:

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 

Một ví dụ đầy đủ Tôi vừa mới thử nghiệm:

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 là loại cho ser loạt, chúng ta hãy loại bỏ c:cat thẻ từ bảng xếp hạng xml, sau đó bạn biểu đồ sẽ sử dụng 1,2,3,4,5,... làm mặc định cho danh mục (trục x ở đây).

+0

Cảm ơn, tôi sẽ cố gắng sớm. Theo phạm vi nhãn bạn có ý nghĩa gì nếu tôi muốn biểu đồ có giá trị cụ thể trên trục x và y, chẳng hạn như '1 2 3 4 5 6'? – 3aw5TZetdf

+0

Phạm vi giá trị trục X. Nó có thể là null, sau đó các giá trị X sẽ là '1 2 3 4 5 6 ...' như trong hình minh họa của bạn. – Han

+0

Tôi đã thử nghiệm nó nhưng khi tôi gọi 'ec.Series.Add (ran1, null)' nó ném một 'NullReferenceException'. Tôi cho rằng đó là vì 'null' được thông qua. Bạn có chắc là bạn có thể vượt qua null không? – 3aw5TZetdf

Các vấn đề liên quan