一般社団法人 全国個人事業主支援協会

COLUMN コラム

こんにちは。
田中です。

今回はJavaでExcel操作を行うという操作について書いていきます。
基本的な使い方、ではなく、これで詰まった、という内容を記載していきたいと思います。

JavaでExcel操作できるライブラリは2つ

これまでExcel操作といえば、VBA一択だった。
Excelファイルをダウンロード、アップロードするぐらいでその中身まで編集することはなかった。
正直、Excelの中身を編集するならVBAが一番だと思う。
なぜなら、JavaでExcel操作するライブラリは2つあるが、Microsoft公認ではないため、できることに限りがあるのだ。
とはいえ、ある程度は操作できるので今回はJavaで操作を行うに至った。

そのExcel操作の代表的なライブラリは2つ。
・Apache POI
・Aspose.Cells for Java

他のサイトを見ると、「POI」の使用を推奨しているものが多かった。
というのも、「Aspose.Cells」のほうは有償版が存在し、無償版に至ってはどうやら使用期限があるそうなのだ。
有償版が存在するだけあって、POIよりもasposeのほうができることが多い。
そして、コードがシンプルだったりする。
だが、asposeの有償版は1年間のライセンス購入だ。
自分で使って払い続けるのでなければ使い続けるのはハードルが高いだろう。
回り道はすれば、ある程度はPOIでもできるので、POIだけで構築したほうがよかった。
ソースを簡単に、と調べまくってPOIとasposeが混在させてしまったのと、調べるのに時間がかかってしまった点が反省点。

テンプレートに値を埋め込む

このライブラリを使用するにあたり、なぜ使用としたのか。
それは、Excelテンプレートに値をいれ、それを出力する。
これだけといえばこれだけなのだが、POIの場合、

  1. ワークブックの指定
  2. ワークシートの指定
  3. 行の指定
  4. 列の指定

の4段階を得て、値を書込みできる。

Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet();
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("セルに値入力");

新規作成ならこれで問題ないのだが、これだとテンプレートに書き込む際に、指定した行、セルの書式設定、罫線がクリアされてしまう。
もともとあるそれらを消さずにするためには初めに行、セルの情報を取得する必要がある。

Row row = sheet.getRow(0); if (row == null) {  row = sheet.createRow(0); } Cell cell = row.getCell(0); if (cell == null) {  cell = row.createCell(0); }

cell.setCellValue("セルに値入力");

上記のようにすれば、もとの書式設定を残したまま値入力できる。
ちなみに、Getで何も設定されていない(標準)状態は「null」が取得される。
蓋をあければ簡単ではあるのだが、ここまでたどりつくのに、少々時間がかかってしまったのでメモ。

入力した値がセルの書式設定にならない

たとえば、年月日を入力するとする。
値:2024/05/01 00:00:000
これをExcelでは、
表記:2024年5月1日
という表記にする。
Javaで入力する際に、時間を表記通りに整形して文字列として入力すれば問題ないが、Excel側で簡単に設定できるんだから、対応してくれよ!と思った次第。
そういった書式設定の数も多かったのも理由の1つだったりする。
テンプレートに出力するデータの元がCSVだったので、基本的に文字列だったのだが、その文字列を書式にあったデータ型に置き換えることでうまくいった。

値のデータ型 表記設定 結果
日付系 Calendar yyyy年mm月dd日 2024/05/01 00:00:000 2024年5月1日
数値 int #,### 10000 10,000

ちなみに、String型の文字列をsetCellValueすると、仮に数値でも文字列して出力される。
これも少し調べるのに時間がかかってしまった。

以上が、Excel操作でやっていくなかで時間がかかってしまった内容です。
参考にしたサイトがどこにあるかわからなくなったしまったので記載することができないが、参考になったサイトさまありがとうございます!

The following two tabs change content below.

tanaka_k1968

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア