先来看看我的代码
package com.starcpdk.easyexcel;
import com.alibaba.excel.EasyExcel;
import com.starcpdk.easyexcel.dto.ExcelStudentDto;
import com.starcpdk.easyexcel.dto.listener.ExcelStudentDtoListener;
import org.junit.Test;
public class ExcelReadTest {
@Test
public void simpleReadXlsx() {
String fileName = "D:/data/code/person/project/borrow/backEnd/alibaba-easyexcel/src/test/java/com/starcpdk/easyexcel/a.xlsx";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet
EasyExcel.read(fileName, ExcelStudentDto.class, new ExcelStudentDtoListener()).sheet().doRead();
}
}
package com.starcpdk.easyexcel.dto.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.starcpdk.easyexcel.dto.ExcelStudentDto;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ExcelStudentDtoListener extends AnalysisEventListener<ExcelStudentDto> {
@Override
public void invoke(ExcelStudentDto excelStudentDto, AnalysisContext analysisContext) {
log.info("解析到一条记录: {} ", excelStudentDto);
System.out.println(excelStudentDto);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
log.info("所有数据解析完成");
}
}
package com.starcpdk.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.*;
import java.util.Date;
@Data
public class ExcelStudentDto {
@ExcelProperty(value = "姓名")
private String name;
@ExcelProperty(value = "生日")
private Date birthday;
@ExcelProperty(value = "薪资")
private Double salary;
}
以上的代码有什么问题呢 , 为什么会导致对象中封装的全部是空呢 , 首先我考虑到是因为我实体类使用了lombok的原因导致的一些隐藏问题 , 于是我换成了手写getset方法 , 但是发现对象中依旧都是空

于时我定位到了easyexcel的本身
我们发现我们的实体类中加的注解没有对属性进行列指定 , 于是我们给
@ExcelProperty(value = "生日")注解中设置一个index , 见如下实体类
package com.starcpdk.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.*;
import java.util.Date;
@Data
public class ExcelStudentDto {
@ExcelProperty(value = "姓名" , index = 0)
private String name;
@ExcelProperty(value = "生日" , index = 1)
private Date birthday;
@ExcelProperty(value = "薪资" , index = 2)
private Double salary;
}
我们发现我们的数据被写入对象中了

上面的原因是因为我在实体类中用 @ExcelProperty(value = "薪资"这个注解给的名称和excel表中的表头没对应上 , 所以他无法识别写入进去 , 当我们加了index属性指定当前属性对应excel表中的那儿列 , 那么他就可以和excel表匹配上了。
本文介绍了在使用EasyExcel进行Excel数据读取时遇到的问题,即实体类中的字段值为空。问题源于Excel列名与实体类注解不匹配。通过在实体类的@ExcelProperty中添加index属性指定列索引,成功解决了数据无法正确映射的问题。此外,还讨论了Lombok在实体类中的使用并未造成此问题。

被折叠的 条评论
为什么被折叠?



