Fisshplateは、Excelをテンプレート化してデータを埋め込んだExcelファイルを作るライブラリ。
プロジェクトのサイトはこちら。
昔の記事→さらにいい方法を見つけた
プロジェクト自体も古く、apache-poiも古いままなので、xlsxやxlsmには対応していない。たまたまExcelで仕様書を作ってくれという仕事をすることになったので楽をしようと昔使ったFisshplateを使ってテンプレート化しちゃおう、と思ったのだけどベースの仕様書がxlsmだったのだ。poiの方は新しいフォーマットに対応しているみたいなことを書いてあるので、ちょっとやってみた。
ベースにした fisshplate-0.1.4 はHSSFに依存した実装になっているので、その辺をかたっぱしからorg.apache.poi.ss.usermodelにあるインターフェースに変更。インスタンスを生成するところは、WorkbookFactoryやWorkbookから取得できるCreationHelperに変更してみたのが、lib/fisshplate-ooxml.jar。
結論からいうとタイトルにも書いてある通り、僕が試したxlsmは一部の対応していない設定のセルがあるのか、途中で例外が発生する。しかもpoi側というか、poi-ooxml-schemasの方じゃないかと思うのでソースもなく、追うことができない。試しにxlsで保存してみたりすると一応動いたし、xlsxでうまく動く場合もあるので、poiの新フォーマット対応が途上ということなんだろうか。テンプレート用の条件式を書かずにベースのxlsmをFPTemplate.process()してみるとこうなる。
org.apache.xmlbeans.impl.values.XmlValueDisconnectedException at org.apache.xmlbeans.impl.values.XmlObjectBase.check_orphaned(XmlObjectBase.java:1213) at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTCellImpl.isSetS(Unknown Source) at org.apache.poi.xssf.usermodel.XSSFCell.getCellStyle(XSSFCell.java:491) at org.apache.poi.xssf.usermodel.XSSFCell.getCellStyle(XSSFCell.java:64) at org.seasar.fisshplate.core.element.AbstractCell.copyCellStyle(AbstractCell.java:106) at org.seasar.fisshplate.core.element.AbstractCell.merge(AbstractCell.java:71) at org.seasar.fisshplate.core.element.RowElement.merge(RowElement.java:89) at org.seasar.fisshplate.core.element.Root.mergeBodyElement(Root.java:48) at org.seasar.fisshplate.core.element.Root.merge(Root.java:38) at org.seasar.fisshplate.template.FPTemplate.process(FPTemplate.java:126) at org.seasar.fisshplate.template.FPTemplate.process(FPTemplate.java:93) at TestClass.main(TestClass.java:24)
ちなみに最終的に作ろうとしたものは、C#のコードからExcelの要件定義書(USDM)をおこすものです。既にコードを書いてしまっているので、そこからリバースエンジニアリングで仕様書を作ろうとしているのですが。。。しかし、なんでみんな仕様書をExcelで作りたがるのか、僕には理解できません。
コメント