できたぞー

考課面談が終わったら頭が切り替わってすぐ出来た。

HSSFDataFormatには、POIで用意したビルトイン書式しかなくって、ユーザー定義は勿論、如何にも日本向けのみの書式も入ってない。

で、HSSFDataFormatのインスタンスメソッドに、getFormat(String format)ってのがあって、formatに指定した書式が存在しないと内部的に書式を追加して、そのインデックスをshortで戻してくれる。

なので、こんな感じ。

  • templateWb テンプレート側ワークブック
  • templateStyle テンプレート側のセルのスタイル
  • outWb 出力するワークブック
  • outStyle 出力するセルに食わせるスタイル

として、テンプレート側セルの書式を出力側スタイルにコピーする。

short dfIdx =  templateStyle.getDataFormat();
HSSFDataFormat templateDf = templateWb.createDataFormat();
String formatString = templateDf.getFormat(dfIdx);

HSSFDataFormat outDf = outWb.createDataFormat();
short outDfIdx = outDf.getFormat(formatString);
outStyle.setDataFormat(outDfIdx);

これでユーザー定義もなんのその(の予定)だー。

createDataFormatって名前が、なんかぱかぱかインスタンス作ってそうで動きが心配なんだけど、ソースを見たら

public HSSFDataFormat createDataFormat() {
    if (formatter == null)
        formatter = new HSSFDataFormat(workbook);
    return formatter;
}

だった。

さてリファクタリングしよう。