easyexcel
easyexcel copied to clipboard
【BUG】EasyExcel读取Excel的时间列,不同版本读取的值不同,并且高版本读取的数据有误
建议先去看文档
快速开始 、常见问题
触发场景描述
读取Excel时间列
我分别使用EasyExcel3.0.5版本、2.2.11版本和2.0.2版本进行了测试
其中,3.0.5版本和2.2.11版本结果一致,Excel时间值为2018-12-15,读取出数据为“12月15日”字符串
2.0.2读取的数据为“43449”
触发Bug的代码
ExcelReaderBuilder read1 = EasyExcel.read(inputStream);
List<Object> objects1 = read1.sheet().doReadSync();
提示的异常或者没有达到的效果 代码没有修改配置,使用默认配置进行读取 对于3.0.5版本和2.2.11版本,读取出的“12月15日”字符串缺少年份无法使用, 2.0.2版本读取出的43449还可以根据天数进行时间计算
所以为什么对时间字段进行特殊的取值设置(将时间字段转换为中文x月y日的格式),导致读取数据无法使用?
@HavAnIdea 高版本默认无对象读取获取的是execl格式化后的日期.默认使用的是StringNumberConverter()
转换器.
我使用版本为3.0.5
我这边的处理方式是复制出源码的StringNumberConverter(). 然后修改部分代码:
修改为:
if (hasDataFormatData) {
if (DateUtils.isADateFormat(cellData.getDataFormatData().getIndex(),cellData.getDataFormatData().getFormat())) {
return NumberDataFormatterUtils.format(cellData.getNumberValue(),
cellData.getDataFormatData().getIndex(), "yyyy\\-mm\\-dd\\ hh:mm:ss", globalConfiguration);
}
return NumberDataFormatterUtils.format(cellData.getNumberValue(),
cellData.getDataFormatData().getIndex(), cellData.getDataFormatData().getFormat(), globalConfiguration);
}
然后注册覆盖
EasyExcel.read(fileName, new NoModelDataListener()).registerConverter(new StringNumberConverter()).sheet(0).doRead();
execl例子:
字符串标题 | 日期标题 | 数字标题 | 123 | ||||
---|---|---|---|---|---|---|---|
字符串0 | 2020年1月1日 | 1 | Jan-20 | 123 | 456 | ||
字符串1 | 2020-01-02 01:01:01 | 2 | |||||
字符串2 | 2020/1/3 1:01 | 3 | |||||
字符串3 | 2020/1/4 1:01 | 4 | |||||
字符串4 | 2020/1/5 1:01 | 5 | |||||
字符串5 | 2020/1/6 1:01 | 6 | |||||
字符串6 | 2020/1/7 1:01 | 7 | |||||
字符串7 | 2020/1/8 1:01 | 8 | |||||
字符串8 | 2020/1/9 1:01 | 9 | |||||
字符串9 | 2020/1/10 1:01 | 10 |
输出为:
可以提供下Excel么?
您好,我认为这个bug我可以给出chen-ABC给出的方法之外更好的方式去解决,请给我一些时间来进行修复,谢谢。如果你有其他相关需求或者问题,也可以联系我。
尝试升级到最新版本,我测试了没问题,如果还有问题 请重新打开issue