N-LAB

JavaのJETTを利用してエクセルファイルを出力する方法


目標


目次

  1. JETTとは
  2. エクセルテンプレートファイルの作成
  3. エクセルファイルの出力


1. JETTとは



https://jett.sourceforge.net/

2. エクセルテンプレートファイルの作成


1. excelを起動し、「空白のブック」をクリックします。

2. 任意のセルに以下の変数を埋め込みます。「template.xlsx」という名前で任意の場所に保存します。
${param}

※埋め込んだ変数に対してJava上で値を設定します。変数${param}に対してJava上では「param」というキーでアクセスすることができます。詳細は以下を参照ください。
https://jett.sourceforge.net/transformation/beans_map.html

3. エクセルファイルの出力

※実装するにあたり環境は以下を想定しています。
フレームワーク: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」を入力し、ダウンロードボタンをクリックします。
input text value
7. エクセルファイルがダウンロードできていることを確認します。
donwload excel

8. ダウンロードしたエクセルファイルを開きます。セルに「test」が表示されていることを確認します。
check excel file


以上で全ての手順は完了になります