2012-11-10 15 views
5

Próbuję automatycznie dodać prosty wykres liniowy w programie Excel za pomocą programu EPPlus. Mam i znam zakres komórek, które zawierają dane, które chcę użyć. Chcę wykres, aby wyglądać następująco:Ustawianie danych używanych przez wykres liniowy przy użyciu EPPlus

enter image description here

W Before i After kolumny trwać wiele więcej niż to, co jest pokazane.

używam tego kodu, aby utworzyć wykres i umieść go, ale nie jestem pewien jak ustawić dane, że wykres zastosowań:

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

To może mieć coś wspólnego z ec.Series.Add ale jestem nie wiem, jak prawidłowo go używać. Gdybyś mógł wskazać mi właściwy kierunek, byłoby wspaniale.

Odpowiedz

10

Nadzieja to pomaga:

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 

Innym przykładem pełnego Właśnie testowany:

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 jest kategoria dla serii ser, niech usunąć c:cat tagi z wykresów xml, wówczas wykres użyje domyślnie dla kategorii 1,2,3,4,5,... (tutaj oś x).

+0

Dzięki, spróbuję to wkrótce. Według zakresu etykiety masz na myśli, czy chcę, aby wykres miał konkretne wartości na osi X i Y, takie jak '1 2 3 4 5 6'? – 3aw5TZetdf

+0

Zakres wartości osi X. Może być wartością pustą, a następnie wartościami X będą "1 2 3 4 5 6 ..." jak na obrazku ilustrującym. – Han

+0

Przetestowałem to, ale kiedy wołam 'ec.Series.Add (ran1, null)' to wyrzuca 'NullReferenceException'. Zakładam, że dzieje się tak, ponieważ minął 'null'. Czy na pewno możesz przekazać wartość null? – 3aw5TZetdf

Powiązane problemy