以前の記事で 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) }
もともとのサンプルが、プロパティの設定などを行っていない簡単なものだったのであまりビルダーの有難味がよく分かりませんが、最初から込み入ったサンプルをやる必要はないでしょう。 プロパティの設定などは追々。
次回に続く。
- 作者: 西尾維新,VOFAN
- 出版社/メーカー: 講談社
- 発売日: 2011/06/29
- メディア: 単行本(ソフトカバー)
- 購入: 15人 クリック: 393回
- この商品を含むブログ (154件) を見る
*1:拙者もそんなに使ったことありませんが(笑)