![cb49c5bf48abc3a54213aac8a789ed2f.png](https://i-blog.csdnimg.cn/blog_migrate/b667f6c1fb4487f14552bf6e21797b4b.png)
![3cd1272e97b6c7ad62392a4da0b128d9.png](https://i-blog.csdnimg.cn/blog_migrate/96d83e108b4c71f0d02e955dc428c403.png)
![7e2465ba976ff02b82ad17a1bddc7b40.png](https://i-blog.csdnimg.cn/blog_migrate/69c47f613b8a39049fc0352409478210.png)
![6c3998316d7027dfec275d7190c1f28b.png](https://i-blog.csdnimg.cn/blog_migrate/2ef9f6cd8ec3f2e93abe39132380b7a0.png)
EasyExcel-读
依赖:
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.39version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>easyexcelartifactId>
<version>2.1.6version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.10version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
编写导出的实体类:字段和顺序需要和表格一一对应:实体类的属性位置就是表格从左到右的属性
@Data@AllArgsConstructor@NoArgsConstructorpublic class Student {
/**
* 学生姓名
*/
private String name;
/**
* 学生出生日期
*/
private Date birthday;
/**
* 学生性别
*/
private String gender;
/**
* id
*/
private String id;}
读取Excel文件:
/**
* * 最简单的读
* *
1. 创建excel对应的实体对象
* *
2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,
* *
3. 直接读即可
*/
public class ExcelTest {
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelTest.class);
/**
* 工作簿:bookwork
* 工作表:sheet
*/
@Test
public void test01() {
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
//获得工作簿对象
/*
EasyExcel.read()参数:
pathName 文件路径;"d:\\学员信息表.xlsx"
head 每行数据对应的实体;Student.class
readListener 读监听器,每读一样就会调用一次该监听器的invoke方法
*/
ExcelReaderBuilder excelReaderBuilder = EasyExcel.read("学员信息表.xlsx", Student.class, new StudentReadListener());
//获取一个工作表
ExcelReaderSheetBuilder sheet = excelReaderBuilder.sheet();
//读取工作表内容:sheet方法参数:工作表的顺序号(从0开始)或者工作表的名字,不传默认为0
sheet.doRead();
}}
读取Excel的监听器,用于处理读取产生的数据
/**
* 在读的时候,每读一行,就会自动调用监听器的invoke方法,并且把读取的内容自动封装成了一个对象
* @author JUNSHI 405773808@qq.com
* @create 2020-08-27 22:55
*/public class StudentReadListener extends AnalysisEventListener<Student> {
private static final Logger LOGGER = LoggerFactory.getLogger(StudentReadListener.class);
/**
* 每读一样会自动调用这个方法
* @param student 读取的内容自动封装成了一个对象
* @param context
*/
@Override
public void invoke(Student student, AnalysisContext context) {
LOGGER.info("解析到一条数据:{}", JSON.toJSONString(student));
System.out.println("student = " + student);
}
// 全部读完之后,会调用该方法
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}}
运行结果:
2020-08-28 19:47:54.165 = [main] = [INFO ] = c.c.l.StudentReadListener - [invoke,26] - 解析到一条数据:{
"birthday":1584288000000,"gender":"男","name":"学号00"}student = Student(name=学号00, birthday=Mon Mar 16 00:00:00 CST 2020, gender=男, id=null)2020-08-28 19:47:54.173 = [main] = [INFO ] = c.c.l.StudentReadListener - [invoke,26] - 解析到一条数据:{
"birthday":1584288000000,"gender":"男","name":"学号01"}student = Student(name=学号01, birthday=Mon Mar 16 00:00:00 CST 2020, gender=男, id=null)2020-08-28 19:47:54.175 = [main] = [INFO ] = c.c.l.StudentReadListener - [invoke,26] - 解析到一条数据:{
"birthday":1584288000000,"gender":"男","name":"学号02"}student = Student(name=学号02, birthday=Mon Mar 16 00:00:00 CST 2020, gender=男, id=null)2020-08-28 19:47:54.176 = [main] = [INFO ] = c.c.l.StudentReadListener - [invoke,26] - 解析到一条数据:{
"birthday":1584288000000,"gender":"男","name":"学号03"}student = Student(name=学号03, birthday=Mon Mar 16 00:00:00 CST 2020, gender=男, id=null)2020-08-28 19:47:54.177 = [main] = [INFO ] = c.c.l.StudentReadListener - [invoke,26] - 解析到一条数据:{
"birthday":1584288000000,"gender":"男","name":"学号04"}student = Student(name=学号04, birthday=Mon Mar 16 00:00:00 CST 2020, gender=男, id=null)2020-08-28 19:47:54.178 = [main] = [INFO ] = c.c.l.StudentReadListener - [invoke,26] - 解析到一条数据:{
"birthday":1584288000000,"gender":&#