Настройте дополнительные заголовки столбцов сводной таблицы в сводной таблице

Я использую библиотеку NReco PivotData для поворота поля даты, чтобы даты отображались в заголовке горизонтально. Это работает хорошо, однако я хотел бы добавить даты, чтобы заполнить пробелы, чтобы результаты были более полными (по умолчанию библиотека показывает только даты, которые содержатся в записи).

Например, если у меня есть в общей сложности 2 записи, первая на 01.01.2008 г., а вторая на 01.10.2008 г., у меня не будет столбцов для всех промежуточных дат.

Я нашел способ добавить записи для каждой даты в моем диапазоне с нулевыми значениями, однако это добавляет пустую строку в начало результатов, что не является идеальным.

Таким образом, я хотел бы добавить "виртуальные" значения для моего измерения " Дата", чтобы получить более полный набор результатов, показывая столбцы для дат, в которых нет записей.

Код

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 ответ

Решение

По умолчанию 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 и может быть отключено.

Другие вопросы по тегам