在数据透视表上配置其他透视列标题

时间:2018-06-07 14:45:37

标签: c# nreco

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

例如,如果我总共有2条记录,第一条记录是01/01/2018,第二条记录是10/01/2018,我将不会列出所有日期之间的列。

我已经为我的范围中的每个日期添加了空值的记录,但是,这会在结果的顶部添加一个空白行,这是不理想的。

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

代码

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(...);
}

1 个答案:

答案 0 :(得分: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];
}

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

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