使用ClosedXML

时间:2018-04-24 17:34:01

标签: c# excel closedxml

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

Error when opening excel file

以下是我点击Yes时的情况。它正在删除我的数据透视表。

Excel removing unreadable content

我的数据透视表正在从根据TFS Changesets的历史记录创建的表中获取数据。变更集设置为IEnumerable<Changeset>,然后转换为包含列标题的DataTable对象。

然后从DataTable创建一个表,PivotTablepublic 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

我按照他们的wiki上找到的example进行了操作,但是我的实现会出现这些错误。我的问题和示例之间的唯一区别是,我从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; }

type FakeType = {}
type aFunc = string => number

const b: aFunc = () => 1
const a: FakeType = b.whatTheHeck // Flow makes "whatTheHeck" any type

2 个答案:

答案 0 :(得分:2)

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

pivotTable.Values.Add("somefield");

答案 1 :(得分:1)

我知道我对此事有些迟了,但是如果以后有人尝试这样做,我的解决方法如下。

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

然后添加ColumnLabelRowLabel等。