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

Vee*_*era 30 java excel poi-hssf apache-poi

我正在使用POI HSSF API进行Java中的excel操作.我在我的一个excel单元格中有一个日期值"8/1/2009",当我尝试使用HSSF API读取该值时,它会将单元格类型检测为Numeric并返回我的日期的"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:
}
Run Code Online (Sandbox Code Playgroud)

Cell.getCellType()返回NUMERIC_TYPE,因此此代码将日期转换为double!:(

有没有办法在HSSF POI中读取日期!

Jon*_*Jon 37

你可以看看:

HSSFDateUtil.isCellDateFormatted()
Run Code Online (Sandbox Code Playgroud)

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

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

这也提供了一些返回Excel getExcelDate()和Java日期的辅助方法getJavaDate().你需要对不同的日期格式保持警惕......

  • <rant>我希望那些POI开发者会评论他们的源代码...... </ rant> (10认同)
  • 调用DateUtil.isCellDateFormatted()将是从HSSF和XSSF中释放代码的一步.通过使用全局父代而不是依赖于XLS/XLSX的HSSF/XSSF子代,您可以使代码更具通用性. (2认同)

小智 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
}
Run Code Online (Sandbox Code Playgroud)


Sto*_*bor 6

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

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


小智 6

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

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