読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

ExcelのテンプレートをVelocityで記述

Java

ウチの製品であるMOD99に、Excel帳票出力の機能を付けることになりました。
(これまではCSV+VBAで乗り切っていた)


今更かよって?ハイ、今更です。
サボってました。スイマセン。


コレまでずっと避けていたPOIをとうとう使うはめに…
で、実際使ってみると、噂通りAPIが使いづらい。


しかも、バグもちらほら。
例えば、セルの型を変更しようとしたら(例:CELL_TYPE_NUMERICからCELL_TYPE_STRINGへ)
よくわからない例外が発生するなど。
しょーがないのでPOIのソースを読んだところ、
この例外は『セルの型を一旦CELL_TYPE_BLANKにしてから再設定する』ことで回避可能だということが判明。


ま、他に選択肢がないので、贅沢言えないんですけどね。
ものすごくリソースをつぎ込んで、やっとここまでの完成度になっているわけですし。
ちゃんと動くときはちゃんと動くんだよなぁ…

帳票はViewである

さて、一般的に帳票とはWeb画面などとレイヤーが同じであり、
ただ単に『データの表示方法を変えただけ』です。ロバストネス分析で言うところのバウンダリです。
だから、JSPのようなのノリで高度な表示ロジックを記述できるようになっているべき。


…なのになぜか、世の中にはそのようなプロダクト/ライブラリがあまり無いようです。
1ヶ月ほど前にざっと調べた限り、マトモに使えそうなのは

くらいでした。
で、jxlsはJSPっぽい文法なので親しみやすい一方、excellaは全く新しい記法を覚えなくてはなりません。
いずれにせよどちらもLGPLなので、ウチの製品に組み込むのはムリですが。
LGPLの製品は使わないポリシーです)


僕のイメージするテンプレートって、こんな感じなんですよねー。

僕はVelocity大好き人間なのですが、このようにVelocityでHTMLテンプレートを書くノリで、
Excelのテンプレートを書くことが出来るべき。


というわけで完全に自作しました。ダラダラと3,4日くらいかけて
やっつけで作ったものですが、我ながら良い出来だと思います。
上の画像のようなテンプレートを本当に作成可能です。ハイ。


作った後で知った…!!


実はVelocity的記法でExcelテンプレートを書くという発想、既に昔からあったようでして、
こういうのが既に有りました。ナンテコッタイ。


http://fisshplate.sandbox.seasar.org/ja/


文法はあくまでもVelocity『風』ですが、まぁ使う分には問題ありません。
予め、ちゃんとググっとけばよかった。もう作っちまったじゃねーかwww
まぁいいや。POIの勉強になったし。


fisshplateと比較すると、僕の作ったものは

  • 文法は完全にVelocity準拠である
  • 列を動的に追加することは出来ない…(←面倒くさいのでやってない)
  • #macroに対応している!(VBAじゃなくてVelocityの#macro)


という特徴があります。
マクロですよマクロ。便利だと思いません?
マクロを使うとこんな感じになります。



ま、この例だとあまり役に立つように見えませんが、
共通のマクロをキチンと共通ライブラリ(もちろんExcelで記述できる!)として
整備していけば、開発効率はかなり上がるでしょう。


ニーズがあるならば

もしかしたらオープンソースとして公開するかもしれません。
ご要望があるならどうぞ。(ただし冷やかしはご遠慮ください)

追記

こういうのもあるみたいですねぇ。僕が作ったものと、原理はほとんど同じかな?

http://xpfriend.com/eco/eco-reporting-excel.html

ただ、このフレームワーク?固有の機能が多数盛り込まれているようなので、
全然関係ないアプリにすんなり組み込めるかどうかは、よくわかりませんが。