我使用EPPlus和C#创建一个Excel文档。在内容工作表中,我有几行包含日期时间和值。然后我使用以下代码创建图表:
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
此处有问题的数据是01/01/2015和01/03/2015。特别是最后一个很难,因为中间的价值完全失去了。
答案 0 :(得分:0)
问题在于excel中的折线图默认情况下会尝试确定它的x轴类型,并得出结论,它是一个Date类型,在你的情况下只有一半。然后,如果您将其更改为" Text"在轴选项下,它会将所有内容视为类别并包含时间组件。请注意,这不会将它们与#34;正确地隔开#34;按日期/时间差异,所以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();
}
}