一、博客前提
工作中有遇到一个需求,客户提供需要插入数据库的原始数据的excel表格,我去解析表格,将数据插入数据库。当时立马就想到了用hutool的工具类,直接将excel表格内容的转换为我需要的实体对象。网上也有写了很多这种类似的博客,可是我在参考网上博客内容去做,利用hutool解析excel内容转换为实体,但是遇到实体属性为空的问题,本篇博客就作为一个工作笔记记录一下。
二、代码实现
1.引入pom
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.8</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.1.7</version>
</dependency>
2、定义excel转换后实体
@Data
public class GoodFavorOfExcel {
/**
* 宝贝id
*/
private Long id;
/**
* 总收藏量
*/
private Integer totalFavor;
/**
* 时间
*/
private String date;
}
3、解析代码
@PostMapping(value = "getData")
public Resp indexConvert(@RequestParam("file") MultipartFile file) throws IOException {
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
reader.addHeaderAlias("日期", "date");
reader.addHeaderAlias("宝贝ID", "id");
reader.addHeaderAlias("收藏数", "totalFavor");
List<GoodFavorOfExcel> list = reader.readAll(GoodFavorOfExcel.class);
return RespUtil.success();
}
4、excel表格格式
5、结果展示
到这里展示的内容,就已经将excel里的转换为我需要的实体对象list了
三、问题复现即解决
2、
下面来展示下,我参照网上的博客写代码时遇到的问题
通过和上面的图片对比,我们就可以发现在转换数据的时候,虽然数据大小也是和前面的一样有5126条,但是里面的实体内容确实null,原因是因为
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
List<GoodFavorOfExcel> list = reader.readAll(GoodFavorOfExcel.class);
没有对ExcelReader对象增加标题别名,导致hutool工具类底层解析时,无法得知那一列的内容是对应实体里的哪一个属性。这也是网上大多数博客没有讲到的地方。hutoll的api也没有讲到这一点:https://www.hutool.cn/docs/#/poi/Excel%E8%AF%BB%E5%8F%96-ExcelReader。
2、解决方法
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
reader.addHeaderAlias("日期", "date");
reader.addHeaderAlias("宝贝ID", "id");
reader.addHeaderAlias("收藏数", "totalFavor");
解决的方法就是设置标题和别名的对应关系
四、总结
本篇博客仅仅是一个很简单的使用笔记,想要详细了解为什么设置了标题,别名对应关系就可展示数据的读者,可自行查看源码了解原理。