1. excelを起動し、「空白のブック」をクリックします。
2. 任意のセルに以下の変数を埋め込みます。「template.xlsx」という名前で任意の場所に保存します。
${param}
※埋め込んだ変数に対してJava上で値を設定します。変数${param}に対してJava上では「param」というキーでアクセスすることができます。詳細は以下を参照ください。
https://jett.sourceforge.net/transformation/beans_map.html
※実装するにあたり環境は以下を想定しています。
フレームワーク:Spring Boot 3.0
プログラミング言語:Java 17
ビルドツール:Maven
1. 「pom.xml」の「dependencies」に以下を追加します。
<dependency>
<groupId>net.sf.jett</groupId>
<artifactId>jett-core</artifactId>
<version>0.11.0</version>
</dependency>
2. 「src/main/resources/templates」に「download.html」を作成し、以下の内容で保存します。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<title>Download Excel</title>
<meta charset="UTF-8">
</head>
<body>
<p>Download Excel</p>
<form th:action="@{/downloadExcel}" method="post">
<input type="text" name="inputValue">
<input type="submit" value="ダウンロード">
</form>
</body>
</html>
3. 「src/main/java/{project name}/controller」に「DownloadController.java」を作成し、以下の内容で保存します。
package com.example.springsecuritysample.controller;
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.beans.factory.annotation.Autowired;
import com.example.springsecuritysample.service.DownloadService;
import jakarta.servlet.http.HttpServletResponse;
@Controller
public class DownloadController {
@Autowired DownloadService downloadService;
/**
* ダウンロードページ表示
*/
@GetMapping("/download")
public String download(Model model) {
return "download";
}
/**
* ユーザーが入力した値をもとにエクセルファイルを作成してダウンロードする
*
* @param inputValue 入力値
* @param response レスポンス
* @throws Exception
*/
@PostMapping("/downloadExcel")
public String downloadExcel(String inputValue, HttpServletResponse response) throws Exception {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("content-disposition", String.format("attachment;filename=\"%s\"", "out.xlsx"));
response.setCharacterEncoding("UTF-8");
downloadService.downloadExcel(response, inputValue);
return null;
}
}
4. 「src/main/java/{project name}/service」に「DownloadService.java」を作成し、以下の内容で保存します。
package com.example.springsecuritysample.service;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Service;
import jakarta.servlet.http.HttpServletResponse;
import net.sf.jett.transform.ExcelTransformer;
import org.apache.poi.ss.usermodel.Workbook;
@Service
public class DownloadService {
/**
* jettを利用したエクセルファイル生成処理
* ユーザーが入力した値をテンプレートとなるエクセルファイルに埋め込み出力する
*
* @param response レスポンス
* @param inputValue 入力値
* @throws Exception
*/
public void downloadExcel(HttpServletResponse response, String inputValue) {
// テンプレートファイルの保存場所
String templatePath = "{任意のディレクトリ}/template.xlsx";
try (InputStream fileIn = new BufferedInputStream(new FileInputStream(templatePath));
OutputStream outputStream = response.getOutputStream()) {
Map<String, Object> beans = new HashMap<String, Object>();
ExcelTransformer transformer = new ExcelTransformer();
// テンプレートファイルに設定した変数に入力値を登録
beans.put("param", inputValue);
// エクセルファイル生成
Workbook workbook = transformer.transform(fileIn, beans);
workbook.write(outputStream);
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
※テンプレートファイルの保存場所は「2. エクセルテンプレートファイルの作成」で作成したテンプレートファイルの保存場所を指定してください。
5. プロジェクト起動後、以下のURLにアクセスします。
http://localhost:8080/download
6. ダウンロードページが表示されていることを確認します。テキストボックスに「test」を入力し、ダウンロードボタンをクリックします。
7. エクセルファイルがダウンロードできていることを確認します。
8. ダウンロードしたエクセルファイルを開きます。セルに「test」が表示されていることを確認します。
以上で全ての手順は完了になります