EPPlus数据透视表/图表

我一直在使用EPPlus for .net一段时间,但仅用于简单的数据操作。 是否有任何关于如何使用它来创建数据透视表/图表的示例? 它似乎支持它,因为我可以在intellisense中看到数据透视表,但只是不确定语法。

我只能在提供的样本中找到饼图/条形图。

我从蒂姆的答案中提出了类似的解决方案。 首先,我定义了一个简单的接口,我将其用作导出方法的一部分:

public interface IPivotTableCreator { void CreatePivotTable( OfficeOpenXml.ExcelPackage pkg, // reference to the destination book string tableName, // "tab" name used to generate names for related items string pivotRangeName); // Named range in the Workbook refers to data } 

然后我实现了一个包含变量值和过程代码的简单类来完成工作:

 public class SimplePivotTable : IPivotTableCreator { List _GroupByColumns; List _SummaryColumns; ///  /// Constructor ///  public SimplePivotTable(string[] groupByColumns, string[] summaryColumns) { _GroupByColumns = new List(groupByColumns); _SummaryColumns = new List(summaryColumns); } ///  /// Call-back handler that builds simple PivatTable in Excel /// http://stackoverflow.com/questions/11650080/epplus-pivot-tables-charts ///  public void CreatePivotTable(OfficeOpenXml.ExcelPackage pkg, string tableName, string pivotRangeName) { string pageName = "Pivot-" + tableName.Replace(" ", ""); var wsPivot = pkg.Workbook.Worksheets.Add(pageName); pkg.Workbook.Worksheets.MoveBefore(PageName, tableName); var dataRange = pkg.Workbook./*Worksheets[tableName].*/Names[pivotRangeName]; var pivotTable = wsPivot.PivotTables.Add(wsPivot.Cells["C3"], dataRange, "Pivot_" + tableName.Replace(" ", "")); pivotTable.ShowHeaders = true; pivotTable.UseAutoFormatting = true; pivotTable.ApplyWidthHeightFormats = true; pivotTable.ShowDrill = true; pivotTable.FirstHeaderRow = 1; // first row has headers pivotTable.FirstDataCol = 1; // first col of data pivotTable.FirstDataRow = 2; // first row of data foreach (string row in _GroupByColumns) { var field = pivotTable.Fields[row]; pivotTable.RowFields.Add(field); field.Sort = eSortType.Ascending; } foreach (string column in _SummaryColumns) { var field = pivotTable.Fields[column]; ExcelPivotTableDataField result = pivotTable.DataFields.Add(field); } pivotTable.DataOnRows = false; } } 

然后我创建了一个SimplePivotTable创建者类的实例:

 IPivotTableCreator ptCreator = new SimplePivotTable( new string[] { "OrganizationTitle", "GroupingTitle", "DetailTitle" }, /* collapsible rows */ new string[] { "Baseline", "Increase", "Decrease", "NetChange", "CurrentCount"}); /* summary columns */ 

我有一个第三类,它目前公开了六种不同的方法来获取一个或多个数据集(通常是List对象),并将每个数据集转换为具有数据命名范围的数据工作表。 现在,我正在调整这些导出方法,以允许我为任何/所有这些导出方法生成数据透视表。 他们都这样做:

 OfficeOpenXml.ExcelPackage pkg = new ExcelPackage(); ExportCollectionToExcel(pkg, tableName, dataset); // Create worksheet filled with data // Creates a NamedRange of data ptCreator.CreatePivotTable(pkg, tableName, GetPivotRangeName(tableName)); 

通过使用界面,我留下了更多机会(我认为),例如,为多个工作表生成不同的数据透视表。 我的基本SimplePivotTable类仅用于具有一些特定假设的单个表,但是将配置数据放入键入表名的字典中并不困难。

希望能帮助别人。

这是我最近创建的一个支点的代码,也许它确实有帮助:

 DataTable table = getDataSource(); FileInfo fileInfo = new FileInfo(path); var excel = new ExcelPackage(fileInfo); var wsData = excel.Workbook.Worksheets.Add("Data-Worksheetname"); var wsPivot = excel.Workbook.Worksheets.Add("Pivot-Worksheetname"); wsData.Cells["A1"].LoadFromDataTable(table, true, OfficeOpenXml.Table.TableStyles.Medium6); if (table.Rows.Count != 0) { foreach (DataColumn col in table.Columns) { // format all dates in german format (adjust accordingly) if (col.DataType == typeof(System.DateTime)) { var colNumber = col.Ordinal + 1; var range = wsData.Cells[2, colNumber, table.Rows.Count + 1, colNumber]; range.Style.Numberformat.Format = "dd.MM.yyyy"; } } } var dataRange = wsData.Cells[wsData.Dimension.Address.ToString()]; dataRange.AutoFitColumns(); var pivotTable = wsPivot.PivotTables.Add(wsPivot.Cells["A3"], dataRange, "Pivotname"); pivotTable.MultipleFieldFilters = true; pivotTable.RowGrandTotals = true; pivotTable.ColumGrandTotals = true; pivotTable.Compact = true; pivotTable.CompactData = true; pivotTable.GridDropZones = false; pivotTable.Outline = false; pivotTable.OutlineData = false; pivotTable.ShowError = true; pivotTable.ErrorCaption = "[error]"; pivotTable.ShowHeaders = true; pivotTable.UseAutoFormatting = true; pivotTable.ApplyWidthHeightFormats = true; pivotTable.ShowDrill = true; pivotTable.FirstDataCol = 3; pivotTable.RowHeaderCaption = "Claims"; var modelField = pivotTable.Fields["Model"]; pivotTable.PageFields.Add(modelField); modelField.Sort = OfficeOpenXml.Table.PivotTable.eSortType.Ascending; var countField = pivotTable.Fields["Claims"]; pivotTable.DataFields.Add(countField); var countryField = pivotTable.Fields["Country"]; pivotTable.RowFields.Add(countryField); var gspField = pivotTable.Fields["GSP / DRSL"]; pivotTable.RowFields.Add(gspField); var oldStatusField = pivotTable.Fields["Old Status"]; pivotTable.ColumnFields.Add(oldStatusField); var newStatusField = pivotTable.Fields["New Status"]; pivotTable.ColumnFields.Add(newStatusField); var submittedDateField = pivotTable.Fields["Claim Submitted Date"]; pivotTable.RowFields.Add(submittedDateField); submittedDateField.AddDateGrouping(OfficeOpenXml.Table.PivotTable.eDateGroupBy.Months | OfficeOpenXml.Table.PivotTable.eDateGroupBy.Days); var monthGroupField = pivotTable.Fields.GetDateGroupField(OfficeOpenXml.Table.PivotTable.eDateGroupBy.Months); monthGroupField.ShowAll = false; var dayGroupField = pivotTable.Fields.GetDateGroupField(OfficeOpenXml.Table.PivotTable.eDateGroupBy.Days); dayGroupField.ShowAll = false; excel.Save();