Mam produkowane podobne rozwiązanie od Tima Answer. Po pierwsze, definiuje prosty interfejs, którego używam jako część moich metod wywóz:
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
}
Potem realizowanego prostą klasę, które posiadają zmienne wartości i kodeks postępowania do pracy:
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;
}
}
potem utworzyć instancję z mojej klasy SimplePivotTable
Autor:
IPivotTableCreator ptCreator = new SimplePivotTable(
new string[] { "OrganizationTitle", "GroupingTitle", "DetailTitle" }, /* collapsible rows */
new string[] { "Baseline", "Increase", "Decrease", "NetChange", "CurrentCount"}); /* summary columns */
mam trzecią klasę, która obecnie eksponuje około sześciu różnych metod w celu wykonania jednego-or-więcej zestawów danych (USUA lli obiektów listy) i przekształcić każdy z zestawów danych w arkusz roboczy danych o nazwanym zakresie dla danych. Teraz dostosowuję te metody eksportu, aby umożliwić generowanie tabel przestawnych dla dowolnych/wszystkich tych metod eksportowania. Wszyscy oni zrobić coś takiego:
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));
Wykorzystując interfejs, zostawiam otwarte więcej możliwości (myślę), aby wygenerować, na przykład, inny stół obrotowy dla wielu arkuszy. Moja podstawowa klasa SimplePivotTable
była właśnie używana dla pojedynczej tabeli z pewnymi określonymi założeniami, ale nie byłoby trudno umieścić dane konfiguracyjne w słowniku z kluczem przypisanym do nazw tabel.
Nadzieję, że pomaga komuś.
Zajrzę do tego, dzięki. – user1468537
Jaki wpływ ma przypisywanie pól jako strony, wiersza, kolumny i danych? –
Świetny przykład - dzięki! Każdy pomysł, jak ustawić styl Numberformat na pivotTable.DataFields? Pokazuję cyfry i chciałbym zastosować format "#, ## 0.00". –