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

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

POIで『縮小して全体を表示する』を設定する

POIで、『縮小して全体を表示する』ができなくて悩んでました。


POIのソースコードを調べてみたところ、HSSFCellStyleの内部表現であるExtendedFormatRecordに

public void setShrinkToFit(boolean);

というメソッドがあるのを発見。


ExtendedFormatRecordはprivateフィールドなので、
リフレクションで無理やり取得してメソッドを実行したのですが、反映されません。


うーむどうしたものか、と悩んでいたのですが、先ほど解決策を発見。

ブックはコピーして使え

これまで僕は、新しいブックを作成する際には、
『まっさらのブックをまず作り、元となるブックのプロパティをせっせとコピーする』という実装を書いていました。


しかし、『元となるブックをコピーして、シートを全部削除する』というやり方で新しいブックを作る方式に切り替えた所、上手く動くことを発見。
どうやら、ブックのグローバル属性的なものだったようです。セルのスタイルの一部だからだろうか…?

(※Excelの内部表現では、特定のセルのスタイルは、そのセルに紐付かずブックのグローバルな属性として保持される仕様です)

POIを使い込む=Excelの内部表現を知る

しっかしまぁ、POIで込み入ったことをやろうとすればするほど、
POIの内部実装、すなわちExcelの内部表現を知るハメになります。


で、Excelの内部表現を知るというのは、
『なんでそんな構造にしようと思ったんだろう???』という驚きの連続。
HSSF(Horrible SpreadSheet Format:とんでもねぇ表形式フォーマット)という名前をつけたのも納得です。