2015年2月4日水曜日

[Java][Excel][JETT] Excel帳票出力にJETTを試してみる

シフト表作成アプリ作る中で、Excel帳票を出力したくなったので軽くライブラリについて調べて見る。

調べる前に、以前に使ったことあるやつ

POI …以前に実務で帳票ガリガリ書いてたけど、かなりプリミティブで結構辛かった。なので生で使うのは本当に必要な時だけにしたい。
Fisshplate …テンプレートを使ってみて、やっぱりコレぐらいサクサク書けない と困ると実感した。ただ、今回出力したい xlsx 形式に対応していない(対応予定なし?)のでスルー。

Java × Excel だと POI の話題ばかり

Java8 / play framework でやっており、とりあえず最近だとどんなライブラリがあるのかと思い調べてみると、POI の話題ばかり。

どのライブラリも POI ベースでそれをラップするのが基本ぽいのに、もしかして皆 POI で頑張ってるのか…??

そんな中 Excel方眼紙を支える技術 - 新・たけぞう瀕死の日記 がかなり参考になった。

JETT を試して見る

なんとなく先端ぽく、↓の比較も面白かったので今回は帳票出力用ライブラリ JETT を試してみることにした。
本家サイトの jXLS との比較:JETT - Comparison to jXLS

とりあえずテンプレートファイルへの出力を試す。

1.テンプレートファイルを用意する。
2.出力コードを書く。

 public static File makeShift() {
  System.out.println(System.getProperty("user.dir"));
  
  List<employee> employees = Lists.newArrayList();
  
  Map<string object=""> beans = Maps.newHashMap();
  Employee emp = new Employee();
  emp.name = "Butcher";
  emp.skillLevel = "High";
  
  employees.add(emp);
  
  beans.put("employees", employees);
  
  String inPath  = "resources/shift_template.xlsx";
  String outPath = "resources/shift.xlsx";
  
  try (FileOutputStream fileOut = new FileOutputStream(outPath);
    InputStream fileIn       = new BufferedInputStream(new FileInputStream(inPath))) {

   ExcelTransformer transformer = new ExcelTransformer();
   Workbook workbook = transformer.transform(fileIn, beans);
   workbook.write(fileOut);
   fileOut.close();
   
  } catch (IOException e) {
   System.err.println("IOException reading " + inPath + ": " + e.getMessage());
  } catch (InvalidFormatException e) {
   System.err.println("InvalidFormatException reading " + inPath + ": " + e.getMessage());
  }
  
  return new File(outPath);  
 }

余分なコードが多いが、テンプレートへの出力処理は ExcelTransformer#transform で JavaBeans を渡すだけでOKなのでかなり簡潔。

テンプレートファイルに記述する構文もシンプルで良い。
個人的に、forEach タグを利用する時にデータの無い行や列にタグを書かなくて良いのは嬉しい。

番外

その他、調べて評判良かったのが ExCella だったけど、Maven repository に登録されておらずライブラリ管理を考えるのが面倒になってスルーした。
(今回は play なので build.sbt で管理)