web-dev-qa-db-ja.com

Apache POIで日付を持つExcelセルを読み取る方法

Apache POI 3.6を使用しています。このような日付のExcelファイルを読みたい8/23/1991

 switch (cell.getCellType()) {

   ...
   ...

   case HSSFCell.CELL_TYPE_NUMERIC:
     value = "NUMERIC value=" + cell.getNumericCellValue();
     break;

   ...

 }

しかし、数値型を取り、次のような値を返します33473.0

運が悪かったのですが、Numeric Cell Typeを使用しようとしました。

dbltemp=row.getCell(c, Row.CREATE_NULL_AS_BLANK).getNumericCellValue();

if (c == 6 || c == 9) {
    strTemp= new String(dbltemp.toString().trim());

    long tempDate = Long.parseLong(strTemp);
    Date date = new Date(tempDate);

    strVal = date.toString();
}

問題を修正するにはどうすればよいですか?

52
Venkat

どのセル、つまり各行の列の位置が0であることがわかっている場合は、row.getCell(0).getDateCellValue()に直接アクセスできます。
http://poi.Apache.org/apidocs/org/Apache/poi/hssf/usermodel/HSSFCell.html#getDateCellValue()

更新:次に例を示します。これを上記のスイッチケースコードに適用できます。数値と日付の値をチェックして印刷しています。この場合、シートの最初の列には日付があるため、row.getCell(0)を使用します。

スイッチケースでif (HSSFDateUtil.isCellDateFormatted ..コードブロックを直接使用できます。

if (row.getCell(0).getCellType() == HSSFCell.CELL_TYPE_NUMERIC)
    System.out.println ("Row No.: " + row.getRowNum ()+ " " +
        row.getCell(0).getNumericCellValue());

    if (HSSFDateUtil.isCellDateFormatted(row.getCell(0))) {
        System.out.println ("Row No.: " + row.getRowNum ()+ " " + 
            row.getCell(0).getDateCellValue());
    }
}

出力は

Row No.: 0 39281.0
Row No.: 0 Wed Jul 18 00:00:00 IST 2007
Row No.: 1 39491.0
Row No.: 1 Wed Feb 13 00:00:00 IST 2008
Row No.: 2 39311.0
Row No.: 2 Fri Aug 17 00:00:00 IST 2007
94
JoseK

はい、あなたの問題を理解しました。識別が困難な場合は、セルに数値またはデータ値があります。

Excelに表示される形式のデータが必要な場合は、DataFormatterクラスを使用してセルを書式設定するだけです。

DataFormatter dataFormatter = new DataFormatter();
String cellStringValue = dataFormatter.formatCellValue(row.getCell(0));
System.out.println ("Is shows data as show in Excel file" + cellStringValue);  // Here it automcatically format data based on that cell format.
// No need for extra efforts 
8
Chintan

DateUtilsが必要です。詳細については、 この記事 を参照してください。

または、POIの代わりにAndy KhanのJExcelを使用することをお勧めします。

0
duffymo

CellDateFormatterを使用して、Excelセルと同じ形式で日付を取得できます。次のコードを参照してください。

CellValue cv = formulaEv.evaluate(cell);
double dv = cv.getNumberValue();
if (HSSFDateUtil.isCellDateFormatted(cell)) {
    Date date = HSSFDateUtil.getJavaDate(dv);

    String df = cell.getCellStyle().getDataFormatString();

    strValue = new CellDateFormatter(df).format(date); 
}
0
Abhishek Mishra

日付セルを読み取る場合、このメソッドはこれまでのところ堅牢であることが証明されています。

private LocalDate readCellAsDate(final Row row, final int pos) {
    if (pos == -1) {
        return null;
    }
    final Cell cell = row.getCell(pos - 1);
    if (cell != null) {
        cell.setCellType(CellType.NUMERIC);
    } else {
        return null;
    }
    if (DateUtil.isCellDateFormatted(cell)) {
        try {
            return cell.getDateCellValue().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        } catch (final NullPointerException e) {
            logger.error(e.getMessage());
            return null;
        }
    }
    return null;
}
0
yglodt

セル番号がわかっている場合は、getDateCellValue()メソッドを使用することをお勧めしますSystem.out.println(date);

0
user1416932