倭マン's BLOG

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

PoiBuilder で Quick Guide (22) : 便利な機能

今回は便利な機能 (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 の実装が原因かと。
現場で使えるJavaライブラリ

現場で使えるJavaライブラリ


プログラミングGROOVY

プログラミングGROOVY

*1:poi-builder 0.0.6 では cellRangeAddress ノードで生成されるオブジェクトは CellRangeAddress クラスのサブクラスになってます。 CellRangeAddress クラスはシート情報を保持していないので、サブクラスにその情報を持たせているためです。