使用 POI HSSF API 从 Excel 单元格中读取日期值

2022-09-01 10:20:59

我正在使用POI HSSF API在Java中进行excel操作。我的一个excel单元格中有一个日期值“8 / 1 / 2009”,当我尝试使用HSSF API读取此值时,它会将单元格类型检测为Numitral并返回日期的“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因此此代码将日期转换为双精度!:(

有没有办法像HSSF POI中那样读取日期!?


答案 1

你可以看看:

HSSFDateUtil.isCellDateFormatted()

请参阅 POI 可怕的电子表格格式 API,了解有关 HSSFDateUtil 的更多详细信息:

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

这也为返回Excel和Java日期提供了一些帮助器方法。不过,您需要对不同的日期格式保持警惕...getExcelDate()getJavaDate()


答案 2

如果要以与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
}

推荐