POI HSSF APIを使用してExcelセルから日付値を読み取る
-
21-08-2019 - |
質問
Java での Excel 操作に POI HSSF API を使用しています。Excel セルの 1 つに日付値「8/1/2009」があり、HSSF API を使用してこの値を読み取ろうとすると、セルのタイプが数値として検出され、日付の「Double」値が返されます。以下のサンプルコードを参照してください。
cell = row.getCell(); // date in the cell '8/1/2009'
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
cellValue = cell.getRichStringCellValue().getString();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
cellValue = new Double(cell.getNumericCellValue()).toString();
break;
default:
}
Cell.getCellType() は NUMERIC_TYPE を返すため、このコードは日付を double に変換します。:(
HSSF POIの日付をそのまま読む方法はないでしょうか!?
解決
あなたは見てみることができます:
HSSFDateUtil.isCellDateFormatted()
HSSFDateUtilの詳細については、POI恐ろしいスプレッドシート形式のAPIを参照してください。
http://poi.apache.org/ apidocs / ORG / apacheの/ポイ/ HSSF / usermodel / HSSFDateUtil.htmlする
また、ExcelのgetExcelDate()
を返すためのいくつかのヘルパーメソッドを提供し、JavaはgetJavaDate()
をさかのぼること。あなたは、異なる日付形式のやや警戒する必要があるけれども...
他のヒント
は、あなたがCellDateFormatterを使用する必要があります。サンプルコード:
CellValue cValue = formulaEv.evaluate(cell);
double dv = cValue.getNumberValue();
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = HSSFDateUtil.getJavaDate(dv);
String dateFmt = cell.getCellStyle().getDataFormatString();
/* strValue = new SimpleDateFormat(dateFmt).format(date); - won't work as
Java fmt differs from Excel fmt. If Excel date format is mm/dd/yyyy, Java
will always be 00 for date since "m" is minutes of the hour.*/
strValue = new CellDateFormatter(dateFmt).format(date);
// takes care of idiosyncrasies of Excel
}
Excelでは日付と時刻が数値として扱われます...ジョンの方がよく言ったので、ここでは繰り返しません...
ただし、質問に入力したサンプルコードは次のとおりです。 http://poi.apache.org/spreadsheet/quick-guide.html#CellContents
は、あなたが使用できるPOI 3.5を使用している場合は、次の
cell.getDateCellValue()メソッド。これは、同様にExcel 2007のために動作します。
POI 3.15ベータ3以来、いくつかの機能がdeprecated
です。
あなたは、データの形式を確認し、Java Date
として取得することができます。
SimpleDateFormat format = new SimpleDateFormat("");
String cellValue;
if(cell != null && cell.getCellTypeEnum() != CellType.STRING &&
cell.getCellTypeEnum() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)){
cellValue = format.format(cell.getDateCellValue());
}