关于easyExcel中读取Excel表头的实例说明

网友投稿 2687 2022-10-02

关于easyExcel中读取Excel表头的实例说明

关于easyExcel中读取Excel表头的实例说明

目录前言1 环境准备1 添加pom2 添加dto对象3 准备一个控制器4 准备一个监听类2 单表头Excel3 多表头Excel4 总结

前言

在使用easyExcel读取文件时,对于Excel的表头,在解析读取时分成不同的状态,需要加以区分.

1 环境准备

准备一个可以正常访问的SpringBoot项目.

1 添加pom

com.alibaba

easyexcel

3.0.5

org.springframework.boot

ybCCbOMspring-boot-starter-web

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-test

test

2 添加dto对象

// 表格对应实体类

@Data

public class EasyExcelDemo {

@ExcelProperty("标题")

private String string;

@ExcelProperty("日期")

private Date date;

@ExcelProperty("金额")

private Double money;

/**

* 忽略这个字段

*/

@ExcelIgnore

private String name;

}

// 返回对象

@Data

public class Resp {

private List importList;

}

3 准备一个控制器

@RestController

@RequestMapping("/easyExcel")

@Slf4j

public class EasyExcelController {

@PostMapping("/upload")

public void upload(@RequestParam("file") MultipartFile file) throws IOException {

// 读取Excel

EasyExcel.read(file.getInputStream(), EasyExcelDemo.class,

new EasyExcelListener()).sheet().headRowNumber(1).doRead();

// 从监听中获取结果集

Resp resp = EasyExcelListener.RESP.get();

List

log.info("导入集合 list = {}http://", importList);

// 清除数据

EasyExcelListener.RESP.remove();

}

}

4 准备一个监听类

@Slf4j

public class EasyExcelListener extends AnalysisEventListener {

public static List importList = new ArrayList<>();

public static final ThreadLocal RESP = new ThreadLocal<>();

@Override

public void invoke(EasyExcelDemo data, AnalysisContext context) {

log.info("解析到的一条数据: excelRow = {}", data);

importList.add(data);

}

@Override

public void doAfterAllAnalysed(AnalysisContext context) {

// 解析完所有excel行, 保存到数据库或进行业务处理

log.info("解析的所有数据 list = {}", importList);

Resp resp = new Resp();

resp.setImportList(importList);

RESP.set(resp);

}

@Override

public void invokeHeadMap(Map headMap, AnalysisContext context) {

log.info("表头数据 excelHead= {}", headMap);

}

}

2 单表头Excel

单表头Excel, 即Excel的表头只有一行.

如上单行表头, 在读取时,在EasyExcel读取时设置headRowNumber属性,表示Excel的表头的行数,默认为1,设置为1时,表示第一行是表头,从第二行是表数据

EasyExcel.read(file.getInputStream(), EasyExcelDemo.class,

new EasyExcelListener()).sheet().headRowNumber(1).doRead();

使用postman上传excel查看结果:

读取到Excel的表头

读取到Excel的表数据

3 多表头Excel

多表头Excel, 即Excel的表头有多行.

如上单行表头, 在读取时,在EasyExcel读取时设置headRowNumber属性,表示Excel的表头的行数,设置为2时,表示第二和之前行都是表头.

EasyExcel.read(file.getInputStream(), EasyExcelDemo.class, new EasyExcelListener()).sheet().headRowNumber(2).doRead(); EasyExcel.read(file.getInputStream(), EasyExcelDemo.class,

new EasyExcelListener()).sheet().headRowNumber(2).doRead();

使用postman上传excel查看结果:

读取到Excel的表头, 读取到第一行

接着读取表头第二行

读取到Excel的表数据

4 总结

关于EasyExcel的表格读取,使用起来比较方便,但是对于多表头和单表头的读取,需要注意,是按照一层层的解析的.即再一些特殊的场景,需要校验表格的表头是否正确等, 要注意多表头的读取按照行数顺序读取数据.

log.info("导入集合 list = {}http://", importList);

// 清除数据

EasyExcelListener.RESP.remove();

}

}

4 准备一个监听类

@Slf4j

public class EasyExcelListener extends AnalysisEventListener {

public static List importList = new ArrayList<>();

public static final ThreadLocal RESP = new ThreadLocal<>();

@Override

public void invoke(EasyExcelDemo data, AnalysisContext context) {

log.info("解析到的一条数据: excelRow = {}", data);

importList.add(data);

}

@Override

public void doAfterAllAnalysed(AnalysisContext context) {

// 解析完所有excel行, 保存到数据库或进行业务处理

log.info("解析的所有数据 list = {}", importList);

Resp resp = new Resp();

resp.setImportList(importList);

RESP.set(resp);

}

@Override

public void invokeHeadMap(Map headMap, AnalysisContext context) {

log.info("表头数据 excelHead= {}", headMap);

}

}

2 单表头Excel

单表头Excel, 即Excel的表头只有一行.

如上单行表头, 在读取时,在EasyExcel读取时设置headRowNumber属性,表示Excel的表头的行数,默认为1,设置为1时,表示第一行是表头,从第二行是表数据

EasyExcel.read(file.getInputStream(), EasyExcelDemo.class,

new EasyExcelListener()).sheet().headRowNumber(1).doRead();

使用postman上传excel查看结果:

读取到Excel的表头

读取到Excel的表数据

3 多表头Excel

多表头Excel, 即Excel的表头有多行.

如上单行表头, 在读取时,在EasyExcel读取时设置headRowNumber属性,表示Excel的表头的行数,设置为2时,表示第二和之前行都是表头.

EasyExcel.read(file.getInputStream(), EasyExcelDemo.class, new EasyExcelListener()).sheet().headRowNumber(2).doRead(); EasyExcel.read(file.getInputStream(), EasyExcelDemo.class,

new EasyExcelListener()).sheet().headRowNumber(2).doRead();

使用postman上传excel查看结果:

读取到Excel的表头, 读取到第一行

接着读取表头第二行

读取到Excel的表数据

4 总结

关于EasyExcel的表格读取,使用起来比较方便,但是对于多表头和单表头的读取,需要注意,是按照一层层的解析的.即再一些特殊的场景,需要校验表格的表头是否正确等, 要注意多表头的读取按照行数顺序读取数据.

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[leetcode] 179. Largest Number
下一篇:[leetcode] 764. Largest Plus Sign
相关文章

 发表评论

暂时没有评论,来抢沙发吧~