倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

FactoryBuilderSupport よ、我に力を! (6) : Apache POI を構築するサンプル書くぞっ

以前の記事で FactoryBuilderSupport を用いて簡単なビルダーの作成方法を見ましたが、今回からもうちょっと現実味のあるサンプルを書いてみます。

ビルダーは

  • ネスト構造を持っていて
  • プロパティの多い

オブジェクトを構築するのに便利なので、Apache POI でスプレッドシート(Excel ファイル)を構築するビルダーを作ってみます。

作成するスプレッドシート


とりあえず、当面作成を目指すスプレッドシートは以下のようなものとします:

A B C
1 0:0 0:1 0:2
2 1:0 1:1 1:2
3 2:0 2:1 2:2
4 3:0 3:1 3:2
5 4:0 4:1 4:2

各セルの内容は行数、列数からなる文字列とします。

Groovy でコーディング


まずは、Apache POI の API になれていない人のために*1、単純に Groovy を使ったサンプルコードを載せておきます:

import org.apache.poi.hssf.usermodel.HSSFWorkbook

// ワークブックの生成
def workbook = new HSSFWorkbook()

// シートの生成
def sheet = workbook.createSheet('Sheet')
for(i in 0..<5){
    def row = sheet.createRow(i)
    for(j in 0..<3){
        def cell = row.createCell(j)
        cell.setCellValue("$i:$j")
    }
}

// ワークブックの書き出し
new File('test.xls').withOutputStream{ os ->
    workbook.write(os)
}
  • スプレッドシートのオブジェクトモデルは「Workbook ◇- Sheet ◇- Row ◇- Cell」(無理矢理のクラス図)のようになっています(こちらを参照)。 他にも要素はありますが当面は無視。
  • スプレッドシートを構築する際に明示的にコンストラクタインスタンス化しているのは Workbook オブジェクトだけです(具象クラスは HSSFWorkbook)。 他の要素は、親要素の createXxxx() メソッドによってインスタンスを取得します:
    • Row row = sheet.createRow(0)
    • Cell cell = row.createCell(1)
    • など
  • 構築した Workbook オブジェクトは test.xls ファイル書き出してます。

ビルダーで生成


で、FactoryBuilderSupport でどんなビルダーを作るかというと、以下のように Workbook オブジェクトを構築できる PoiBuilder を作ります:

def builder = new PoiBuilder()
// ワークブックの生成
def workbook = builder.workbook{
    // シート Sheet を生成
    sheet('Sheet'){
        for(i in 0..<5){
            row(i){
                for(j in 0..<3){
                    cell(j){
                        cellValue("$i:$j")
                    }
                }
            }
        }
    }
}

// ワークブックの書き出し
new File('test.xls').withOutputStream{ os ->
    workbook.write(os)
}

もともとのサンプルが、プロパティの設定などを行っていない簡単なものだったのであまりビルダーの有難味がよく分かりませんが、最初から込み入ったサンプルをやる必要はないでしょう。 プロパティの設定などは追々。

次回に続く。

囮物語 (講談社BOX)

囮物語 (講談社BOX)

*1:拙者もそんなに使ったことありませんが(笑)