嚎羸的博客

因为Hexo是静态博客,部署多有不便,建议查看我的语雀文档

0%

EasyExcel简单示例

EasyExcel概述

EasyExcel

EasyExcel特点

1、Java领域解析生成Excel在早期有名的框架有Apache poi,jxl等,但是他们都存在一个非常严重的问题,就是非常消耗内存

假如系统并发量提高,一定会OOM或者频繁full GC

2、EasyExcel由阿里巴巴提供的一个开源的excel处理框架,以使用简单,节省内存著称。它能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载进内存中,而是一行一行读取,诸葛解析

3、EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理

使用EasyExcel进行写操作

最简单的写操作

1、新建一个新的maven项目:excel-easydemo

2、引入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>

因为EasyExcel是对POI进行的改进,所以我们需要POI,并且easyexcel对应poi的版本不能有问题

建议为了开发方面,顺便引入swagger和lombok

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>

3、创建一个实体类,要和excel中的数据进行对应,excel中的数据的列对应着实体类中的数据,比如:

image-20201014123336990

表中现在有一级分类和二级分类,那么在实体类中就需要一级分类和二级分类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.howling.excel;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

@Data
public class DemoData {
//学生编号,设置excel的表头
@ExcelProperty("学生编号")
private Integer sno;
//学生名字,设置excel的表头
@ExcelProperty("学生名字")
private String sname;
}

4、编写代码进行easyexcel的写操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.howling.excel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;

import java.util.ArrayList;
import java.util.List;

public class TestEasyExcel {
public static void main(String[] args) {

//实现excel写操作

//1、设置写入的文件夹的地址和easyexcel名称
String fileName = "E:\\write.xlsx";

//2、调用easyexcel实现写操作
ExcelWriterBuilder write = EasyExcel.write(fileName, DemoData.class);
//设置sheet的名称,doWrite里要放入要写的集合
write.sheet("学生列表").doWrite(getData());

}

private static List<DemoData> getData() {
List<DemoData> list = new ArrayList<DemoData>();

for (int i = 10; i > 0; i--) {
DemoData demoData = new DemoData();
demoData.setSno(i);
demoData.setSname("姓名" + i);
list.add(demoData);
}
return list;
}
}

image-20201014124711142

使用EasyExcel进行读操作

最简答的读操作

1、在写操作的基础上,对实体类进行设置,添加列对应的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.howling.excel;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

@Data
public class ReadData {
//设置列对应的属性,这表示的是第一列
@ExcelProperty(value = "学生编号", index = 0)
private Integer sno;
//这表示第二列
@ExcelProperty(value = "学生姓名", index = 1)
private String sname;
}

2、建立一个监听器,在读操作需要一个监听器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.howling.excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellData;

import java.util.Map;

public class ExcelListener extends AnalysisEventListener<DemoData> {

/**
* 一行一行读取,但是不读取表头
*
* @param demoData
* @param analysisContext
*/
public void invoke(DemoData demoData, AnalysisContext analysisContext) {
System.out.println("*******" + demoData);
}

/**
* 读取表头
*
* @param headMap
* @param context
*/
public void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context) {
System.out.println("表头:" + headMap);
}

/**
* 读取完成之后做的事情
*
* @param analysisContext
*/
public void doAfterAllAnalysed(AnalysisContext analysisContext) {

}
}

3、最终方法的调用

1
2
3
4
5
6
7
8
public static void main(String[] args) {

// writeExcel();
//设置读取的文件夹的地址和easyexcel名称
String fileName = "E:\\write.xlsx";

EasyExcel.read(fileName,DemoData.class,new ExcelListener()).sheet().doRead();
}

image-20201014125738321


指定EasyExcel从指定的行数开始读取数据

只需要设置headRowNumber即可

1
2
3
4
5
6
7
public class TestEasyExcel {
public static void main(String[] args) {

String fileName = "E:\\write.xlsx";
//headRowNumber(2):表示第二行也是表头,那么读取数据就从第三行开始读取
EasyExcel.read(fileName,DemoData.class,new ExcelListener()).sheet().headRowNumber(2).doRead();
}