excel直接打开看到的日期格式和poi读取到的日期格式不一样
现象:
- 创建一个excel.xlsx文件,输入一个日期,将其格式选择为自定义类型 yyyy/m/d h:mm 并保存
- 可以看到,日期格式确实变成了类似于2021/1/10 1:15的样子
- 使用poi读取该文件,发现读取到的该单元格的数据为m/d/yy h:mm格式,并不是上面在excel中看到的yyyy/m/d h:mm格式。
poi版本 4.1.2 excel版本 2019 重现几率 100%
原因
- 解压缩上述excel文件,在sheet1.xml中可以找到对应的cell数据,在style.xml中找到cellXfs对应的样式,可以看到其 numFmtId=”22”
- 查看poi源码,找到BuiltinFormats类,查看其注释上有如下列表,可以看到22对应16进制0x16的时间样式为m/d/yy h:mm
- poi会使用22查找样式,这样找到的是m/d/yy h:mm,而不是我们设置的yyyy/m/d h:mm类型,这就解释了为啥poi读到的和我们看到的不一致了。
/**
- 0, “General”
- 1, “0”
- 2, “0.00”
- 3, “#,##0”
- 4, “#,##0.00”
- 5, “$#,##0_);($#,##0)”
- 6, “$#,##0_);Red“
- 7, “$#,##0.00);($#,##0.00)”
- 8, “$#,##0.00_);Red“
- 9, “0%”
- 0xa, “0.00%”
- 0xb, “0.00E+00”
- 0xc, “# ?/?”
- 0xd, “# ??/??”
- 0xe, “m/d/yy”
- 0xf, “d-mmm-yy”
- 0x10, “d-mmm”
- 0x11, “mmm-yy”
- 0x12, “h:mm AM/PM”
- 0x13, “h:mm:ss AM/PM”
- 0x14, “h:mm”
- 0x15, “h:mm:ss”
- 0x16, “m/d/yy h:mm”
*<p> - // 0x17 - 0x24 reserved for international and undocumented
- 0x25, “#,##0_);(#,##0)”
- 0x26, “#,##0_);Red“
- 0x27, “#,##0.00_);(#,##0.00)”
- 0x28, “#,##0.00_);Red“
- 0x29, “(* #,##0);(* (#,##0);(* "-");(@_)”
- 0x2a, “($* #,##0);($* (#,##0);($* "-");(@_)”
- 0x2b, “(* #,##0.00);(* (#,##0.00);(* "-"??);(@_)”
- 0x2c, “($* #,##0.00);($* (#,##0.00);($* "-"??);(@_)”
- 0x2d, “mm:ss”
- 0x2e, “[h]:mm:ss”
- 0x2f, “mm:ss.0”
- 0x30, “##0.0E+0”
- 0x31, “@” - This is text format.
- 0x31 “text” - Alias for “@”
-
*/
猜测
猜测可能和国家地区有关,poi应该只对应美国地区,而excel在中国电脑上安装的,有本地化适配。
转载请注明出处:https://www.huangchaoyu.com/2021/10/12/excel直接打开看到的日期格式和poi读取到的日期格式不一样/