officeopenxml ejemplos create c# asp.net epplus

ejemplos - excelpackage save file c#



Tablas/gráficos dinámicos EPPlus (2)

Aquí está el código de un pivote que he creado recientemente, tal vez sí ayuda:

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();

He estado usando EPPlus para .net por un tiempo pero solo para la manipulación simple de datos. ¿Hay algún ejemplo sobre cómo usarlo para crear tablas / gráficos dinámicos? Parece admitirlo, ya que puedo ver la tabla dinámica en la inteligencia, pero no estoy seguro de la sintaxis.

Solo pude encontrar los gustos de los gráficos circulares / de barras en las muestras proporcionadas.


He producido una solución similar de la respuesta de Tim. Primero, definí una interfaz simple que uso como parte de mis métodos de exportación:

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 }

Luego implementé una clase simple que contiene los valores de las variables y el código de procedimiento para realizar el trabajo:

public class SimplePivotTable : IPivotTableCreator { List<string> _GroupByColumns; List<string> _SummaryColumns; /// <summary> /// Constructor /// </summary> public SimplePivotTable(string[] groupByColumns, string[] summaryColumns) { _GroupByColumns = new List<string>(groupByColumns); _SummaryColumns = new List<string>(summaryColumns); } /// <summary> /// Call-back handler that builds simple PivatTable in Excel /// http://.com/questions/11650080/epplus-pivot-tables-charts /// </summary> 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; } }

Luego creo una instancia de mi clase de creador SimplePivotTable :

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

Tengo una tercera clase que actualmente expone alrededor de seis métodos diferentes para tomar uno o más conjuntos de datos (generalmente objetos de Lista) y convertir cada uno de los conjuntos de datos en una hoja de trabajo de datos con un rango con nombre para los datos. Ahora, estoy adaptando esos métodos de exportación para que me permita generar tablas dinámicas para cualquiera o todos esos métodos de exportación. Todos hacen algo como esto:

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));

Al usar una interfaz, dejo abiertas más oportunidades (creo) para generar, por ejemplo, una tabla dinámica diferente para varias hojas. Mi clase básica SimplePivotTable solo se usó para una sola tabla con algunas suposiciones específicas, pero no sería difícil colocar los datos de configuración en un diccionario con los nombres de las tablas.

Espero que ayude a alguien.