倭マン's BLOG

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

PoiBuilder で Quick Guide (21) : セル中で複数行を使う

今回はセル中で複数行を使う (Using newlines in cells) です(一覧)。

Java コード


セル中で複数行を使うための Java コード。

    Workbook wb = new XSSFWorkbook();   //or new HSSFWorkbook();
    Sheet sheet = wb.createSheet();

    Row row = sheet.createRow(2);
    Cell cell = row.createCell(2);
    cell.setCellValue("Use \n with word wrap on to create a new line");

    //to enable newlines you need set a cell styles with wrap=true
    CellStyle cs = wb.createCellStyle();
    cs.setWrapText(true);
    cell.setCellStyle(cs);

    //increase row height to accomodate two lines of text
    row.setHeightInPoints((2*sheet.getDefaultRowHeightInPoints()));

    //adjust column width to fit the content
    sheet.autoSizeColumn((short)2);

複数行を使うだけなら、必要な設定は CellStyle オブジェクトの wrapText プロパティを true にするだけです。 このサンプルでは、他に

  • セルの高さをデフォルト値の2倍にする(Row#setHeightInPoints(), Sheet#getDefaultRowHeightInPoints())
  • 行の幅を自動で合わせる(Sheet#autoSizeColumn() メソッド)

といった設定を行っています。

poi-builder による構築


poi-builder によるビルド・スクリプト。

@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{
        row(2, heightInPoints:(2*sheet.defaultRowHeightInPoints)){
            cell(2, cellValue:'Use \n with word wrap on to create a new line',
                cellStyle:cellStyle(wrapText:true))
        }
        sheet.autoSizeColumn(2)
    }
}

CellStyle の wrapText プロパティの設定自体は簡単です。 行、列の幅設定の部分は説明が必要かと。

ビルド・スクリプトではビルダーに定義されているプロパティ・アクセスやメソッドの呼び出しは簡単ですが、構築対象のオブジェクトに対してそれらは直接はできません。 とは言ってもそんなに難しくなくて、通常の FactoryBuilderSupport オブジェクトに対しては current プロパティなどによって構築対象のオブジェクトにアクセスすることができます。

ただし、current プロパティで何のオブジェクトが返されるのかを把握しておかないといけなくてちょっと直感的ではないと思うので、poi-builder では workbook, sheet, row, cell プロパティを(ノードとは別に)定義してあり、対応するオブジェクトを返すようにしています*1。 これらのプロパティでアクセスが可能なのは

プロパティ \ 親ノード workbook sheet row cell
workbook
sheet ×
row × ×
cell × × ×

となってます。 Apache POI の API でたどれるものだけです。 まぁ、workbook ノード下で cell にアクセスしようとしても、どのセルか分かりませんよね。

これらのプロパティでオブジェクトを取得すれば、そのオブジェクトに対してプロパティ・アクセスやメソッド呼び出しは自由にできます。 上記のビルド・スクリプトでは Sheet オブジェクトに対して defaultRowHeightInPoints プロパティにアクセスしたり、autoSizeColumn() メソッドを呼び出したりしたりしてます。

作成されるスプレッドシート





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

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


プログラミングGROOVY

プログラミングGROOVY

*1:今のところプロパティ・アクセスによる値のセットは行えません。