JAVA

POI Excelの形式の適用(標準の場合は指定した形式を適用)対応

2014年6月26日

POIにてYYYY/MM/DD日付の形式を保存したい場合、setCellStyleを使用すればできますが、Excel上で定義されている形式も変更されてしまいます。

また、Excelの形式側のみにすると形式が「標準」の場合、シリアル値になってしまいます。

Date型ではなく、String型にすれば解決するのかと思いますが、Excel上の形式が適応されなくなります。
出力後、該当セルをF2やダブルクリックしてからエンターキー押せば書式が反映されますが、できたら表示された状態から書式反映させたい。

ExcelとPOIをにらめっこしていると、形式が標準の場合、YYYY/MM/DDを入力すると自動的に形式が変更されることがわかりました。

POIでExcelと同じようすにする場合、getDataFormatを用いれば実装できそうです。

XSSFWorkbook wb = (XSSFWorkbook) WorkbookFactory.create(in);
XSSFSheet sheet = wb.getSheetAt(0);
XSSFRow row = sheet.getRow(1);
XSSFCell cellserch = row.getCell(1);
String Date_str = "2014/06/26";
//日付の場合
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
//シリアル値変換
Date indication = format.parse(Date_str);
//セルにデータの挿入
cellserch.setCellValue(indication);
//書式の取得
if((new Short("0")).equals(cellserch.getCellStyle().getDataFormat())){
	//データフォーマットが標準の場合、年月日書式に変更
	XSSFDataFormat xssformat = wb.createDataFormat();
	CellStyle style = wb.createCellStyle();
	style.cloneStyleFrom(cellserch.getCellStyle()); // スタイルを複製する
	style.setDataFormat(xssformat.getFormat("yyyy/mm/dd")); // Excel 組み込みの日付書式
	//書式の挿入
	cellserch.setCellStyle(style);
}

cellserch.getCellStyle().getDataFormat()はBuiltinFormatsの値が取れるみたいです。BuiltinFormatsで0は標準となっていますので、標準のみPOIで定義した形式を適応するという形にしています。

これを用いることで日付だけでなく、時間や数値もあてはまれば好きな形式に変換できるようになるので作業の幅が広がると思います。

BuiltinFormatsの形式

0General
10
20.00
3#,##0
4#,##0.00
5$#,##0_);($#,##0)
6$#,##0_);[Red]($#,##0)
7$#,##0.00);($#,##0.00)
8$#,##0.00_);[Red]($#,##0.00)
90%
0xa0.00%
0xb0.00E+00
0xc# ?/?
0xd# ??/??
0xem/d/yy
0xfd-mmm-yy
0x10d-mmm
0x11mmm-yy
0x12h:mm AM/PM
0x13h:mm:ss AM/PM
0x14h:mm
0x15h:mm:ss
0x16m/d/yy h:mm
// 0x17 - 0x24 reserved for international and undocumented 0x25#,##0_);(#,##0)
0x26#,##0_);[Red](#,##0)
0x27#,##0.00_);(#,##0.00)
0x28#,##0.00_);[Red](#,##0.00)
0x29_(* #,##0_);_(* (#,##0);_(* \-\"_);_(@_)"
0x2a_($* #,##0_);_($* (#,##0);_($* \-\"_);_(@_)"
0x2b_(* #,##0.00_);_(* (#,##0.00);_(* \-\"??_);_(@_)"
0x2c_($* #,##0.00_);_($* (#,##0.00);_($* \-\"??_);_(@_)"
0x2dmm:ss
0x2e[h]:mm:ss
0x2fmm:ss.0
0x30##0.0E+0
0x31@ - This is text format.
0x31 "text" - Alias for "@"

-JAVA
-, , , , ,