SpringBootでExcelをダウンロードする機能を作成する機会があり、いい感じのライブラリを見つけたのでブログに残します。
やりたいこと
・SpringBootのWEBAPIでExcelダウンロードする機能。
・DBの内容をExcelに書き出したい。
・Excelで出力はするけど、フォーマットはCSVやTSVそのもののシンプルなもの。
Excelを出力するライブラリについて調査
調べていると、まず最初に見つかったのは「Apache POI」。
いざ試してみたものの、
セルに書き込んで→隣のセルに書き込んで→・・・
→次の行に移って→セルに書き込んで→隣の・・・(以下略)
のように、「セル番号を指定してアクセスして、そのセルに書き込む」という処理を逐一書く必要がありました。
これだと項目と項目の間に新しい項目が追加されたときや、項目の順序が並び変わったときなどに凄く手間がかかりそうな懸念が。
(もしかしたら上手い方法があるのかもしれませんが)
上記のような懸念は取り払いたく、Excel用のオブジェクトマッパーのようなものは無いのかなと調べてたどり着いたのが「XlsMapper」。
XlsMapperの使い方について簡単に
上記ページに分かりやすく使い方は記載されていたので、簡単に手順のみを載せておきます。
今回はBean→Excelのみの確認ですが、Excel→Beanもできるみたいです。
①テンプレートとなるExcelファイルを準備
②SheetクラスとRecordクラスを作成
@Data @XlsSheet(name="ポケモン一覧") public class SamplePokemonListSheet { @XlsHorizontalRecords(headerRow=0, headerColumn=0) @XlsRecordOption(overOperation=OverOperation.Copy) private List<SamplePokemonListRecord> records; }
@Data public class SamplePokemonListRecord { @XlsColumn(columnName="なまえ") String name; @XlsColumn(columnName="レベル") int level; }
③Bean→Excelの処理を書く
@RestController public class SampleController { @Autowired private SampleService service; @Autowired private ModelMapper modelMapper; @Autowired private XlsMapper xlsMapper; @GetMapping("/download") public void download(HttpServletResponse response) throws XlsMapperException, IOException { // サービスからドメインモデル取得 List<Pokemon> pokemonList = service.getPokemonList(); // Excel出力用のオブジェクト生成 SamplePokemonListSheet sheet = new SamplePokemonListSheet(); List<SamplePokemonListRecord> records = modelMapper.map(pokemonList, new TypeToken<List<SamplePokemonListRecord>>() {}.getType()); sheet.setRecords(records); // レスポンス設定 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("content-disposition", "attachment; filename=SampleBook.xlsx"); // 書き込み try (InputStream is = new ClassPathResource("Book1.xlsx").getInputStream(); OutputStream os = response.getOutputStream()) { xlsMapper.save(is, os, sheet); } } }
サービスのプログラムはただダミーのデータを返しているだけなので割愛。
動作確認
Edgeで確認。
まとめ
触ってみてかなりとっつきやすく、短い時間で実装できました。
DBの情報をExcelに出力する目的の場合は、POIよりXlsMapperの方が向いているのかなと、個人的には思えました。