2012-07-25 16 views
17

Używam EPPlus dla .net już od dłuższego czasu, ale tylko do prostej manipulacji danymi. Czy są jakieś przykłady dotyczące sposobu tworzenia tabel przestawnych/wykresów? Wydaje się to wspierać, ponieważ widzę tabelę przestawną w systemie intellisense, ale nie mam pewności co do składni.Tabele przestawne/tabele EPPlus

Mogłem tylko znaleźć podobne wykresy kołowe/słupkowe w dostarczonych próbkach.

Odpowiedz

14

Oto kod z czopem Utworzona niedawno, może to nie pomaga:

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

Zajrzę do tego, dzięki. – user1468537

+2

Jaki wpływ ma przypisywanie pól jako strony, wiersza, kolumny i danych? –

+0

Świetny przykład - dzięki! Każdy pomysł, jak ustawić styl Numberformat na pivotTable.DataFields? Pokazuję cyfry i chciałbym zastosować format "#, ## 0.00". –

25

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ś.

+0

Kiedy używam twojego (nieznacznie zmodyfikowanego) kodu, edycja pola cr powoduje awarię programu Excel? Proszę zobaczyć mój post tutaj: http://epplus.codeplex.com/workitem/14798 –

+0

Czy wiesz, jak zmienić HorizontalAlignment komórek w tabeli przestawnej? Chciałbym je wyśrodkować, ale normalne funkcje arkusza roboczego nie działają w komórkach tabeli przestawnej. – kadzu