今回は便利な機能 (Using the Convenience Functions) です(一覧)。 Quick Guide に載っている「便利な機能」とは、org.apache.poi.ss.util パッケージに定義されているユーティリティ・クラス群のようです。
Java コード
org.apache.poi.ss.util パッケージには次のようなユーティリティ・クラスが定義されています:
- WorkbookUtil
- SheetUtil
- CellUtil
- RegionUtil
- ImageUtils
なぜ ImageUtils だけ「Utils」なのかは不明 ^^;) このパッケージには、他にも Reference に関するクラスも定義されています:
- SheetReferences
- CellReference
- AreaReference
- CellRangeAddress
似たようなクラスで Region というのもありますが、こちらは非推奨(でも RegionUtil は使えます)。 AreaReference と CellRangeReference はどちらもセルの範囲を表すクラスだと思いますが、いまいち違いが分かんないですね。 お互いに変換するメソッドなども見当たらないし。 まぁいいや。
Quick Guide では RegionUtil と CellUtil の使い方がいくつか載ってます:
Workbook wb = new HSSFWorkbook(); // or new XSSFWorkbook() Sheet sheet1 = wb.createSheet( "new sheet" ); // Create a merged region Row row = sheet1.createRow( 1 ); Row row2 = sheet1.createRow( 2 ); Cell cell = row.createCell( 1 ); cell.setCellValue( "This is a test of merging" ); CellRangeAddress region = CellRangeAddress.valueOf("B2:E5"); sheet1.addMergedRegion( region ); // Set the border and border colors. final short borderMediumDashed = HSSFCellStyle.BORDER_MEDIUM_DASHED; RegionUtil.setBorderBottom( borderMediumDashed, region, sheet1, wb ); RegionUtil.setBorderTop( borderMediumDashed, region, sheet1, wb ); RegionUtil.setBorderLeft( borderMediumDashed, region, sheet1, wb ); RegionUtil.setBorderRight( borderMediumDashed, region, sheet1, wb ); RegionUtil.setBottomBorderColor(IndexedColors.AQUA.getIndex(), region, sheet1, wb); RegionUtil.setTopBorderColor(IndexedColors.AQUA.getIndex(), region, sheet1, wb); RegionUtil.setLeftBorderColor(IndexedColors.AQUA.getIndex(), region, sheet1, wb); RegionUtil.setRightBorderColor(IndexedColors.AQUA.getIndex(), region, sheet1, wb); // Shows some usages of HSSFCellUtil CellStyle style = wb.createCellStyle(); style.setIndention((short)4); CellUtil.createCell(row, 8, "This is the value of the cell", style); Cell cell2 = CellUtil.createCell( row2, 8, "This is the value of the cell"); CellUtil.setAlignment(cell2, wb, HSSFCellStyle.ALIGN_CENTER);
RegionUtil に定義されている static メソッドは、引数の CellRangeAddress によって表される範囲の境界に対して線種や色を設定します。 この RegionUtil のメソッドは、指定された範囲を「一塊と見なして」境界を設定します。 このサンプルでは指定された範囲をマージしてから境界を設定しますが、例えマージしていなくても範囲内の境界は設定されません。
CellUtil に定義されている static メソッドは、通常 CellStyle を通して設定する整列などを1つのメソッド呼び出しで設定できるようにするものなどがあります。
poi-builder による構築
poi-builder では CellRangeAddress, RegionUtil に関連する部分以外は特に何も機能を付加していません。 なので、上記 Java コードの CellUtil に関する部分は poi-builder で特に簡単に書く方法などはありません。 というか、普通に Groovy コードとして書いても充分簡単だと思います。
CellRangeAddress, RegionUtil に関連して、セル範囲の境界を設定する場合には、cellRangeAddress ノードによって生成した CellRangeAddress オブジェクトに対して
- 境界の線種は borderTop, borderBottom, borderLeft, borderRight プロパティによって
- 境界の色は topBorderColor, bottomBorderColor, leftBorderColor, rightBorderColor プロパティによって
設定することができます。 これらのプロパティは cellRangeAddress ノードによって生成した CellRangeAddress オブジェクトに対してしか呼び出せないのでご注意を*1。
@GrabResolver('http://www5.ocn.ne.jp/~coast/repo/') @Grab('org.waman.tools:poi-builder:0.0.6') import org.waman.tools.poi.SpreadsheetBuilder def workbook = new SpreadsheetBuilder().workbook{ sheet('new sheet'){ row(1){ cell(1, cellValue:'This is a test of merging') } def region = cellRangeAddress('B2:E5') // CellRangeAddress オブジェクトの生成 merge(region) // セルのマージ // cellRangeAddress ノードで返される CellRangeAddress オブジェクトに対しては // RegionUtil に定義されている static メソッドの機能を、オブジェクトメソッドとして使えます。 region.with{ borderBottom = BORDER_MEDIUM_DASHED borderTop = BORDER_MEDIUM_DASHED borderLeft = BORDER_MEDIUM_DASHED borderRight = BORDER_MEDIUM_DASHED bottomBorderColor = AQUA topBorderColor = AQUA leftBorderColor = AQUA rightBorderColor = AQUA } def style = cellStyle(indention:4) row(7){ cell(1, cellValue:'This is the value of the cell', cellStyle:style) // CellUtil を使うこともできるけど、Groovy ならプロパティのセットも大して面倒ではない cell(1).cellStyle.alignment = ALIGN_CENTER } } }
境界の線種や色が1種類なら、まとめて設定できるようにした方が便利そうですね。 そのうち実装しよう。
作成されるスプレッドシート
マージしたセルの上のセルも境界が設定されてますが、これはその場所のセルが生成されていないためのようです。 おそらく Apache POI ではなく LibreOffice の実装が原因かと。
- 作者: 竹添直樹,島本多可子,小津美夕紀,亀井隆司
- 出版社/メーカー: 翔泳社
- 発売日: 2011/07/16
- メディア: 大型本
- 購入: 6人 クリック: 217回
- この商品を含むブログ (20件) を見る
- 作者: 関谷和愛,上原潤二,須江信洋,中野靖治
- 出版社/メーカー: 技術評論社
- 発売日: 2011/07/06
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 392回
- この商品を含むブログ (152件) を見る
*1:poi-builder 0.0.6 では cellRangeAddress ノードで生成されるオブジェクトは CellRangeAddress クラスのサブクラスになってます。 CellRangeAddress クラスはシート情報を保持していないので、サブクラスにその情報を持たせているためです。