2015-01-26 149 views
0

我使用EPPlus和C#創建Excel文檔。在內容工作表中,我有幾行包含日期時間和值。然後我用下面的代碼來創建一個圖表:圖表X軸日期和時間

var wsPressure = pck.Workbook.Worksheets.Add("Pressure"); 
    var chartPressure = wsPressure.Drawings.AddChart("PressureChart", eChartType.Line); 
    chartPressure.SetSize(1280, 1024); 
    var serie1 = (ExcelLineChartSerie)chartPressure.Series.Add("=Content!$A$2:$A$" + dataRow, "=Content!$D$2:$D$" + dataRow); 
    serie1.Header = wsContent.Cells[1, 1].Value.ToString(); 

圖表打印但時間丟失。因此,對於具有多個值的任何日子,繪製垂直線。如果我在Excel中手動創建圖表,這工作正常。如何對EPPlus執行相同的操作?

的樣本數據:

A B C D 
1 - - 01/01/2015 
4 - - 01/01/2015 
2 - - 01/02/2015 
3 - - 01/03/2015 
6 - - 01/03/2015 
5 - - 01/03/2015 

這裏有問題的數據是2015年1月1日和2015年1月3日。最後一個很難,因爲中間的價值完全喪失了。

回答

0

問題是在excel中的折線圖將默認情況下嘗試確定x軸的類型,並得出結論,它是一種日期類型,在您的情況下只有一半是正確的。如果您將其更改爲軸選項下的「文本」,則會將所有內容視爲類別幷包含時間組件。請注意,這不會按日期/時間差異「適當地」分隔它們,因此1/1和1/2之間的距離將與1/2和1/6相同 - 這可能是也可能不是您想要的。無論哪種方式,我都沒有看到在EPP中設置X eAxisType的選項,因爲它是隻讀的,並且在構建圖表對象時進行設置。我想如果你想搞砸它,你將不得不使用手動XML操作。

你可能是在一個XY散點圖之後呢?像這樣的東西可能會得到你想要的東西:

[TestMethod] 
public void Chart_DateTime_Test() 
{ 
    //http://stackoverflow.com/questions/28158702/chart-x-axis-date-and-time 
    var existingFile = new FileInfo(@"c:\temp\temp.xlsx"); 
    if (existingFile.Exists) 
     existingFile.Delete(); 

    using (var pck = new ExcelPackage(existingFile)) 
    { 
     var wsContent = pck.Workbook.Worksheets.Add("Content"); 
     var wsPressure = pck.Workbook.Worksheets.Add("Pressure"); 

     //Some data 
     wsContent.Cells["A1"].Value = "A"; 
     wsContent.Cells["B1"].Value = "B"; 
     wsContent.Cells["C1"].Value = "C"; 
     wsContent.Cells["D1"].Value = "D"; 

     wsContent.Cells["A2"].Value = 1; 
     wsContent.Cells["A3"].Value = 4; 
     wsContent.Cells["A4"].Value = 2; 
     wsContent.Cells["A5"].Value = 3; 
     wsContent.Cells["A6"].Value = 6; 
     wsContent.Cells["A7"].Value = 5; 

     wsContent.Cells["D2"].Value = new DateTime(2015, 1, 1, 8, 15, 0); 
     wsContent.Cells["D3"].Value = new DateTime(2015, 1, 1, 15, 15, 0); 
     wsContent.Cells["D4"].Value = new DateTime(2015, 1, 2, 8, 15, 0); 
     wsContent.Cells["D5"].Value = new DateTime(2015, 1, 3, 8, 15, 0); 
     wsContent.Cells["D6"].Value = new DateTime(2015, 1, 3, 15, 15, 0); 
     wsContent.Cells["D7"].Value = new DateTime(2015, 1, 3, 20, 15, 0); 

     const int dataRow = 7; 

     const string FORMATDATE = "m/d/yy h:mm;@"; 
     wsContent.Cells[2, 4, dataRow, 4].Style.Numberformat.Format = FORMATDATE; 

     //var chartPressure = wsPressure.Drawings.AddChart("PressureChart", eChartType.Line); 
     var chartPressure = wsPressure.Drawings.AddChart("PressureChart", eChartType.XYScatterLines); 
     chartPressure.SetSize(1280, 1024); 

     //var serie1 = (ExcelLineChartSerie)chartPressure.Series.Add("=Content!$A$2:$A$" + dataRow, "=Content!$D$2:$D$" + dataRow); 
     var serie1 = (ExcelScatterChartSerie)chartPressure.Series.Add(wsContent.Cells[2, 1, dataRow, 1], wsContent.Cells[2, 4, dataRow, 4]); 
     serie1.Header = wsContent.Cells[1, 1].Value.ToString(); 

     pck.Save(); 
    } 
} 
+0

我一回到項目就看看! – Sascha 2015-01-27 12:04:43