He producido una solución similar de respuesta de Tim. En primer lugar, he definido una interfaz sencilla que utilizo 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
}
Entonces implementado una clase simple que mantenga los valores de las variables y el código de procedimiento para hacer 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://stackoverflow.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;
}
}
a continuación, se crea una instancia de mi clase SimplePivotTable
creador:
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 unos seis métodos diferentes para tener una sola o más conjuntos de datos (usua lly List objects) y convierta 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 permitirme generar Pivot Tables para cualquiera o todos esos métodos de exportación. lo único que 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));
Mediante el uso de una interfaz, dejo más oportunidades abiertas (creo) para generar, por ejemplo, una tabla dinámica diferente para varias hojas. Mi clase básica SimplePivotTable
acaba de usarse para una sola tabla con algunas suposiciones específicas, pero no sería difícil poner los datos de configuración en un diccionario con los nombres de la Tabla.
Espero que ayude a alguien.
Lo revisaré, gracias. – user1468537
¿Qué efecto tienen los campos de asignación como Página, Fila, Columna y Datos? –
Gran ejemplo - ¡Gracias! ¿Alguna idea de cómo establecer un formato numérico de estilo en pivotTable.DataFields? Estoy mostrando números y me gustaría aplicar el formato "#, ## 0.00". –