【VB.NET】ClosedXML:ピボットテーブル

MEMO
  • この記事は GitHub - ClosedXML - Wiki を参考に書かせていただいたものですが、C# から VB.NET への書き換えをし、英語から日本語へ翻訳しただけでなく、元記事の構成・コード・コメント等を変更している場合もありますのでご了承ください。
  • 現在 ClosedXML のメンテナンスをご担当されている Francois Botha 様からの掲載許可もいただいてます。
  • この記事のコードサンプルについては、Imports ClosedXML.Excel が宣言されていることを前提としています。
  • ClosedXML の作成者について:Francois Botha, Aleksei Pankratev, Manuel de Leon, Amir Ghezelbash
  • ClosedXML のライセンスについて:GitHub - ClosedXML - MIT License
注意

元記事(2018年4月25日付)には下記のように書かれています。by エレン・イースト(当サイトの管理人)

ピボットテーブルのサポートはまだかなり実験的な段階です。
Pivot table support is still very experimental.

 

月ごとの菓子パンの売り上げをピボットテーブルにしてみます。

まず、菓子パン (Pastry) クラスを作成します。

Public Class Pastry
    'プロパティ名がテーブルの列タイトルに使われる
    Public Property 名称 As String
    Public Property 注文数 As Integer
    Public Property 月 As String

    Public Sub New(name As String, amount As Integer, month As Integer)
        Me.名称 = name
        Me.月 = month & "月"
        Me.注文数 = amount
    End Sub
End Class

次に Pastry クラスを使用して売り上げデータのリストを作成します。

Dim pastries = New List(Of Pastry) From
{
  New Pastry("クロワッサン", 150, 4),
  New Pastry("クロワッサン", 250, 5),
  New Pastry("クロワッサン", 134, 6),
  New Pastry("ドーナツ", 250, 4),
  New Pastry("ドーナツ", 225, 5),
  New Pastry("ドーナツ", 210, 6),
  New Pastry("ベアクロウ", 134, 4),
  New Pastry("ベアクロウ", 184, 5),
  New Pastry("ベアクロウ", 124, 6),
  New Pastry("デニッシュ", 394, 4),
  New Pastry("デニッシュ", 190, 5),
  New Pastry("デニッシュ", 221, 6),
  New Pastry("スコーン", 135, 4),
  New Pastry("スコーン", 122, 5),
  New Pastry("スコーン", 243, 6)
}

作成したリストをテーブルとして新規ワークシートに挿入します。

Dim workbook = New XLWorkbook
Dim sheet = workbook.Worksheets.Add("菓子パンの売り上げデータ")

'「菓子パンの売り上げデータ」シートの Cel(1, 1) に菓子パンデータのリストを挿入
Dim table = sheet.Cell(1, 1).InsertTable(pastries, "菓子パンの売り上げデータ", True)

'列幅
'sheet.Columns.AdjustToContents 'コンテンツが日本語の場合は日本語フォントにしておかないと正しく動作しない
sheet.Column(1).Width = 15.5
sheet.Column(2).Width = 10
sheet.Column(3).Width = 7
'「月」の列を右寄せ(タイトル行以外)
sheet.Range(sheet.Cell(2, 3), sheet.Column(3).LastCellUsed) _
    .Style.Alignment.Horizontal=XLAlignmentHorizontalValues.Right

最後に、そのテーブルのデータをソースとして、ピボットテーブルを作成します。

'ピボットテーブル用の新規シートを追加
Dim ptSheet = workbook.Worksheets.Add("ピボットテーブル")

'「菓子パンの売り上げデータ」テーブルのデータを使用してピボットテーブルを作成する
Dim pt = ptSheet.PivotTables.AddNew("ピボットテーブル", ptSheet.Cell(1, 1), table.AsRange)

'ピボットテーブルの行見出しが菓子パンの名称になります
pt.RowLabels.Add("名称") 'プロパティ名と異なるとエラー

'ピボットテーブルの列見出しが月になります
pt.ColumnLabels.Add("月") 'プロパティ名と異なるとエラー

'注文数フィールドの値がテーブルの中身の値になります。
'各行と列の合計がデフォルトの計算方法です
pt.Values.Add("注文数") 'ププロパティ名と異なるとエラー

'列幅
'ptSheet.Columns.AdjustToContents 'コンテンツが日本語の場合は日本語フォントにしておかないと正しく動作しない
ptSheet.Column(1).Width = 15.5
ptSheet.Column(2).Width = 15.5
ptSheet.Column(3).Width = 7
ptSheet.Column(4).Width = 7
ptSheet.Column(5).Width = 7

workbook.SaveAs("D:\test\pivotTable.xlsx")

下図のようなデータテーブルとピボットテーブルが作成されます。

 

「【VB.NET】ClosedXML の使い方」の一覧を表示

コメントの投稿

avatar
  購読する  
通知を受け取る対象