解析大型xlsx文件,日期格式问题

3

由于XLSX文件可能包含数百万行数据,因此我决定使用POI事件模型,并从这里(ExampleEventUserModel)进行了参考。但是,在解析日期格式单元格时遇到了一些问题。

例如,在Excel中,我有一个日期为2011年10月1日的单元格A15,但XML中却显示为:

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

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

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

最好的问候。

2个回答

4

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

POI的HSSFCell有一个getDateCellValue()方法,它返回一个Java Date对象,并且可以实现您想要的功能。


谢谢,另外,如何确定该单元格是日期格式,它没有“t”属性,或者s =“11”表示它是日期? - Rinat Tainov
2
s= 属性是一个样式引用。请参见 https://dev59.com/EnA75IYBdhLWcg3wsrWD - Jim Garrison

3
关于您的后续问题,如何确定单元格是否包含日期值,答案是没有简便的方法。
单元格元素具有类型属性t,但不用于此Excel序列日期类型。因此,仅区分包含40817编码的日期和值为40817的单元格的唯一方法是应用于该数字的格式(通过s单元格属性引用)。
为了确定该格式,您需要查找关联的styles.xml中引用样式xfnumFmtId属性,并尝试确定该格式是否为日期格式。为此,您需要应用一些启发式方法。
总之,当您希望区分日期与其他数字数据时,这是一个巨大的痛苦,对我来说,这是电子表格ML格式的一个疏忽。
P.S. OOXML标准确实为t类型属性定义了d日期值,但这仅用于ISO 8601日期,实际上并不由Excel生成。(更新:在Excel 2013中的严格模式下现在使用此日期格式)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接