2012-07-25 97 views
17

我一直在使用EPPlus for .net一段時間,但僅用於簡單的數據操作。 有沒有什麼地方有關如何使用它來創建數據透視表/圖表的例子? 它似乎支持它,因爲我可以在intellisense中看到數據透視表,但只是不確定語法。EPPlus數據透視表/圖表

我只能在提供的樣本中找到餅圖/條形圖。

回答

14

下面是我最近建立了一個支點的代碼,也許它確實幫助:

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

我會研究它,謝謝。 – user1468537 2012-07-25 13:35:04

+2

將頁面,行,列和數據分配給字段有什麼作用? – 2016-10-11 18:22:58

+0

很好的例子 - 謝謝!任何想法如何在pivotTable.DataFields上設置樣式Numberformat?我正在顯示號碼,並希望應用格式「#,## 0.00」。 – 2017-07-20 18:58:34

25

我已經從生產添的回答類似的解決方案。首先,我定義了一個簡單的界面,我爲我的出口方法的一部分使用:

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

然後,我創建我的SimplePivotTable創類的一個實例:

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

我還有第三類,目前公開有關六種不同的方法採取一個或更多的數據集(usua列出對象),並將每個數據集轉換爲數據的工作表,併爲數據命名一個範圍。現在,我正在調整這些導出方法以允許爲任何/所有這些導出方法生成數據透視表。他們都做這樣的事情:

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類僅用於具有一些特定假設的單個表,但將配置數據放入與表名關鍵字的字典並不困難。

希望能幫助別人。

+0

當我使用你的(稍作修改)代碼時,編輯Σ字段會使Excel崩潰? 請在這裏看到我的帖子:http://epplus.codeplex.com/workitem/14798 – 2013-01-17 10:07:24

+0

你知道如何更改數據透視表中單元格的Horizo​​ntalAlignment?我希望將它們居中,但正常的工作表函數似乎不能在數據透視表的單元格中工作。 – kadzu 2018-01-23 18:33:27