您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发

【原】记一次EasyExcel读取xlsx文件实体bean数据全部为null的问题

不忘初心 不忘初心 2022-06-04 围观() 评论() 点赞() JAVA开发

简介:很早之前使用过一次EasyExcel,换到新公司之后,由于公司自己封装的有Excel工具类,所以就很久没有用过EasyExcel了,最近公司重构底层基础框架,我推荐引入了EasyExcel,本想着给同事秀一波技能,结果没想到分分钟打脸。如山图所示,在使用EasyExcel读取xlsx文件之后,使用index索引对应的方式来映射实体bean,却拿到了一个空对象,里面的字段全部为null,这可真是太操

很早之前使用过一次EasyExcel,换到新公司之后,由于公司自己封装的有Excel工具类,所以就很久没有用过EasyExcel了,最近公司重构底层基础框架,我推荐引入了EasyExcel,本想着给同事秀一波技能,结果没想到分分钟打脸。

记一次EasyExcel读取xlsx文件实体bean数据全部为null的问题_JAVA开发_积微成著

如山图所示,在使用EasyExcel读取xlsx文件之后,使用index索引对应的方式来映射实体bean,却拿到了一个空对象,里面的字段全部为null,这可真是太操蛋了。

以为自己代码哪里写错了,跑去检查了一下之前的代码,发现并没有哪里写错了,读取方式,以及listener都一样,唯一不同的地方就在于,之前的项目中接收入参的java对象没有使用lombok,而这次使用了lombok

以前的代码

package com.gude.reservoir.dto.excel;

import com.alibaba.excel.annotation.ExcelProperty;

/**
 * 用户导入Excel入参
 * Created by SongFei on 2020/5/30.
 */
public class UserImportDTO {

    @ExcelProperty(index = 0)
    private String nickName;

    @ExcelProperty(index = 1)
    private String userName;

    @ExcelProperty(index = 2)
    private String passWord;

    @ExcelProperty(index = 3)
    private String phone;

    @ExcelProperty(index = 4)
    private String idcard;

    @ExcelProperty(index = 5)
    private String status;

    @ExcelProperty(index = 6)
    private String userType;

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getIdcard() {
        return idcard;
    }

    public void setIdcard(String idcard) {
        this.idcard = idcard;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getUserType() {
        return userType;
    }

    public void setUserType(String userType) {
        this.userType = userType;
    }

}

现在的代码

package com.gude.reservoir.dto.excel;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * 坐标表导入Excel入参
 * Created by SongFei on 2022/5/30.
 */
@Data
@EqualsAndHashCode()
@Accessors(chain = true)
public class CoordinateImportDTO {

    /**
     * 编号
     */
    @ExcelProperty(index = 0)
    private String num;

    /**
     * X值
     */
    @ExcelProperty(index = 1)
    private String x;

    /**
     * Y值
     */
    @ExcelProperty(index = 2)
    private String y;

}

我抱着怀疑的态度,将现在的代码中的lombok去掉了,结果就能读取到数据了,WTF。

难道真的就鱼和熊掌不可兼得?

项目中对于lombok的依赖,明显要高于EasyExcel,所以不可能去掉lombok的,但我又想留下EasyExcel,毕竟这东西用来导入Excel文件确实方便很多,能极大地提高开发效率,所以我就继续测试,想让二者兼容一下。

@Data
@EqualsAndHashCode()
@Accessors(chain = true)

大家可以看到,我使用了这3个注解,我逐个测试之后,发现问题出在最后一个注解上,也就是这个@Accessors注解有问题,我将它移除掉之后,就可以正常将读取到的值映射到实体bean上去了。

这个@Accessors注解允许我们在set属性的时候使用链式写法,以前用的不多,但是用过之后就经常喜欢带上它,没想到这一次就翻车了。

public static void main(String[] args) {
    // 链式写法,将set方法的返回值从void改为了this,从而指向这个对象本身
    CoordinateImportDTO dto = new CoordinateImportDTO().setNum("1").setX("1").setY("1");
    System.out.println(dto);
}

翻阅了一下各种文档,就说是EasyExcel与@Accessors不兼容,但是官网竟然么有对此做出解释,一个字,绝!

EasyExcelPOI

看完文章,有任何疑问,请加入群聊一起交流!!!

很赞哦! ()

文章评论

  • 请先说点什么
    人参与,条评论

请使用电脑浏览器访问本页面,使用手机浏览器访问本页面会导致下载文件异常!!!

雨落无影

关注上方公众号,回复关键字【下载】获取下载码

用完即删,每次下载需重新获取下载码

若出现下载不了的情况,请及时联系站长进行解决

站点信息

  • 网站程序:spring + freemarker
  • 主题模板:《今夕何夕》
  • 文章统计:篇文章
  • 标签管理标签云
  • 微信公众号:扫描二维码,关注我们