web-dev-qa-db-ja.com

POI HSSF APIを使用してExcelセルから日付値を読み取る

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を返すため、このコードは日付を2倍に変換します! :(

HSSF POIにある日付を読み取る方法はありますか?

30
Veera

あなたは見てみることができます:

_HSSFDateUtil.isCellDateFormatted()
_

HSSFDateUtilの詳細については、POI Horrible Spreadsheet Format APIをご覧ください。

http://poi.Apache.org/apidocs/org/Apache/poi/hssf/usermodel/HSSFDateUtil.html

また、Excel getExcelDate()およびJava dates getJavaDate()。)を返すためのヘルパーメソッドも提供されます。ただし、異なる日付形式には注意が必要です.

37
Jon

Excelファイルと同じ形式で日付を参照する場合は、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
}
21
Sayantam

Excelは日付と時刻を数字として扱います...

ただし、質問に記入したサンプルコードは http://poi.Apache.org/spreadsheet/quick-guide.html#CellContents にあります。

6
Stobor

POI 3.5を使用している場合は、次を使用できます

cell.getDateCellValue()メソッド。これはExcel 2007でも機能します。

6
Naveen

POI 3.15 beta3以降、一部の関数は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());
}
0