使用poi api从电子表格中读取时间值

我正在尝试从电子表格中读取date列和时间列。 我能够从表格中退出date列,但不能退出时间列。

例如,我的工作表将具有以下forms的行:

约会时间

2012/11/2 12:15:01

我有以下代码来获取date列:

while(cellIterator.hasNext()) { HSSFCell cell = (HSSFCell)cellIterator.next(); switch(cell.getCellType()){ case HSSFCell.CELL_TYPE_NUMERIC: HSSFCellStyle style = cell.getCellStyle(); if (HSSFDateUtil.isCellDateFormatted(cell)) { d = (Date)getDateValue(cell); SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); System.out.println(dateFormat.format(d)); } } } protected static Object getDateValue(HSSFCell cellDate) { double numericDateValue = cellDate.getNumericCellValue(); Date date = HSSFDateUtil.getJavaDate(numericDateValue); return date; } 

正如你所看到的我使用

HSSFDateUtil.isCellDateFormatted(细胞)

检查单元格是否有date值。 我想知道如果我可以使用任何函数检查单元格是否具有时间值。

Excel表格来自外部来源。 所以,我将无法对其格式进行任何修改。

现在,我得到date列的正确的date值。 但是,对于时间栏,我越来越

1899年12月31日

作为所有行的结果

在Excel中快速入门date和时间。 由于在创build文件格式时有很多意义,但现在看起来很混乱,Excel没有Date或Time或DateTimetypes。 相反,它有什么数字和特殊的格式规则。

如何看这个? input10.5到excel单元格,然后格式化为date+时间。 你会在1900年1月的某个date的中午。

所以,当你问兴趣点是否一个单元格是date格式,没有简单的标志/types来检查。 相反,所有POI都可以读取应用于单元格的格式化string,并查看它是否像date那样可疑。

奖金标志 – 尝试存储1900年2月28日,然后添加一个 – Excel忠实地再现了1900年闰年左右的Lotus 123错误…

通常, DateUtil.isCellDateFormatted(cell)将为Date单元格,Time单元格和Date Time单元格返回true。 然而,有时你可能会得到一个非常奇怪的格式,Excel知道是一个date或时间,但POI不能作为一个。 对于这些,你仍然可以要求单元格的值作为date,POI会将其转换。

所以,就你的情况来说,如果POI说它是date格式的,那么把这个值作为一个date。 现在,看看格式string。 如果它是date查找,格式化为date。 date和时间看? 格式化为您的首选date+时间。 只有时间? 格式化为时间? 时区? 你一定在笑…

哦,只要你不用1900年左右的真实date,你可以在很大程度上只是说DateUtil.isCellDateFormatted(cell) +值<100 – >可能只是一个时间(如果它是一个经过时间> 1)。 如果你的号码是一个整数,它可能只是一个date(但可能是午夜)。 如果它是非int(是 – 记得excel使用浮点数)它可能有一个时间组件。

这是我粗略的尝试获得POI单元格的“仅限date”,“仅限时间”或“date时间”值

  ... private String getCellValueAsString(Cell poiCell){ if (poiCell.getCellType()==Cell.CELL_TYPE_NUMERIC && DateUtil.isCellDateFormatted(poiCell)) { //get date Date date = poiCell.getDateCellValue(); //set up formatters that will be used below SimpleDateFormat formatTime = new SimpleDateFormat("HH:mm:ss"); SimpleDateFormat formatYearOnly = new SimpleDateFormat("yyyy"); /*get date year. *"Time-only" values have date set to 31-Dec-1899 so if year is "1899" * you can assume it is a "time-only" value */ String dateStamp = formatYearOnly.format(date); if (dateStamp.equals("1899")){ //Return "Time-only" value as String HH:mm:ss return formatTime.format(date); } else { //here you may have a date-only or date-time value //get time as String HH:mm:ss String timeStamp =formatTime.format(date); if (timeStamp.equals("00:00:00")){ //if time is 00:00:00 you can assume it is a date only value (but it could be midnight) //In this case I'm fine with the default Cell.toString method (returning dd-MMM-yyyy in case of a date value) return poiCell.toString(); } else { //return date-time value as "dd-MMM-yyyy HH:mm:ss" return poiCell.toString()+" "+timeStamp; } } } //use the default Cell.toString method (returning "dd-MMM-yyyy" in case of a date value) return poiCell.toString(); }