Apache POI Event用户模型将Timestamp值读取为double

我有一个Excel文件,其中有一个时间戳列填写值5/31/2011 5:49:44 PM我正在阅读这个Excel文件使用POI事件模型。 (该实现与http://poi.apache.org/spreadsheet/how-to.html#sxssf中的解释相同 – “XSSF和SAX(Event API)”)上面的时间戳记读取为40694.74287037037,而我没有知道为什么。 我无法将此值重新格式化为date时间格式。

我该如何解决这个问题?

这完全如预期。 Microsoft Excel文件格式将所有date时间存储为自1900/01/01或1904/01/01以来的小数date,具体取决于文件中设置的标志(1904年date窗口标志)。 所以,当你读回原始价值时,1900年1月1日下午6点应该回到1.75

如果您使用的是UserModel代码,可以使用大量帮助程序将其转换回date。 在事件模型中,你必须自己发现(通过检查格式),然后自己调用转换。

你想要的类是DateUtil ,特别是DateUtil.getJavaDate(double)

Apache POI提供了许多这样的事情的例子,我build议你回顾一下像XLS2CSVmra这样的指南。

而且,如果你想要的只是时间,而不考虑当天,那么就是非整数余数,这就是你一天中的一小部分时间。 对于当前小时(下舍入),您可以执行如下操作:

 double date = cell.getNumericCellValue(); // 1.76 double time = date - ((int)date); int hours = time * 24; // 18 

我使用@Gagravarrbuild议的DateUtil.getJavaDate(double)解决scheme。 我只是保留一个额外的检查,以防有人以string格式保存date和POI读取相同。 它工作完美。 谢谢大家的宝贵意见。