解析大型xlsx文件,日期格式大小写

时间:2012-01-19 05:46:07

标签: java date apache-poi xlsx

因为xlsx文件可能包含数百万行,所以我决定使用poi事件模型,从here(ExampleEventUserModel)获取示例,但发现解析日期格式单元格时出现了一些问题。

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

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

它不是日期格式,即使不是以毫秒为单位。

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

最好的问候。

2 个答案:

答案 0 :(得分:4)

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

POI的HSSFCell有一个getDateCellValue()方法,可以返回Java Date,并且可以执行您想要的操作。

答案 1 :(得分:3)

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

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

为了确定该格式,您必须在关联的numFmtId中查找引用样式xf的{​​{1}}属性,并尝试确定该格式是否为日期格式。为了做到这一点,你必须应用一些启发式方法。

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

P.S。 OOXML标准确实为styles.xml类型属性定义了d日期值,但这仅用于ISO 8601日期,这些日期实际上并不是由Excel生成的。 (更新:此日期格式现在在严格模式下用于Excel 2013)。