因为xlsx文件可能包含数百万行,所以我决定使用poi事件模型,从here(ExampleEventUserModel)获取示例,但发现解析日期格式单元格时出现了一些问题。
例如我在单元格A15中的excel日期01.10.2011,但是xml有:
<c r="A15" s="11"><v>40817</v></c>
它不是日期格式,即使不是以毫秒为单位。
如何解析事件模型的日期?
最好的问候。
答案 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)。