一、问题描述
使用EasyExcel读取文件数据时,出现数据无法读取情况。
二、使用EasyExcel的版本
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
三、场景复现
使用了@Accessors(chain = true)
(lombok.experimental.Accessors
)注解导致无法读取excel文件中的数据。
读取对象定义如下:
@Data
@Accessors(chain = true)
@EqualsAndHashCode
public class DemoDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "编号")
@ExcelProperty("编号")
private String number;
@ApiModelProperty(value = "名称")
@ExcelProperty("名称")
private String name;
}
读取逻辑如下:
private List<DemoDTO> parseExcelFileData(MultipartFile multipartFile) {
List<DemoDTO> demoDTOList = new ArrayList<>();
// 创建临时文件
File excelFile = FileUtil.createTempFile();
try {
// 文件转换
multipartFile.transferTo(excelFile);
Assert.notNull(excelFile, "文件不存在,请重新上传");
EasyExcel.read(FileUtil.getInputStream(Objects.requireNonNull(excelFile))).sheet("Sheet1")
.head(DemoDTO.class)
.headRowNumber(1)
.registerReadListener(new AnalysisEventListener<DemoDTO>() {
@Override
public void invoke(DemoDTO data, AnalysisContext context) {
// 获取当前index
// Integer currentRowNum = context.readRowHolder().getRowIndex();
// 校验格式
if (BeanUtil.isNotEmpty(data)) {
demoDTOList.add(data);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
log.info("数据读取完毕");
}
}).doRead();
} catch (Exception e) {
log.error("文件解析失败", e);
} finally {
FileUtil.del(excelFile);
}
return demoDTOList;
}
四、问题修复
定义的映射类中不能使用@Accessors(chain = true)
(lombok.experimental.Accessors
)注解。
@Data
@EqualsAndHashCode
public class DemoDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "编号")
@ExcelProperty("编号")
private String number;
@ApiModelProperty(value = "名称")
@ExcelProperty("名称")
private String name;
}