Я пытаюсь создать сводную таблицу с использованием ClosedXML V0.91.1, но у меня продолжают возникать проблемы с моим файлом Excel, имеющим нечитаемый контент, а затем в книге Excel, удаляющей мою сводную таблицу при нажатии Yes
ниже.
Ниже показано, когда я нажимаю Yes
.Он удаляет мою сводную таблицу.
Моя сводная таблица получает данные из таблицы, созданной из истории TFS Changesets .Наборы изменений устанавливаются в IEnumerable<Changeset>
, который затем преобразуется в объект DataTable
, который включает заголовки столбцов.
Затем создается таблица из DataTable
, который является источником PivotTable
,Это код, который я использую:
public bool CreateReport(IEnumerable<Changeset> changesets)
{
workbook = new XLWorkbook();
var sumSheet= workbook.Worksheets.Add("Summary");
// Converting IEnumerable<Changeset> into DataTable
DataTable changesetTable = ConvertToDataTable(changesets);
// Table
var sumTable = sumSheet.Cell(1, 1).InsertTable(changesetTable.AsEnumerable(), "SummaryTable", true);
// Table - Formatting table
tableWithData.Column("A").Cells(firstRow, lastRow).DataType = XLDataType.Number;
tableWithData.Column("C").Cells(firstRow, lastRow).DataType = XLDataType.DateTime;
tableWithData.Column("C").Cells(firstRow, lastRow).Style.DateFormat.Format = "d-MMM-yyy";
sumSheet.Columns().AdjustToContents();
// Pivot Table
var header = sumTable.Range(1, 1, 1, 6); // A1 to F1
var range = sumTable.DataRange;
var dataRange = sumSheet.Range(header.FirstCell(), range.LastCell());
var pivotSheet = workbook.Worksheets.Add("History Report");
var pivotTable = pivotSheet.PivotTables.AddNew("PivotTable", pivotSheet.Cell(1, 1), dataRange);
// Pivot Table - Formatting table
pivotTable.ShowPropertiesInTooltips = false;
pivotTable.RepeatRowLabels = false;
pivotTable.ShowGrandTotalsColumns = false;
pivotTable.ShowGrandTotalsRows = false;
pivotTable.ShowEmptyItemsOnRows = true;
pivotTable.ShowEmptyItemsOnColumns = true;
pivotTable.ShowExpandCollapseButtons = false;
pivotTable.Layout = XLPivotLayout.Tabular;
pivotTable.RowLabels.Add("Changeset");
pivotTable.RowLabels.Add("Committer");
pivotTable.RowLabels.Add("Date");
pivotTable.RowLabels.Add("Comment");
pivotTable.RowLabels.Add("File Changes");
pivotTable.RowLabels.Add("Source");
// Go off and save the workbook.
bool saved = SaveFile();
return saved;
}
Мне кажется, проблема в том, как я выбираю dataRange
для источника сводной таблицы.
var header = sumTable.Range(1, 1, 1, 6); // A1 to F1
var range = sumTable.DataRange;
var dataRange = sumSheet.Range(header.FirstCell(), range.LastCell());
Я последовал примеру , найденному в их вики, но он дает эти ошибки в моей реализации.Единственная разница между моей проблемой и примером состоит в том, что я получаю свой источник сводной таблицы из DataTable
, и я только вставляю значения в RowLabels
в моей сводной таблице.
Если этопомогает, вот как я конвертирую IEnumerable<Changeset>
в DataTable
private DataTable ConvertToDataTable(IEnumerable<Changeset> changesets)
{
DataTable table = new DataTable();
table.Columns.Add("Changeset", typeof(int));
table.Columns.Add("Committer", typeof(string));
table.Columns.Add("Date", typeof(DateTime));
table.Columns.Add("Comment", typeof(string));
table.Columns.Add("File Changes", typeof(string));
table.Columns.Add("Source", typeof(string));
foreach(Changeset changeset in changesets) // Loop over all changesets
{
int changesetID = changeset.ChangesetId;
string committer = changeset.CommitterDisplayName;
DateTime creationDate = changeset.CreationDate;
string comment = changeset.Comment;
foreach(Change change in changeset.Changes) // Loop over all Changes in changeset
{
string filename = change.Item.ServerItem.Substring(change.Item.ServerItem.LastIndexOf("/") + 1);
table.Rows.Add(changesetID, committer, creationDate, comment, filename, change.Item.ServerItem);
}
}
return table;
}