赞
踩
目录
(2)创建读取操作的监听类 AnalysisEventListener
EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。
1、整个excel称为:workbook
2、每个workbook里面有很多sheet
3、每个sheet有行、列、单元格
话不多说,上代码!
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>
设置表头和添加数据字段
当然这里的属性可以设置多个,为了简单理解我就使用两个属性。
设置表头信息用到了 @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 + '\'' +
- '}';
- }
- }
- 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的写操作啦
基于上面创建的User实体类进行修改,在@ExcelProperty注解中新添加 index 参数,
index = 0:表示对应excel表格的第一列。1对应第二列
- public class User {
- //设置表头名称
- //设置列对应的属性
- @ExcelProperty(value = "用户编号",index = 0)
- private int id;
- //设置表头名称
- //设置列对应的属性
- @ExcelProperty(value = "用户名称",index = 1)
- private String name;
- }
这个监听类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) {
-
- }
- }
读的过程中会自动调用监听器里面的方法,一行一行读取,咱这里面可以读到每行中的内容,封装到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,一个在学习路上匍匐前行的小菜鸟...
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。