2

我正在使用 NReco PivotData 库以日期字段为中心,以便日期在标题中水平显示。这很好用,但是,我想添加日期来填补空白,以便结果更完整(默认情况下,库只显示记录中包含的日期)。

例如,如果我总共有 2 条记录,第一条在 2018 年 1 月 1 日,第二条在 2018 年 1 月 1 日,我将不会有介于两者之间的所有日期的列。

我已经通过为我的范围内的每个日期添加带有空值的记录来解决问题,但是,这会在结果的顶部添加一个空白行,这并不理想。

总之,我想为我的日期维度添加“虚拟”值,以便通过显示没有任何条目的日期列来获得更完整的结果集。

代码

using (var package = new ExcelPackage())
{
    var dimensionNames = new string[] { "Id", "Name", "Date", "Hours" };
    var aggregator = new SumAggregatorFactory("Hours");
    var rows = new Dictionary<string, object>()
    {
        { 1, "John Smith", new DateTime(2018, 1, 1), 5 },
        { 2, "John Doe", new DateTime(2018, 1, 10), 10 }
    };
    var pivotData = new PivotData(dimensionNames, aggregator, rows);
    var pivotTable = new PivotTable(new string[] { "Name" }, new string[] { "Date" }, pivotData);

    var worksheet = package.Workbook.Worksheets.Add("Report");
    var tableWriter = new PivotTableExcelWriter(worksheet);
    tableWriter.Write(pivotTable);
    package.SaveAs(...);
}
4

1 回答 1

1

默认情况下PivotData,类在使用索引器访问时为非现有维度键创建新数据点,您可以使用它来创建“空”日期:

for (int i=1; i<=10; i++) {
  // if aggregator for specified keys doesn't exist, it will be added
  var aggr = pivotData[1, "John Smith", new Date(2018, 1, i), 5];
}

(如果您不想在数据透视表中创建额外的行/列,则必须使用除“日期”之外的维度的真实键。您可以从第一个真实数据点获取它们object[] firstEntryKeys = pivotData.First().Key;:)

此行为由PivotData.LazyAdd属性控制,可以禁用。

于 2018-06-07T20:07:11.183 回答