目录
一、EasyExcel介绍
二、EasyExcel特点
三、Excel基本术语介绍
四、EasyExcel写操作
(1)引入依赖
(2)创建实体类和设置表头
(3)实现最终的添加操作
五、EasyExcel读操作
(1)设置列对应的属性关系
(2)创建读取操作的监听类 AnalysisEventListener
(3)调用方法,实现最终的读取
六、总结
读操作:
写操作:
一、EasyExcel介绍
EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
二、EasyExcel特点
- Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
- EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)
- EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。
三、Excel基本术语介绍
1、整个excel称为:workbook
2、每个workbook里面有很多sheet
3、每个sheet有行、列、单元格
话不多说,上代码!
四、EasyExcel写操作
(1)引入依赖
pom中引入xml相关依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
(2)创建实体类和设置表头
设置表头和添加数据字段
当然这里的属性可以设置多个,为了简单理解我就使用两个属性。
设置表头信息用到了 @ExcelProperty(value = "用户编号") 注解
@ExcelProperty:用来设置表头信息,里面的value为表头文字
public class User {
//设置表头名称
@ExcelProperty(value = "用户编号")
private int id;
//设置表头名称
@ExcelProperty(value = "用户名称")
private String name;
public User() { }
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
(3)实现最终的添加操作
public static void main(String[] args) {
//模拟用户数据
List<User> users = new ArrayList<>();
users.add(new User(1,"张三"));
users.add(new User(2,"李四"));
users.add(new User(3,"王五"));
//设置文件输出的位置和名称(指定Excel文件的生成位置)
//这里的 .xlsx 后缀名是excel文件的后缀名
String filename = "D:\\test01.xlsx";
//调用方法 这里 需要指定写用哪个class去写,
EasyExcel.write(filename,User.class) //这步执行之后就相当于创建了一个workbook整个表格
.sheet("用户列表") //创建一个名为 用户列表 的sheet,
.doWrite(users); // 往sheet写入数据,这里的参数是一个集合
}
运行main方法,之后提示我们说 完成写操作 Finished write.
接着到我们的D盘查看,就有了我们刚刚指定生成的test01.xlsx文件了,接下来让我们打开看看八
这里我们就 完成 了EasyExcel的写操作啦
五、EasyExcel读操作
(1)设置列对应的属性关系
基于上面创建的User实体类进行修改,在@ExcelProperty注解中新添加 index 参数,
index = 0:表示对应excel表格的第一列。1对应第二列
public class User {
//设置表头名称
//设置列对应的属性
@ExcelProperty(value = "用户编号",index = 0)
private int id;
//设置表头名称
//设置列对应的属性
@ExcelProperty(value = "用户名称",index = 1)
private String name;
}
(2)创建读取操作的监听类 AnalysisEventListener
这个监听类EasyExcel已经帮我封装了,我们只需要继承就可以。这里的泛型是表格对应的实体类(也就是我们创建的User)
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.Map;
//这里要继承AnalysisEventListener<T> 加上泛型User(我们自己创建的User)
//实现两个方法
public class ExcelListener extends AnalysisEventListener<User> {
// 一行一行去读取excel内容,把每行的内容封装到User对象
// 注意:这里会从excel第二行开始读取,因为它认为第一行是表头,不读第一行
@Override
public void invoke(User user, AnalysisContext analysisContext) {
//这里我们把user输出,得到每行内容
System.out.println(user);
}
// 这个方法需要自己手动重写 (也是AnalysisEventListener中的方法)
// 读取表头内容 Map<Integer, String> headMap 这个map就是表头的内容
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("表头:" + headMap);
}
//所有操作之后,这个方法会执行 (目前用不到)
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
(3)调用方法,实现最终的读取
读的过程中会自动调用监听器里面的方法,一行一行读取,咱这里面可以读到每行中的内容,封装到User对象中。
public static void main(String[] args) {
//要读取的excel文件位置
String filename = "D:\\test01.xlsx";
// 这里需要传入三个参数:被读取的文件位置、用哪个class去读去、监听器对象(咱们自己创建的那个)
EasyExcel.read(filename, User.class, new ExcelListener())
.sheet() //默认读取第一个sheet,
.doRead(); //完成读,读取结束后文件流会自动关闭
}
运行run方法,查看读取结果
以上就是咱们完成EasyExcel的读和写操作。这里我们简单的做个小总结:
六、总结
读操作:
1、引入依赖
2、创建和excel对饮的实体类,设置excel表头
3、调用EasyExcel方法实现写操作
写操作:
1、引入依赖
2、创建和excel对饮的实体类,设置对应关系
3、创建监听器进行一行一行解析过程(创建类,继承类,封装解析方法)
4、调用EasyExcel方法实现读操作
HZJ,一个在学习路上匍匐前行的小菜鸟...