今回は日付セルの作成 (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 コードに比べると、だいぶ見通しよく構築が行えているんじゃないでしょうか?
作成されるスプレッドシート
- 作者: 竹添直樹,島本多可子,小津美夕紀,亀井隆司
- 出版社/メーカー: 翔泳社
- 発売日: 2011/07/16
- メディア: 大型本
- 購入: 6人 クリック: 217回
- この商品を含むブログ (20件) を見る
- 作者: 関谷和愛,上原潤二,須江信洋,中野靖治
- 出版社/メーカー: 技術評論社
- 発売日: 2011/07/06
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 392回
- この商品を含むブログ (152件) を見る
*1:そもそも、DataFormat クラスに設定できるプロパティはないのでこういう実装にしてるんですけど。 って、この記事書いてて思ったけど、dataFormat() メソッドに String を渡して DataForamt オブジェクトを返すようにした方が簡単そうですね。 そのうち改善します。