1. 概要

このチュートリアルでは、Javaを使用してExcelファイルのセルに画像を追加する方法を学習します。

apache-poi。を使用して、Excelファイルを動的に作成し、セルに画像を追加します。

2. プロジェクトの設定と依存関係

Javaアプリケーションは、 apache-poi を使用して、Excelスプレッドシートの内容を動的に読み取り、書き込み、および変更できます。 .xls.xlsxExcel形式の両方をサポートします。

2.1. ApachePoiAPIのMaven依存関係

まず、poi依存関係をプロジェクトに追加しましょう。

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.15</version>
</dependency>

2.2. Excelワークブックの作成

まず、書き込むワークブックとシートを作成しましょう。 .xlsxファイルで動作するXSSFWorkbook、または.xlsファイルで動作するHSSFWorkbookのいずれかを選択できます。  XSSFWorkbook を使用しましょう:
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Avengers");
Row row1 = sheet.createRow(0);
row1.createCell(0).setCellValue("IRON-MAN");
Row row2 = sheet.createRow(1);
row2.createCell(0).setCellValue("SPIDER-MAN");

ここでは、 Avengers シートを作成し、A1セルとA2セルに2つの名前を入力しました。 次に、セルB1B2にアベンジャーズの画像を追加します。

3. ワークブックに画像を挿入する

3.1. ローカルファイルから画像を読み取る

画像を追加するには、最初にプロジェクトディレクトリから画像を読み取る必要があります。 このプロジェクトでは、resourcesディレクトリに2つの画像があります。

  • /src/main/resources/ironman.png
  • /src/main/resources/spiderman.png
InputStream inputStream1 = TestClass.class.getClassLoader()
    .getResourceAsStream("ironman.png");
InputStream inputStream2 = TestClass.class.getClassLoader()
    .getResourceAsStream("spiderman.png");

3.2. 画像InputStreamをバイト配列に変換

次に、画像をバイト配列に変換しましょう。 ここでは、apache-poiIOUtilsを使用します。

byte[] inputImageBytes1 = IOUtils.toByteArray(inputStream1);
byte[] inputImageBytes2 = IOUtils.toByteArray(inputStream2);

3.3. ワークブックに画像を追加する

次に、バイト配列を使用してワークブックに画像を追加します。 でサポートされている画像タイプは、PNG、JPG、およびDIBです。 ここではPNGを使用しています:

int inputImagePictureID1 = workbook.addPicture(inputImageBytes1, Workbook.PICTURE_TYPE_PNG);
int inputImagePictureID2 = workbook.addPicture(inputImageBytes2, Workbook.PICTURE_TYPE_PNG);

この手順の結果として、Drawingオブジェクトの作成に使用する各画像のインデックスを取得します。

3.4. 図面コンテナを作成します

描画家長は、すべての形状の最上位のコンテナです。 これにより、 Drawing インターフェイス(この場合は XSSFDrawing オブジェクト)が返されます。 このオブジェクトを使用して、定義したセルに配置する画像を作成します。

描画家長を作成しましょう:

XSSFDrawing drawing = (XSSFDrawing) sheet.createDrawingPatriarch();

4. セルに画像を追加

これで、画像をセルに追加する準備が整いました。

4.1. アンカーオブジェクトを作成する

まず、Excelワークシートに添付され、Excelシート内の画像の位置を設定するために使用されるクライアントアンカーオブジェクトを作成します。 左上と右下のセルに固定されます。

画像ごとに1つずつ、2つのアンカーオブジェクトを作成します。

XSSFClientAnchor ironManAnchor = new XSSFClientAnchor();
XSSFClientAnchor spiderManAnchor = new XSSFClientAnchor();

次に、アンカーオブジェクトに対する画像の相対位置を指定する必要があります。

最初の画像をセルB1に配置しましょう。

ironManAnchor.setCol1(1); // Sets the column (0 based) of the first cell.
ironManAnchor.setCol2(2); // Sets the column (0 based) of the Second cell.
ironManAnchor.setRow1(0); // Sets the row (0 based) of the first cell.
ironManAnchor.setRow2(1); // Sets the row (0 based) of the Second cell.

同様に、2番目の画像をセルB2に配置します。

spiderManAnchor.setCol1(1);
spiderManAnchor.setCol2(2);
spiderManAnchor.setRow1(1);
spiderManAnchor.setRow2(2);

4.2. アンカーオブジェクトと画像インデックスを図面コンテナに追加する

それでは、描画家長で createPicture を呼び出して、画像を追加しましょう。 以前に作成したアンカーオブジェクトと画像の画像インデックスを使用します:
drawing.createPicture(ironManAnchor, inputImagePictureID1);
drawing.createPicture(spiderManAnchor, inputImagePictureID2);

5. ブックを保存

保存する前に、 autoSizeColumn を使用して、追加した画像に対してセルの幅が十分であることを確認しましょう。

for (int i = 0; i < 3; i++) {
    sheet.autoSizeColumn(i);
}

最後に、ブックを保存しましょう。

try (FileOutputStream saveExcel = new FileOutputStream("target/baeldung-apachepoi.xlsx")) {
    workbook.write(saveExcel);
}

結果のExcelシートは次のようになります。

6. 結論

この記事では、 apache-poi ライブラリを使用して、JavaでExcelワークシートのセルに画像を追加する方法を学びました。

画像を読み込んでバイトに変換し、シートに添付してから、描画ツールを使用して正しいセルに画像を配置する必要がありました。 最後に、列のサイズを変更してブックを保存することができました。

いつものように、この記事のサンプルコードは、GitHubから入手できます。