【问题标题】:Reading date values from excel cell using POI HSSF API使用 POI HSSF API 从 excel 单元格中读取日期值
【发布时间】:2023-12-14 05:13:01
【问题描述】:

我正在使用 POI HSSF API 在 Java 中进行 excel 操作。我的一个 Excel 单元格中有一个日期值“8/1/2009”,当我尝试使用 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 中的日期!?

【问题讨论】:

    标签: java excel apache-poi poi-hssf


    【解决方案1】:

    你可以看看:

    HSSFDateUtil.isCellDateFormatted()
    

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

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

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

    【讨论】:

    • 我希望那些 POI 开发人员能评论他们的源代码......
    • 调用 DateUtil.isCellDateFormatted() 将在将您的代码从 HSSF 和 XSSF 中解放出来的方式上领先一步。通过使用全局父代而不是依赖 XLS/XLSX 的 HSSF/XSSF 子代,您可以使您的代码更加通用。
    • POI lib HSSFDateUtil 的最新版本已弃用,请改用 DateUtil。
    【解决方案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
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的链接
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        从 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());
        }
        

        【讨论】: