2012-07-25 6 views
17

私はEPPlusをしばらく使っていますが、単純なデータ操作のためだけです。 ピボットテーブル/チャートの作成に使用する例がありますか? インテリセンスでPivotTableを見ることができますが、構文についてはわかりません。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

+2

Page、Row、Column、Dataの各フィールドにどのような影響がありますか? –

+0

素晴らしい例 - ありがとう! pivotTable.DataFieldsにスタイルナンバーフォーマットを設定する方法私は数字を示しており、フォーマット "#、## 0.00"を適用したいと思います。 –

25

私はティムの回答から同様のソリューションを生み出してきました。

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

:その後、私は仕事をするために変数値と手続きコードを保持する単純なクラスを実装

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 
} 

:まず、私は私のエクスポート方法の一部として使用するシンプルなインターフェイスを定義しそれから私は私のSimplePivotTableクリエータクラスのインスタンスを作成します。

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

私は現在、一または-以上のデータセット(usuaを取るために約6種類の方法を公開する第三のクラスを持っていますlly Listオブジェクト)、各データセットをデータの名前付き範囲のワークシートに変換します。今、これらのエクスポートメソッドを適用して、これらのエクスポートメソッドのすべてまたはすべてのピボットテーブルを生成できるようにしました。彼らはすべてがこのような何か:インターフェースを使用することにより

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 –

+0

ピボットテーブル内のセルのHorizo​​ntalAlignmentを変更する方法を知っていますか?私はそれらを中心にしたいが、通常のワークシート機能はピボットテーブルのセルで動作しないようです。 – kadzu