JavaでExcelの円グラフを作成する方法

円グラフは、サークルチャートとも呼ばれ、各成分の全体的な比率を直接グラフ化することができます。円グラフは、抽象的なデータをより素早く、直感的に分析するのに役立ちます。この記事では、Javaで円グラフを作成する方法を紹介します。
> 本記事では、以下の4点を中心に解説します。

- **[円グラフを作成する](#円グラフを作成する)**
- **[分離型円グラフを作成する](#分離型円グラフを作成する)**
- **[1つのスライスを分離した円グラフを作成する](#1つのスライスを分離した円グラフを作成する)**
- **[リンググラフを作成する](#リンググラフを作成する)**

## 【依存関係の追加】
> この方法は、無償の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/introduce/free-spire-excel-for-java.html) の公式サイトよりzipファイルをダウンロードします。zipファイルを解凍し、libフォルダの下にあるSpire.Xls.jarファイルを依存関係としてプロジェクトにインポートしてください。
## 円グラフを作成する
円グラフは通常の円グラフで、1つのデータ系列を円型に表示し、グラフの各部分が異なる項目を表すのに使われます。Spire.XLS for Javaでは、Excelワークシートに円グラフを追加するために、**Worksheet.getCharts().add(ExcelChartType.Pie)** メソッドを提供しています。
> 以下は、円グラフを作成するための詳細な手順です。

- **Workbook**のインスタンスを作成します。
- 指定したワークシートを取得するには、**Workbook.getWorksheets().get(sheetIndex)** メソッドを使用します。
- ワークシートにデータを追加し、Excelのセルの値、スタイル、数値フォーマットを設定します。
- **Worksheet.getCharts().add(ExcelChartType.Pie)** メソッドを使用して、ワークシートに円グラフを追加します。
- **Chart.setDataRange()** メソッドで、チャートのデータ範囲を設定します。
- チャートの位置とタイトルを設定します。
- **Workbook.saveToFile()** メソッドで表ファイルを保存します。
```Java
import com.spire.xls.*;
import com.spire.xls.charts.ChartSerie;
import java.awt.*;

public class pieChart {

    public static void main(String[] args) throws Exception {
        //Workbookを作成する
        Workbook workbook = new Workbook();

        //最初のシートを取得し、その名前を設定する
        Worksheet sheet = workbook.getWorksheets().get(0);
        sheet.setName("円グラフ");

        //指定したセルの値を設定する
        sheet.getCellRange("A1").setValue("オペレーティングシステム");
        sheet.getCellRange("A2").setValue("Linux");
        sheet.getCellRange("A3").setValue("Mac OS");
        sheet.getCellRange("A4").setValue("Windows");
        sheet.getCellRange("A5").setValue("Unix");

        sheet.getCellRange("B1").setValue("ユーザー占有率");
        sheet.getCellRange("B2").setNumberValue(0.08);
        sheet.getCellRange("B3").setNumberValue(0.15);
        sheet.getCellRange("B4").setNumberValue(0.75);
        sheet.getCellRange("B5").setNumberValue(0.02);

        //セルのスタイルを設定する
        sheet.getCellRange("A1:B1").setRowHeight(15);
        sheet.getCellRange("A1").setColumnWidth(28);
        sheet.getCellRange("B1").setColumnWidth(20);
        sheet.getCellRange("A1:B1").getCellStyle().setColor(Color.darkGray);
        sheet.getCellRange("A1:B1").getCellStyle().getExcelFont().setColor(Color.white);
        sheet.getCellRange("A1:B1").getCellStyle().setVerticalAlignment(VerticalAlignType.Center);
        sheet.getCellRange("A1:B1").getCellStyle().setHorizontalAlignment(HorizontalAlignType.Center);

        //セルの数値フォーマットを設定する
        sheet.getCellRange("B2:C5").getCellStyle().setNumberFormat("0%");

        //円グラフを追加する
        Chart piechart = sheet.getCharts().add(ExcelChartType.Pie);

        //チャートのデータ範囲を設定する
        piechart.setDataRange(sheet.getCellRange("B2:B5"));
        piechart.setSeriesDataFromRange(false);

        //チャートの位置を設定する
        piechart.setLeftColumn(4);
        piechart.setTopRow(1);
        piechart.setRightColumn(10);
        piechart.setBottomRow(20);

        //グラフのタイトルを追加し、タイルのフォーマットを設定する
        piechart.setChartTitle("オペレーティングシステムのユーザー分布");
        piechart.getChartTitleArea().isBold(true);
        piechart.getChartTitleArea().setSize(12);

        ChartSerie cs = piechart.getSeries().get(0);
        cs.setCategoryLabels(sheet.getCellRange("A2:A5"));
        cs.setValues(sheet.getCellRange("B2:B5"));
        cs.getDataPoints().getDefaultDataPoint().getDataLabels().hasValue(true);
        piechart.getPlotArea().getFill().setVisible(false);

        //結果のファイルを保存する
        workbook.saveToFile("円グラフ.xlsx", ExcelVersion.Version2016);
        workbook.dispose();

    }
}
```
#### 効果のイメージ図
![2022-07-21_145334.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/b009cc43-5df8-6462-5362-1d6dd0238b6f.png)

## 分離型円グラフを作成する
分離型円グラフは、円グラフからすべてのスライスを取り出して、セクターを別々に表示するために使用されます。
> 分解型円グラフを作成する主な手順は次のとおりです。

- **Workbook**のインスタンスを作成します。
- **Workbook.getWorksheets().get(sheetIndex)** メソッドで、指定したワークシートを取得する。
- ワークシートにデータを追加し、Excelのセルの値、スタイル、数値フォーマットを設定します。
- **Worksheet.getCharts().add(ExcelChartType.PieExploded)** メソッドを使って、ワークシートに分離型円グラフを追加しています。
- **Chart.setDataRange()** メソッドでチャートのデータ範囲を設定します。
- チャートの位置とタイトルを設定する。
- **Workbook.saveToFile()** メソッドでファイルを保存します。
```Java
import com.spire.xls.*;
import com.spire.xls.charts.ChartSerie;
import java.awt.*;

public class separatedPieChart {

    public static void main(String[] args) throws Exception {
        //Workbookを作成する
        Workbook workbook = new Workbook();

        //最初のシートを取得し、その名前を設定する
        Worksheet sheet = workbook.getWorksheets().get(0);
        sheet.setName("円グラフ");

        //指定したセルの値を設定する
        sheet.getCellRange("A1").setValue("オペレーティングシステム");
        sheet.getCellRange("A2").setValue("Linux");
        sheet.getCellRange("A3").setValue("Mac OS");
        sheet.getCellRange("A4").setValue("Windows");
        sheet.getCellRange("A5").setValue("Unix");

        sheet.getCellRange("B1").setValue("ユーザー占有率");
        sheet.getCellRange("B2").setNumberValue(0.08);
        sheet.getCellRange("B3").setNumberValue(0.15);
        sheet.getCellRange("B4").setNumberValue(0.75);
        sheet.getCellRange("B5").setNumberValue(0.02);

        //セルのスタイルを設定する
        sheet.getCellRange("A1:B1").setRowHeight(15);
        sheet.getCellRange("A1").setColumnWidth(28);
        sheet.getCellRange("B1").setColumnWidth(20);
        sheet.getCellRange("A1:B1").getCellStyle().setColor(Color.darkGray);
        sheet.getCellRange("A1:B1").getCellStyle().getExcelFont().setColor(Color.white);
        sheet.getCellRange("A1:B1").getCellStyle().setVerticalAlignment(VerticalAlignType.Center);
        sheet.getCellRange("A1:B1").getCellStyle().setHorizontalAlignment(HorizontalAlignType.Center);

        //セルの数値フォーマットを設定する
        sheet.getCellRange("B2:C5").getCellStyle().setNumberFormat("0%");

        //分離型円グラフを追加する
        Chart piechart = sheet.getCharts().add(ExcelChartType.PieExploded);

        //チャートのデータ範囲を設定する
        piechart.setDataRange(sheet.getCellRange("B2:B5"));
        piechart.setSeriesDataFromRange(false);

        //チャートの位置を設定する
        piechart.setLeftColumn(4);
        piechart.setTopRow(1);
        piechart.setRightColumn(10);
        piechart.setBottomRow(20);

        //グラフのタイトルを追加し、タイルのフォーマットを設定する
        piechart.setChartTitle("オペレーティングシステムのユーザー分布");
        piechart.getChartTitleArea().isBold(true);
        piechart.getChartTitleArea().setSize(12);

        ChartSerie cs = piechart.getSeries().get(0);
        cs.setCategoryLabels(sheet.getCellRange("A2:A5"));
        cs.setValues(sheet.getCellRange("B2:B5"));
        cs.getDataPoints().getDefaultDataPoint().getDataLabels().hasValue(true);
        piechart.getPlotArea().getFill().setVisible(false);

        //結果のファイルを保存する
        workbook.saveToFile("分離型円グラフ.xlsx", ExcelVersion.Version2016);
        workbook.dispose();
    }
}
```
#### 効果のイメージ図
![2022-07-21_145418.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/0fe66a85-0a13-ba03-93ef-c2f9a42c4386.png)

## 1つのスライスを分離した円グラフを作成する
このようなグラフを作るには、円グラフから1つのスライスを切り離すだけでよいのです。
> ここでは、その詳しい手順をご紹介します。

- **Workbook**のインスタンスを作成します。
- **Workbook.getWorksheets().get(sheetIndex)** メソッドで、指定したワークシートを取得します。
- ワークシートにデータを追加し、Excelセルの値、スタイル、数値フォーマットを設定します。
- **Worksheet.getCharts().add(ExcelChartType.Pie)** メソッドを使ってワークシートに円グラフを追加します。
- **Chart.setDataRange()** メソッドでチャートのデータ範囲を設定します。
- チャートの位置とタイトルを設定。
- **Chart.getSeries().get(0).getDataPoints().get(1).getDataFormat().setPercent(20)** メソッドで円グラフから特定の1つのスライスを切り離す。
- **Workbook.saveToFile()** メソッドでファイルを保存します。
```Java
import com.spire.xls.*;
import com.spire.xls.charts.ChartSerie;
import java.awt.*;

public class pieChartWithOneSeparatedSlice {

    public static void main(String[] args) throws Exception {
        //Workbookを作成する
        Workbook workbook = new Workbook();

        //最初のシートを取得し、その名前を設定する
        Worksheet sheet = workbook.getWorksheets().get(0);
        sheet.setName("円グラフ");

        //指定したセルの値を設定する
        sheet.getCellRange("A1").setValue("オペレーティングシステム");
        sheet.getCellRange("A2").setValue("Linux");
        sheet.getCellRange("A3").setValue("Mac OS");
        sheet.getCellRange("A4").setValue("Windows");
        sheet.getCellRange("A5").setValue("Unix");

        sheet.getCellRange("B1").setValue("ユーザー占有率");
        sheet.getCellRange("B2").setNumberValue(0.08);
        sheet.getCellRange("B3").setNumberValue(0.15);
        sheet.getCellRange("B4").setNumberValue(0.75);
        sheet.getCellRange("B5").setNumberValue(0.02);

        //セルのスタイルを設定する
        sheet.getCellRange("A1:B1").setRowHeight(15);
        sheet.getCellRange("A1").setColumnWidth(28);
        sheet.getCellRange("B1").setColumnWidth(20);
        sheet.getCellRange("A1:B1").getCellStyle().setColor(Color.darkGray);
        sheet.getCellRange("A1:B1").getCellStyle().getExcelFont().setColor(Color.white);
        sheet.getCellRange("A1:B1").getCellStyle().setVerticalAlignment(VerticalAlignType.Center);
        sheet.getCellRange("A1:B1").getCellStyle().setHorizontalAlignment(HorizontalAlignType.Center);

        //セルの数値フォーマットを設定する
        sheet.getCellRange("B2:C5").getCellStyle().setNumberFormat("0%");

        //円グラフを追加する
        Chart piechart = sheet.getCharts().add(ExcelChartType.Pie);

        //チャートのデータ範囲を設定する
        piechart.setDataRange(sheet.getCellRange("B2:B5"));
        piechart.setSeriesDataFromRange(false);

        //チャートの位置を設定する
        piechart.setLeftColumn(4);
        piechart.setTopRow(1);
        piechart.setRightColumn(10);
        piechart.setBottomRow(20);

        //グラフのタイトルを追加し、タイルのフォーマットを設定する
        piechart.setChartTitle("オペレーティングシステムのユーザー分布");
        piechart.getChartTitleArea().isBold(true);
        piechart.getChartTitleArea().setSize(12);

        ChartSerie cs = piechart.getSeries().get(0);
        cs.setCategoryLabels(sheet.getCellRange("A2:A5"));
        cs.setValues(sheet.getCellRange("B2:B5"));
        cs.getDataPoints().getDefaultDataPoint().getDataLabels().hasValue(true);
        piechart.getPlotArea().getFill().setVisible(false);

        //円グラフから1つのスライスを切り離す
        piechart.getSeries().get(0).getDataPoints().get(1).getDataFormat().setPercent(20);

        //結果のファイルを保存する
        workbook.saveToFile("1つのスライスを分離した分離型円グラフ.xlsx", ExcelVersion.Version2016);
        workbook.dispose();
    }
}
```
#### 効果のイメージ図
![2022-07-21_145453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/743b9cb9-add0-d5f2-0f7d-add05f85ed03.png)

## リンググラフを作成する
リンググラフとは、ドーナツのように中心が空洞になっているグラフのことです。リンググラフは、円グラフとは少し異なる方法でデータを表示します。
> ここでは、リンググラフの詳しい作成手順をご紹介します。

- **Workbook**のインスタンスを作成します。
- **Workbook.getWorksheets().get(sheetIndex)** メソッドで、指定したワークシートを取得します。
- ワークシートにデータを追加し、Excelのセルの値、スタイル、数値フォーマットを設定する。
- **Worksheet.getCharts().add(ExcelChartType.Doughnut)** メソッドでワークシートにリンググラフを追加します。
- **Chart.setDataRange()** メソッドでチャートのデータ範囲を設定します。
- チャートの位置を設定し、タイトルを追加します。
- **Workbook.saveToFile()** メソッドでファイルを保存します。
```Java
import com.spire.xls.*;
import com.spire.xls.charts.ChartSerie;
import java.awt.*;

public class ringChart {

    public static void main(String[] args) throws Exception {
        //Workbookを作成する
        Workbook workbook = new Workbook();

        //最初のシートを取得し、その名前を設定する
        Worksheet sheet = workbook.getWorksheets().get(0);
        sheet.setName("リンググラフ");

        //指定したセルの値を設定する
        sheet.getCellRange("A1").setValue("オペレーティングシステム");
        sheet.getCellRange("A2").setValue("Linux");
        sheet.getCellRange("A3").setValue("Mac OS");
        sheet.getCellRange("A4").setValue("Windows");
        sheet.getCellRange("A5").setValue("Unix");

        sheet.getCellRange("B1").setValue("ユーザー占有率");
        sheet.getCellRange("B2").setNumberValue(0.08);
        sheet.getCellRange("B3").setNumberValue(0.15);
        sheet.getCellRange("B4").setNumberValue(0.75);
        sheet.getCellRange("B5").setNumberValue(0.02);

        //セルのスタイルを設定する
        sheet.getCellRange("A1:B1").setRowHeight(15);
        sheet.getCellRange("A1").setColumnWidth(28);
        sheet.getCellRange("B1").setColumnWidth(20);
        sheet.getCellRange("A1:B1").getCellStyle().setColor(Color.darkGray);
        sheet.getCellRange("A1:B1").getCellStyle().getExcelFont().setColor(Color.white);
        sheet.getCellRange("A1:B1").getCellStyle().setVerticalAlignment(VerticalAlignType.Center);
        sheet.getCellRange("A1:B1").getCellStyle().setHorizontalAlignment(HorizontalAlignType.Center);

        //セルの数値フォーマットを設定する
        sheet.getCellRange("B2:C5").getCellStyle().setNumberFormat("0%");

        //リンググラフを追加する
        Chart piechart = sheet.getCharts().add(ExcelChartType.Doughnut);

        //チャートのデータ範囲を設定する
        piechart.setDataRange(sheet.getCellRange("B2:B5"));
        piechart.setSeriesDataFromRange(false);

        //チャートの位置を設定する
        piechart.setLeftColumn(4);
        piechart.setTopRow(1);
        piechart.setRightColumn(10);
        piechart.setBottomRow(20);

        //グラフのタイトルを追加し、タイルのフォーマットを設定する
        piechart.setChartTitle("オペレーティングシステムのユーザー分布");
        piechart.getChartTitleArea().isBold(true);
        piechart.getChartTitleArea().setSize(12);

        ChartSerie cs = piechart.getSeries().get(0);
        cs.setCategoryLabels(sheet.getCellRange("A2:A5"));
        cs.setValues(sheet.getCellRange("B2:B5"));
        cs.getDataPoints().getDefaultDataPoint().getDataLabels().hasValue(true);
        piechart.getPlotArea().getFill().setVisible(false);

        //結果のファイルを保存する
        workbook.saveToFile("リンググラフ.xlsx", ExcelVersion.Version2016);
        workbook.dispose();
    }
}
```
#### 効果のイメージ図
![2022-07-21_145632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/4bc3aff1-3720-bebc-d95a-b43c1b14528f.png)

#### 【暖かいヒント】
Spire.XLS for Javaは、棒グラフ、散布図、折れ線グラフの作成もサポートしています。より多くの機能については、[Excelフォーラム](https://www.e-iceblue.com/forum/spire-xls-f4.html)を参照してください。