「Java」Excelでピボットテーブルを作成する方法

Excel の**ピボットテーブルを使用すると、ユーザーは大量のデータを計算し、分類し、簡潔な表形式にまとめることができるため、報告や 分析**がより**簡単**になります。Excelの最も強力なツールの1つとして、静的なデータを多角的に表示する機能をユーザーに提供します。本記事では、無料の[Free Spire.XLS for Java](https://jp.e-iceblue.com/introduce/free-spire-excel-for-java.html)を使用して、Javaで**Excelのピボットテーブルを作成する方法**、**ピボットテーブルのデータを分類する方法**、および**ピボットテーブルでその他の設定を行う方法**について紹介します。
- **[Excelでピボットテーブルを作成する](#excelでピボットテーブルを作成する)**
- **[ピボットテーブルを列の値で並べ替える](#ピボットテーブルを列の値で並べ替える)**
- **[ピボットテーブルの行を展開または折りたたむ](#ピボットテーブルの行を展開または折りたたむ)**
- **[ピボットテーブルでその他の設定を行う](#ピボットテーブルでその他の設定を行う)**

## 【依存関係の追加】

この方法は、無料のFree Spire.XLS for Javaが必要ですので、先にjarファイルをインポートしてください。

### 1. Maven

Maven を使用している場合、プロジェクトの pom.xml ファイルに以下のコードを追加することで、簡単にアプリケーションに JAR ファイルをインポートすることができます。

```XML
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls.free</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>
```

### 2. 公式サイトよりJarファイルをダウンロード

まず、[Free Spire.XLS for Java](https://jp.e-iceblue.com/download/free-spire-excel-for-java.html) の公式サイトよりzipファイルをダウンロードします。zipファイルを解凍し、libフォルダの下にあるSpire.Xls.jarファイルを依存関係としてプロジェクトにインポートしてください。

## Excelでピボットテーブルを作成する

以下は、Spire.XLS for Javaを使用して、既存のExcelファイルのデータを基にピボットテーブルを作成する手順です。

- **Workbook**クラスのオブジェクトを作成します。
- **Workbook.loadFromFile()** メソッドを使用して、Excelファイルを読み込みます。
- **Workbook.getWorksheets().get()** メソッドを使用して、指定したワークシートを取得します。
- **Worksheet.getRange().get()** メソッドを使用してデータソースの範囲を選択し、**Workbook.PivotCaches.add()** メソッドを使用して **PivotCachesCollection** に範囲を追加して **PivotCache** クラスのオブジェクトを返します。
- ワークシートにピボットテーブルを追加し、**Worksheet.getPivotTables().add()** メソッドを使用して場所とキャッシュを設定します。
- 「地域」と「製品」のフィールドを行の領域にドラッグします。
- 「購入数」と「購入金額」のフィールドを数値領域に追加します。
- **Workbook.saveToFile()** メソッドを使用して、結果ドキュメントを保存します。

**Java**

```Java
import com.spire.xls.*;

public class createPivotTable {

    public static void main(String[] args) {

        //Workbookクラスのオブジェクトを作成する
        Workbook workbook = new Workbook();

        //Excelファイルを読み込む
        workbook.loadFromFile("C:/Sample.xlsx");

        //最初のワークシートを取得する
        Worksheet sheet = workbook.getWorksheets().get(0);

        //データソースの範囲を選択する
        CellRange dataRange = sheet.getRange().get("C1:F11");
        PivotCache cache = workbook.getPivotCaches().add(dataRange);

        //ワークシートにピボットテーブルを追加し、その位置とキャッシュを設定する
        PivotTable pt = sheet.getPivotTables().add("ピボットテーブル", sheet.getRange().get("H3"), cache);

        //「地域」と「製品」フィールドを行領域にドラッグする
        PivotField regionField =(PivotField)pt.getPivotFields().get("地域");
        regionField.setAxis(AxisTypes.Row);
        pt.getOptions().setRowHeaderCaption("地域");
        PivotField productField = (PivotField)pt.getPivotFields().get("製品");
        productField.setAxis(AxisTypes.Row);

        //数値エリアに「購入数」「金額」フィールドを追加する
        pt.getDataFields().add(pt.getPivotFields().get("購入数"), "総購入数", SubtotalTypes.Sum);
        pt.getDataFields().add(pt.getPivotFields().get("金額"), "合計金額", SubtotalTypes.Sum);

        //ピボットテーブルに組み込みのスタイルを適用する
        pt.setBuiltInStyle(PivotBuiltInStyles.PivotStyleMedium11);

        //列の幅を設定する
        sheet.setColumnWidth(8,16);
        sheet.setColumnWidth(9,16);
        sheet.setColumnWidth(10,16);

        //ドキュメントを保存する
        workbook.saveToFile("ピボットテーブルの作成.xlsx", ExcelVersion.Version2016);
    }
}
```

### 【結果のExcelワークブック】

![Excelでピボットテーブルを作成する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/bfd39338-3038-5f40-a357-63e5e87cce4f.png)

## ピボットテーブルを列の値で並べ替える

**PivotTable.getPivotFields().get()** メソッドを使用して特定のフィールドにアクセスし、**PivotField.setSortType()** メソッドを使用してその分類型を設定することができます。
次のコード例では、ピボットテーブルを「地域」フィールドの列の値で並べ替える方法を示しています。

**Java**

```Java
import com.spire.xls.*;
import com.spire.xls.core.IPivotDataField;

public class sortPivotTableByRow {

    public static void main(String[] args) {

        //Workbookクラスのオブジェクトを作成する
        Workbook workbook = new Workbook();

        //Excelファイルを読み込む
        workbook.loadFromFile("C:/Sample.xlsx");

        //最初のワークシートを取得する
        Worksheet sheet = workbook.getWorksheets().get(0);

        //データソースの範囲を選択する
        CellRange dataRange = sheet.getRange().get("A1:F11");
        PivotCache cache = workbook.getPivotCaches().add(dataRange);

        //ワークシートにピボットテーブルを追加し、その位置とキャッシュを設定する
        PivotTable pt = sheet.getPivotTables().add("ピボットテーブル", sheet.getRange().get("H3"), cache);

        //「地域」「注文番号」「製品」フィールドを行にドラッグする
        PivotField regionField =(PivotField)pt.getPivotFields().get("地域");
        regionField.setAxis(AxisTypes.Row);
        pt.getOptions().setRowHeaderCaption("地域");

        PivotField idField = (PivotField)pt.getPivotFields().get("注文番号");
        idField.setAxis(AxisTypes.Row);

        PivotField productField = (PivotField)pt.getPivotFields().get("製品");
        productField.setAxis(AxisTypes.Row);

        //数値エリアに「購入数」「金額」フィールドを追加する
        pt.getDataFields().add(pt.getPivotFields().get("購入数"), "総購入数", SubtotalTypes.Sum);
        pt.getDataFields().add(pt.getPivotFields().get("金額"), "合計金額", SubtotalTypes.Sum);

        //ピボットテーブルに組み込みのスタイルを適用する
        pt.setBuiltInStyle(PivotBuiltInStyles.PivotStyleMedium11);

        //データを計算する
        pt.calculateData();

        //「注文番号」フィールドの列のデータを並べ替える
        idField.setSortType(PivotFieldSortType.Descending);

        //列の幅を設定する
        sheet.setColumnWidth(8,16);
        sheet.setColumnWidth(9,16);
        sheet.setColumnWidth(10,16);

        //ドキュメントを保存する
        workbook.saveToFile("データを行で並べ替える.xlsx", ExcelVersion.Version2016);
    }
}
```

【結果のExcelワークブック】

![ピボットテーブルを列の値で並べ替える](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/e2aac5f6-15f3-1105-3b53-ee832adee98b.png)

## ピボットテーブルの行を展開または折りたたむ

特定のピボットテーブルの下にある詳細を折りたたむには、**PivotField.hideItemDetail(String, Boolean)** メソッドを使用して 2 番目のパラメータを true に設定し、詳細を表示するには、同じメソッドを使用して 2 番目のパラメータを false に設定してください。

**Java**

```Java
import com.spire.xls.*;

public class collapseRows {

    public static void main(String[] args) {

        //Workbookクラスのオブジェクトを作成する
        Workbook workbook = new Workbook();

        //Excelファイルを読み込む
        workbook.loadFromFile("C:/Sample.xlsx");

        //最初のワークシートを取得する
        Worksheet sheet = workbook.getWorksheets().get(0);

        //データソースの範囲を選択する
        CellRange dataRange = sheet.getRange().get("C1:F11");
        PivotCache cache = workbook.getPivotCaches().add(dataRange);

        //ワークシートにピボットテーブルを追加し、その位置とキャッシュを設定する
        PivotTable pt = sheet.getPivotTables().add("ピボットテーブル", sheet.getRange().get("H3"), cache);

        //「地域」と「製品」フィールドを行領域にドラッグする
        PivotField regionField =(PivotField)pt.getPivotFields().get("地域");
        regionField.setAxis(AxisTypes.Row);
        pt.getOptions().setRowHeaderCaption("地域");
        PivotField productField = (PivotField)pt.getPivotFields().get("製品");
        productField.setAxis(AxisTypes.Row);

        //「地域」フィールドの項目詳細情報を非表示にする
        regionField.hideItemDetail("西部地域",true);
        regionField.hideItemDetail("東部地域",true);

        //数値エリアに「購入数」「金額」フィールドを追加する
        pt.getDataFields().add(pt.getPivotFields().get("購入数"), "総購入数", SubtotalTypes.Sum);
        pt.getDataFields().add(pt.getPivotFields().get("金額"), "合計金額", SubtotalTypes.Sum);

        //ピボットテーブルに組み込みのスタイルを適用する
        pt.setBuiltInStyle(PivotBuiltInStyles.PivotStyleMedium11);

        //データを計算する
        pt.calculateData();

        //列の幅を設定する
        sheet.setColumnWidth(8,16);
        sheet.setColumnWidth(9,16);
        sheet.setColumnWidth(10,16);

        //ドキュメントを保存する
        workbook.saveToFile("行の折りたたみ.xlsx", ExcelVersion.Version2016);
    }
}
```

【結果のExcelワークブック】

![ピボットテーブルの行を展開または折りたたむ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/2a0da84d-3458-f55d-51db-1bbeadc5bd2d.png)

## ピボットテーブルでその他の設定を行う

ピボットテーブルの表示更新・データソースの更新を行います。

```Java
PivotTable.getCache().isRefreshOnLoad(true);
```

小計を表示します。

```Java
PivotTable.isShowSubtotals(true);
```

データソースを変更します。

```Java
PivotTable.changeDataSource();
```

フィルターを追加します。

```Java
PivotReportFilter filter = new PivotReportFilter(String fieldName);
PivotTable.getReportFilters().add(filter);
```

> **本記事では、Spire.XLS for Javaを使用してExcelのピボットテーブルを扱う方法について説明します。ピボットテーブルやSpire.XLSについてまだ質問がある場合や、もっと詳しく知りたい場合は、[Spire.XLS Forum](https://www.e-iceblue.com/forum/spire-xls-f4.html)を参照してください。**