天天看点

easyExcel 读取数据为空怎么办?

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址:https://github.com/alibaba/easyexcel 文档地址:https://www.yuque.com/easyexcel/doc/easyexcel

目录

1、问题起因

2、源码片段

3、@Accessors注解的作用

4、解决方法

今天在帮助一位朋友解决easy Excel读取Excel表格信息时,程序反馈显示,读取内容为空,但是经过断点调试跟踪排查,发现程序能够读取到Excel里面的表头,以及行数等信息,唯一的问题就是读取到的实体类列表字段熟悉全部都是null,最后经过查阅相关资料得以解决问题。

由于这位朋友为了方便,使用lombok插件,其实本身使用lombok插件是没有问题的,但是由于使用不当,就有可能造成莫名奇妙的问题。在lombok中有一个注解为<code>@Accessors(chain =</code><code>true</code><code>),</code><code>其中</code>chain的中文含义是链式的,设置为true,表示该实体对象支持链式编程,否则不支持链式编程。

当Excel每行数据解析后, 会调用 buildStringList 将解析到的数据由Map转存到Bean中, 关键代码如下:

可见, EasyExcel是使用 <code>net.sf.cglib.beans.BeanMap</code> 工具类拷贝的, 这正是造成 使用<code>@Accessors(chain = true)</code>后, EasyExcel解析不到数据的原因所在.

为什么使用了<code>@Accessors(chain = true)</code>后, <code>BeanMap</code> 会拷贝不成功呢?

使set方法返回的不是void, 而是当前对象

可见, 需要使用BeanMap从Map拷贝到Bean, 需要Map 的Key与Bean的变量名一致, 并有对应的 set方法, 且set方法为 void, 才能拷贝成功。所以目前只能不使用这个注解即可解决该问题。

继续阅读