[alibaba/easyexcel]【BUG】EasyExcel读取Excel的时间列,不同版本读取的值不同,并且高版本读取的数据有误

2024-05-16 479 views
7

建议先去看文档 快速开始常见问题 触发场景描述 读取Excel时间列

image

我分别使用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” image

触发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日的格式),导致读取数据无法使用?

回答

8

@HavAnIdea 高版本默认无对象读取获取的是execl格式化后的日期.默认使用的是StringNumberConverter()转换器. 我使用版本为3.0.5 我这边的处理方式是复制出源码的StringNumberConverter(). 然后修改部分代码: image 修改为:

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          

输出为: image

7

可以提供下Excel么?

6

您好,我认为这个bug我可以给出chen-ABC给出的方法之外更好的方式去解决,请给我一些时间来进行修复,谢谢。如果你有其他相关需求或者问题,也可以联系我。

7

尝试升级到最新版本,我测试了没问题,如果还有问题 请重新打开issue