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();
- 如何在使用asp.net 4.0创建的网站上传超过2 MB的内容
- 如何在asp.net中实现“Access-Control-Allow-Origin”标头
- 使用asp.net中的webbrowser将html页面转换为图像花费太多时间来生成重型html页面的图像
- DataTable不包含AsEnumerable的定义
- 自定义电子邮件确认令
- 用于执行JS时ScriptManager和ClientScript之间的差异?
- 通过静态对象的静态属性访问asp.net会话变量是否安全?
- 如何使用ASP.NET检测页面关闭事件
- 使用www-form-urlencoded发送时,为什么我的JSON字符串在服务器端为null?