30

我正在使用 POI HSSF API 进行 Java 中的 excel 操作。我的一个 Excel 单元格中有一个日期值“2009 年 8 月 1 日”,当我尝试使用 HSSF API 读取该值时,它会将单元格类型检测为数字并返回我的日期的“双倍”值。请参阅下面的示例代码:

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,因此此代码将日期转换为双倍!:(

有什么方法可以读取 HSSF POI 中的日期!?

4

5 回答 5

39

你可以看看:

HSSFDateUtil.isCellDateFormatted()

有关 HSSFDateUtil 的更多详细信息,请参阅 POI Horrible Spreadsheet Format API:

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

这也提供了一些帮助方法来返回 ExcelgetExcelDate()和 Java 日期getJavaDate()。不过,您需要对不同的日期格式有所警惕......

于 2009-05-14T07:05:44.383 回答
21

如果您想以与 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
}
于 2011-08-31T18:09:37.460 回答
6

Excel 将日期和时间视为数字...... Jon 说得更好,所以我不会在这里附和他......

但是,您在问题中提出的示例代码位于http://poi.apache.org/spreadsheet/quick-guide.html#CellContents

于 2009-05-14T07:10:36.837 回答
6

如果您使用 POI 3.5,您可以使用以下

cell.getDateCellValue() 方法。这也适用于 excel 2007。

于 2010-08-04T07:38:47.760 回答
0

从 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());
}
于 2017-08-21T11:07:36.027 回答