倭マン's BLOG

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

PoiBuilder で Quick Guide (4) : 日付セルを作成

今回は日付セルの作成 (Creating Date Cells) です(一覧)。

Java コード


セル内容として日付をセットするサンプル。

    Workbook wb = new HSSFWorkbook();
    //Workbook wb = new XSSFWorkbook();
    CreationHelper createHelper = wb.getCreationHelper();
    Sheet sheet = wb.createSheet("new sheet");

    // Create a row and put some cells in it. Rows are 0 based.
    Row row = sheet.createRow(0);

    // Create a cell and put a date value in it.  The first cell is not styled
    // as a date.
    Cell cell = row.createCell(0);
    cell.setCellValue(new Date());

    // we style the second cell as a date (and time).  It is important to
    // create a new cell style from the workbook otherwise you can end up
    // modifying the built in style and effecting not only this cell but other cells.
    CellStyle cellStyle = wb.createCellStyle();
    cellStyle.setDataFormat(
        createHelper.createDataFormat().getFormat("m/d/yy h:mm"));
    cell = row.createCell(1);
    cell.setCellValue(new Date());
    cell.setCellStyle(cellStyle);

    //you can also set date as java.util.Calendar
    cell = row.createCell(2);
    cell.setCellValue(Calendar.getInstance());
    cell.setCellStyle(cellStyle);

日付を設定したセルは、スタイルを設定しないと long 値が表示されたりします(アプリケーションによるだろうけど)。 したがって、セルのスタイルを設定する必要がありますが、セルのスタイルに対応するオブジェクト CellStyle オブジェクトはWorkbook#createCellStyle() メソッドによって生成します。 さらに、この CellStyle に日付フォーマットを設定するには、DataFormat オブジェクトが必要ですが、これは CreationHelper#createDataFormat() メソッドによって生成します。 そして、その CreationHelper オブジェクトは Workbook#getCreationHelper() メソッドによって取得します。 ふぅ〜。

PoiBuilder による構築


PoiBuilder では

  • CellStyle オブジェクトは cellStyle ノードで生成する
  • DataFormat オブジェクトは PoiBuilder#dataFormat() メソッドで生成する

となっています。 ノードもメソッドも呼び出し方は同じですが、オブジェクトを生成した後に、属性によってプロパティを設定できるかどうかが違います。

@GrabResolver('http://www5.ocn.ne.jp/~coast/repo/')
@Grab('org.waman.tools:poi-builder:0.0.3')

import org.waman.tools.poi.PoiBuilder

def workbook = new PoiBuilder().workbook{
    sheet('new sheet'){
        row(0){
            // スタイルを設定しない場合(long 値が表示されたりする)
            cell(0, cellValue:new Date())

            // 日付のスタイル CellStyle オブジェクトは使い回そう。
            def dateStyle = cellStyle(dataFormat:dataFormat().getFormat('m/d/yy h:mm'))

            cell(1, cellValue:new Date(), cellStyle:dateStyle)
            cell(2, cellValue:Calendar.instance, cellStyle:dateStyle)
        }
    }
}

CellStyle オブジェクト (dateStyle) は、cellStyle ノードによってインスタンスを生成すると同時にdateFormat プロパティを設定しています。 dateFormat() メソッドは DataFormat オブジェクトを生成しますが、属性によってプロパティを設定することはできません*1

Java コードに比べると、だいぶ見通しよく構築が行えているんじゃないでしょうか?

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





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

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


プログラミングGROOVY

プログラミングGROOVY

*1:そもそも、DataFormat クラスに設定できるプロパティはないのでこういう実装にしてるんですけど。 って、この記事書いてて思ったけど、dataFormat() メソッドに String を渡して DataForamt オブジェクトを返すようにした方が簡単そうですね。 そのうち改善します。