2017-10-08 4 views
0

Ich schreibe eine einfache Anwendung, die eine Textdatei, wandelt es in Data Table, führt einige Operationen darauf und dann konvertiert in Excel-Arbeitsblatt und zeichnet ein Diagramm. Um das zu erreichen, dass ich EPPlus bin mit 4.1.0Edit Legende eines Excel-Diagramm mit EPPlus

Hier ist der Code der Methode, die ich zum Zeichnen von Diagrammen verwenden:

public static ExcelPackage DrawChartTwoAxis(this ExcelPackage package) 
    { 
     if (package.Workbook.Worksheets.FirstOrDefault(ws => ws.Name == "Wykresy") != null) 
     { 
      package.Workbook.Worksheets.Delete("Wykresy"); 
     } 
     ExcelWorksheet worksheetWithCharts = package.Workbook.Worksheets.Add("Wykresy"); 

     ExcelWorksheet worksheetWithData = package.Workbook.Worksheets["Dane"]; 

     var numberOfRows = package.Workbook.Worksheets["Dane"].Dimension.End.Row; 
     var maxColumnLetter = package.Workbook.Worksheets["Dane"].Dimension.End.Address.ToCharArray()[0]; 
     var numberofColumns = package.Workbook.Worksheets["Dane"].Dimension.End.Column; 

     ExcelChart chart = worksheetWithCharts.Drawings.AddChart("Zgrubny wykres", eChartType.LineMarkers); 
     var chartType2 = chart.PlotArea.ChartTypes.Add(eChartType.LineMarkers); 
     chartType2.UseSecondaryAxis = true; 

     Random rand = new Random(); 

     for (int i = 2; i <= numberofColumns; i++) 
     { 
      if (worksheetWithData.Cells[1, i].Text.ToLower().Contains("pttk") || 
       worksheetWithData.Cells[1, i].Text.ToLower().Contains("pt100")) 
      { 
       var serie = chart.Series.Add(worksheetWithData.Cells[2, i, numberOfRows, i], 
        worksheetWithData.Cells[$"A2:A{numberOfRows}"]); 
       serie.Border.Fill.Color = System.Drawing.Color.FromArgb(rand.Next(0, 256), rand.Next(0, 256), rand.Next(0, 256)); 
       serie.HeaderAddress = worksheetWithData.Cells[1, i]; 
      } 
      else 
      { 
       var serie = chartType2.Series.Add(worksheetWithData.Cells[2, i, numberOfRows, i], 
        worksheetWithData.Cells[$"A2:A{numberOfRows}"]); 
       serie.Border.Fill.Color = System.Drawing.Color.FromArgb(rand.Next(0, 256), rand.Next(0, 256), rand.Next(0, 256)); 
       serie.HeaderAddress = worksheetWithData.Cells[1, i]; 
      } 
     } 
     return package; 

Dieses Verfahren ist ein Teil einer größeren Pipeline für ExcelPackage Verarbeitung und das ist, warum es ist keine Save() - oder Dispose() -Methode aufgerufen.

Der Punkt ist, dass auf der Legende des Diagramms erstellt alle Reihen werden als "Spalte A", "Spalte B" usw. trotz Einstellung Header-Eigenschaft zu etwas anderem gekennzeichnet. Es funktioniert gleich, egal ob ich den Header-Namen explizit oder über HeaderAdress spezifiziere.

Wie ändere ich Legendenbeschriftungen in meine benutzerdefinierten Namen? Oder wenn es mit EPPlus nicht möglich ist - gibt es einen anderen Rahmen, der eine solche Funktionalität hat? Hinweis: Ich habe die erstellte .xlsx-Datei mit OpenOffice 4 geöffnet, wenn das wichtig ist, ich habe keinen Zugang zu Microsoft Office.

Außerdem - ich habe es geschafft, meine Serie zu färben, obwohl es mit EPPlus unmöglich war. Kannst du mir sagen, was genau ich mit Border.Fill.Color färbe?

Antwort

0

erster Weg) Schleife durch alle Ihre Spalten wie die

//ws is your excel sheet 
    //in cells you put the column 
    ws.Cells["A1"].Value = "the column name"; 
ws.Cells["B1"].Value = "the column name"; 

...

2. Art und Weise) Sie eine Datatable mit den Spaltennamen erstellen können Sie Sie dann füllen Sie es mit Ihren Daten und dann laden Sie es wie folgt

//ws is your excel sheet 
//MyDt is your DataTable 
ws.Cells["A1"].LoadFromDataTable(MyDt, true);