使用 ClosedXML 创建数据透视表 table
Creating pivot table using ClosedXML
我正在尝试使用 ClosedXML V0.91.1 创建数据透视表 table,但我的 excel 文件内容不可读,然后 excel 工作簿删除单击下面的 Yes
时我的支点 table。
下面是我点击 Yes
时的显示。它正在删除我的支点 table.
我的数据透视表 Table 正在从根据 TFS Changesets 的历史记录创建的 table 中获取数据。变更集设置为 IEnumerable<Changeset>
,然后转换为 DataTable
object,其中包括列标题。
然后从 DataTable
创建 table,这是 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
作为 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());
我遵循了在他们的 wiki 上找到的 example,但它在我的实施中给出了这些错误。我的问题和示例之间的唯一区别是,我从 DataTable
获取 Pivot Table 的源代码,并且我只在我的 Pivot [=] 中将值插入 RowLabels
53=].
如果有帮助,这就是我将 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 中的枢轴 table 应该至少有一个值字段。
pivotTable.Values.Add("somefield");
我知道我在这方面有点晚了,但如果以后有人尝试这样做,我的解决方案如下。
IXLPivotTable xlPvTable = TargetWorksheet.PivotTables.Add(
"PivotTable123",
TargetWorksheet.Cell(1, 1),
SourceWorksheet.Range(1, 1, MainData.Rows.Count, MainData.Columns.Count)
);
然后添加 ColumnLabel
和 RowLabel
等..
我正在尝试使用 ClosedXML V0.91.1 创建数据透视表 table,但我的 excel 文件内容不可读,然后 excel 工作簿删除单击下面的 Yes
时我的支点 table。
下面是我点击 Yes
时的显示。它正在删除我的支点 table.
我的数据透视表 Table 正在从根据 TFS Changesets 的历史记录创建的 table 中获取数据。变更集设置为 IEnumerable<Changeset>
,然后转换为 DataTable
object,其中包括列标题。
然后从 DataTable
创建 table,这是 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
作为 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());
我遵循了在他们的 wiki 上找到的 example,但它在我的实施中给出了这些错误。我的问题和示例之间的唯一区别是,我从 DataTable
获取 Pivot Table 的源代码,并且我只在我的 Pivot [=] 中将值插入 RowLabels
53=].
如果有帮助,这就是我将 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 中的枢轴 table 应该至少有一个值字段。
pivotTable.Values.Add("somefield");
我知道我在这方面有点晚了,但如果以后有人尝试这样做,我的解决方案如下。
IXLPivotTable xlPvTable = TargetWorksheet.PivotTables.Add(
"PivotTable123",
TargetWorksheet.Cell(1, 1),
SourceWorksheet.Range(1, 1, MainData.Rows.Count, MainData.Columns.Count)
);
然后添加 ColumnLabel
和 RowLabel
等..