首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ClosedXML创建枢轴表

使用ClosedXML创建枢轴表
EN

Stack Overflow用户
提问于 2018-04-24 17:34:00
回答 2查看 3.5K关注 0票数 3

我正在尝试使用ClosedXML V0.91.1创建一个数据透视表,但是我的excel文件有不可读的内容,然后excel工作簿在单击下面的Yes时移除了我的枢轴表。

下面是当我点击Yes的时候。它在移走我的枢轴表。

我的数据透视表是从一个从TFS 变化集历史创建的表中获取数据。变更集被设置为IEnumerable<Changeset>,然后将其转换为包含列标题的DataTable对象。

然后从DataTable ( PivotTable的来源)创建一个表。这是我正在使用的代码:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
    var header = sumTable.Range(1, 1, 1, 6); // A1 to F1
    var range = sumTable.DataRange;
    var dataRange = sumSheet.Range(header.FirstCell(), range.LastCell());

我跟踪了在他们的wiki上找到的示例,但是它给出了实现中的那些错误。我的问题和示例之间唯一的区别是,我从一个DataTable中获取了数据透视表的源代码,并且我只将值插入到数据透视表中的RowLabels中。

如果有用的话,我就是这样将IEnumerable<Changeset>转换成DataTable

代码语言:javascript
运行
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-25 09:20:03

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

代码语言:javascript
运行
复制
pivotTable.Values.Add("somefield");
票数 4
EN

Stack Overflow用户

发布于 2020-09-17 11:11:57

我知道我在这个问题上有点晚了,但如果其他人将来试图这么做,我的解决方案如下。

代码语言:javascript
运行
复制
IXLPivotTable xlPvTable = TargetWorksheet.PivotTables.Add(
    "PivotTable123", 
    TargetWorksheet.Cell(1, 1), 
    SourceWorksheet.Range(1, 1, MainData.Rows.Count, MainData.Columns.Count)
);

然后添加ColumnLabelRowLabel等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50007717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档