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



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

例如,如果我总共有 2 条记录,第一条在 01/01/2018 上,第二条在 10/01/2018 上,我将没有介于两者之间的所有日期的列。

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

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

法典

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

默认情况下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 属性控制,可以禁用。

最新更新