Apache POI は、Java で Word や Excel などの Office ドキュメントを読み書きするためのライブラリです。
この記事では、Spring Boot の Web アプリケーションから、Apache POI を使って Excel ドキュメントを出力し、ブラウザでダウンロードする方法を解説します。
Spring Boot プロジェクトの作成
はじめに、Spring Initializr を使用して、Spring Boot プロジェクトの初期化を行っていきます。
以下のリンクから、Spring Initializr のページを開き、プロジェクトの設定を行います。
・Spring Initializr
https://start.spring.io
今回、設定する内容は次の表のとおりです。
項目 | 設定値 |
---|---|
Project | Gradle Project |
Language | Java |
Spring Boot | 2.6.1 |
Project Metadata | 任意 デフォルトのままでも可 |
Packaging | Jar |
Java | 17 |
Dependencies | Spring Web Thymeleaf |
<設定画面のイメージ>
設定が終わったら「GENERATE」ボタンをクリックします。すると、設定した内容で Spring Boot のテンプレートがダウンロードできます。
ダウンロードしたファイルは、任意のディレクトリに解凍しておきます。
プロジェクトのビルド
ダウンロードしたテンプレートをビルドします。
コンソール(Windows の場合はコマンドプロンプト)を開き、先ほどダウンロードしたファイルを解凍したディレクトリに移動します。
cd path/to/demo
次のコマンドを入力してプロジェクトをビルドします。
./gradlew
Windows の場合は、以下のバッチファイルを起動します。
.\gradlew.bat
初回のビルドは、Gradle のインストールなどが行われ時間がかかりますが、少し待ちましょう。
ビルドが完了すると、次のように「BUILD SUCCESSFUL」の文字がコンソール上に出力されます。
Apache POI のインストール
次に、先ほど作成した Spring Boot プロジェクトに、Apache POI の依存関係を追加します。
build.gradle を開き、依存関係(dependencies)に以下の1行を追加します。
implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '5.1.0'
Eclipse や Spring Boot の拡張機能をインストールした VSCode (Visual Studio Code)であれば、build.gradle を編集して保存すると、自動的にライブラリのダウンロード等が行われ、依存関係が解決されます。
ここまでの手順で、環境の設定は完了です。
POI で Excel を出力してみよう
それでは、POI を使って Excel ファイルを出力するサンプルコードを作成していきましょう。
出力画面のHTMLを作成
まず、ビューとなる HTML から作成します。
resources/templates/ の下に poi.html というファイル名で新しくファイルを作成します。
poi.html は Excel 出力を開始するボタンが1つだけあるシンプルな HTML です。今回は、テンプレートエンジンに Spring 互換の Thymeleaf を使用しています。
<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>POI Sample</title>
</head>
<body>
<form th:action="@{/form}" method="post" th:object="${myForm}">
<input type="submit" value="出力" />
</form>
</body>
</html>
コントローラーの作成
次にコントローラーを作成します。java/com/example/demo の下に、PoiController.java という名前で新しくクラスを作成します。
作成されたファイルのコードを編集し、画面の初期表示を行う index メソッドと、出力ボタンのクリックで Excel ファイルをダウンロードする output メソッドの2つを作成します。
package sample.thymeleaf.web;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/poi")
public class PoiController {
@GetMapping
public String init(Model model) {
return "poi";
}
@PostMapping
public String output() {
System.out.println("form.value=" + form.getValue());
return "form";
}
}
Excel ファイルの出力処理は、後述する内容で実装していくため、この時点では output メソッドの中身は仮の状態です。
画面の確認
Excel ファイルを作成する処理を実装する前に、一旦この状態で画面が表示できるか確認してみましょう。
作成した Web アプリケーションを起動するには、コンソール上で以下のコマンドを入力します。
./gradlew bootrun
Excel 出力処理の実装
それでは、POI を使って Excel ドキュメントを作成し、ブラウザでダウンロードする処理を書いていきましょう。
java/com/example/demo の下に、ExcelService.java という名前で新しくクラスを作成し、次のコードを打ち込みましょうや
今回は、A1セルに、ダウロードを行った時間を出力する簡単なサンプルコードで動作を検証してみます。
package com.example.demo;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@Serivce
public class ExcelService {
public void createWorkbook(OutputStream outputStream) {
// xlsx形式ブックの生成
Workbook wb = new XSSFWorkbook();
// シートの生成
Sheet sh = wb.createSheet();
// 行・セルの生成
Row row = sh.createRow(0);
Cell cell = row.createCell(0);
try {
// 現在時刻を取得
String now = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
// セルに値を設定
cell.setCellValue("出力時間:" + now); // 値のセット
// Excel出力
wb.write(outputStream);
} finally {
try {
wb.close();
} catch (Exception ex) {
}
}
}
}
コントローラーの output メソッドを修正し、ボタンが押されたときに、上で作成した ExcelService を呼び出し、Excel ドキュメントをダウロードする処理に書き換えます。
@Controller
@RequestMapping("/poi")
public class PoiController {
@GetMapping
public String init(Model model) {
return "poi";
}
@RequestMapping(
value = "/output",
method = RequestMethod.POST,
produces = MediaType.APPLICATION_OCTET_STREAM_VALUE
)
public void output() {
//HTTPヘッダに、ダウンロードファイル名を設定
response.addHeader("Content-Disposition", "attachment; filename=\"sample.xlsx\"");
//Excelファイルの作成と、レスポンスストリームへの書き込み
try (ServletOutputStream stream = response.getOutputStream()) {
excelService.createWorkbook(baos);
}
}
}
これで、今回のサンプルアプリケーションは完成です。もう一度、アプリケーションを実行し、Excel ファイルのダウンロードが出来るか試してみましょう。
まとめ
Spring Boot + POI で、Excel ドキュメントの作成とダウロードを行う方法を解説してきました。
Apache POIは、Excel 以外の他の Office 系ドキュメントも扱うことができるため、是非試してみましょう。
【関連記事】
▶JavaでExcelファイルの読み込み・作成・出力方法を解説!
Spring Boot を使用するには、使用する端末に JDK が必要で、さらに、環境変数 JAVA_HOME に、JDK の実行ディレクトリへのパスを指定しておく必要があります。
【関連記事】
▶Mac環境でのJava開発!環境変数・PATHの通し方を学ぼう!