关于java:解析大xlsx文件,日期格式案例

Parsing large xlsx file, Date format case

因为 xlsx 文件可能包含百万行,所以我决定使用 poi 事件模型,从这里(ExampleEventUserModel)举个例子,但发现解析日期格式单元格时有些问题。

例如,我在单元格 A15 中有 excel 日期 01.10.2011,但 xml 有:

1
<c r="A15" s="11"><v>40817</v></c>

它不是日期格式,例如甚至不是毫秒。

如何解析事件模型的日期?

最好的问候。


Excel 将日期存储为从固定起点开始的浮点天数(和天数的小数部分)。 40817 值是从该起点到 2011 年 10 月 1 日的天数。

POI\\ 的 HSSFCell 有一个返回 Java DategetDateCellValue() 方法,并且会做你想做的事。


关于如何确定单元格是否包含日期值的后续问题,答案是没有任何简单的方法。

单元格 <c> 元素具有类型属性 t,但它不用于此 Excel 序列日期类型。因此,唯一区分包含编码为 40817 的日期的单元格和具有值 40817 的单元格的是应用于数字的格式(通过 s 单元格属性引用)。

为了确定该格式,您必须在关联的 styles.xml 中查找引用样式 xfnumFmtId 属性,并尝试确定该格式是否为日期格式。为了做到这一点,您必须应用一些启发式方法。

总而言之,当您希望将日期与其他数字数据区分开来时,这是一个巨大的痛苦,对我来说,这是 SpreadsheetML 格式的疏忽。

附言OOXML 标准确实为 t 类型属性定义了一个 d 日期值,但这仅用于并非由 Excel 实际生成的 ISO 8601 日期。 (更新:此日期格式现在在 Excel 2013 中以严格模式使用)。