使用ClosedXML创建数据透视表

3

我正在尝试使用ClosedXML V0.91.1创建一个数据透视表,但是我的Excel文件出现了无法读取的内容问题,当我点击下面的时,Excel工作簿会删除我的数据透视表。

Error when opening excel file

当我点击“是”时,下面显示的内容会出现。它会删除我的数据透视表。

Excel removing unreadable content

我的数据透视表从一个由TFS 变更集历史创建的表中获取数据。 变更集被设置为 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;
}

一些与您的问题无关的评论 1)对于XLWorkbook,请使用using(var workbook ... 2)不需要DataTable。您可以直接插入IEnumerable<>。 3)不需要headerrangedataRange,您可以将sumTable.AsRange()作为数据透视表源传递。(我必须更新维基百科) - Francois Botha
2个回答

4

如果我没记错的话,在ClosedXML中,数据透视表至少应该有一个值字段。

pivotTable.Values.Add("somefield");

2

我知道我有点晚了,但是如果将来有人尝试做这件事情,我的解决方案如下。

IXLPivotTable xlPvTable = TargetWorksheet.PivotTables.Add(
    "PivotTable123", 
    TargetWorksheet.Cell(1, 1), 
    SourceWorksheet.Range(1, 1, MainData.Rows.Count, MainData.Columns.Count)
);

然后添加列标签(ColumnLabel)行标签(RowLabel)等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接