【问题标题】:Apache POI Event user model reads Timestamp value as a doubleApache POI 事件用户模型将时间戳值读取为双精度值
【发布时间】:2013-09-17 08:55:24
【问题描述】:

我有一个 excel 文件,其中有一个用值填充的时间戳列 2011 年 5 月 31 日下午 5:49:44 我正在使用 POI 事件模型阅读这个 excel 文件。 (实现与http://poi.apache.org/spreadsheet/how-to.html#sxssf - "XSSF and SAX (Event API)" 中解释的相同) 上面的时间戳值被读取为 40694.74287037037,我不知道为什么。 我无法将此值格式化回日期时间格式。

我该如何解决这个问题?

【问题讨论】:

    标签: java excel apache-poi


    【解决方案1】:

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

    如果您使用的是 UserModel 代码,则有很多帮助程序可将其转回日期。在事件模型中,您必须自己发现这一点(通过检查格式),然后自己调用转换。

    你想要的类是DateUtil,尤其是像DateUtil.getJavaDate(double)这样的方法

    Apache POI 提供了许多执行此类操作的示例,我建议您查看 XLS2CSVmra 之类的内容以获取指南。

    此外,如果您只需要时间,而不考虑当天,请取非整数余数,这就是您一天中时间的一小部分。对于当前小时(向下舍入),您可以执行以下操作:

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

    【讨论】:

    • 不应该是date - ((int)date)吗?
    • 朋友之间的负面时间是什么? ;-) 固定,ta!
    • 非常感谢 Gagravarr,会试一试,如果它解决了我的应用程序所期望的问题,请告诉您
    【解决方案2】:

    我使用了@Gagravarr 建议的 DateUtil.getJavaDate(double) 解决方案。 我只是进行了额外的检查,以防有人以字符串格式保存日期并且 POI 读取相同。 它工作完美。感谢大家提出的所有宝贵建议。

    【讨论】:

      猜你喜欢
      • 2021-12-12
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      相关资源
      最近更新 更多