c# - 使用 ClosedXML 创建数据透视表
问题描述
我正在尝试使用 ClosedXML V0.91.1 创建一个数据透视表,但我的 excel 文件不断出现问题,其中包含不可读的内容,然后单击Yes
下方时 excel 工作簿删除了我的数据透视表。
下面是我点击时的显示Yes
。它正在删除我的数据透视表。
我的数据透视表正在从根据 TFS变更集的历史创建的表中获取数据。变更集被设置为 aIEnumerable<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());
我遵循了在他们的 wiki 上找到的示例,但它在我的实现中给出了这些错误。我的问题和示例之间的唯一区别是我从 a 获取数据透视表的来源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;
}
解决方案
如果我没记错的话,ClosedXML 中的数据透视表应该至少有一个值字段。
pivotTable.Values.Add("somefield");
推荐阅读
- xlib - libXm 从小部件获取显示编号
- sql - 将 SQL 中的数据与列中的数据合并
- javascript - 如何将 npm 包中的 JS 文件包含到 Nuxt.js 中的单独页面
- android - 如何通过 android studio 中的 OTG 获取 USB 中存在的文件的创建/删除访问权限?
- akka-stream - 将流操作添加到 Sink
- reactjs - React/Redux AG Grid 未加载数据
- python - 将使用 slic 分割的图像转换为用于抓取
- apache - 代理配置和 Websocket 的问题
- amazon-web-services - 如何根据存储在 DynamoDB 中的日期发送 AWS SNS 移动 SMS 消息
- google-apps-script - 使用 Google Apps 脚本将 Google 表单问题添加到表单的特定部分