1. EasyExcel 入门
1.1 EasyExcel概述
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel工具。
github地址:GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具
1.2 EasyExcel 特点
- Java解析、生成Excel比较有名的框架有Apache poi、jxl,但他们都存在一个严重的问题就是非常的耗内存。
- EasyExcel 重写了poi,使一个3M的excel只需要几M内存,并且再大的excel不会出现内存溢出。
- 64M内存1分钟内读取75M(46W行25列)的Excel。
1.3 环境搭建
1.3.1 测试父项目
修改pom文件
<dependencies><!--测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies>
1.3.2 测试excel项目
- 项目名:zx-test-excel
修改pom,添加依赖<dependencies><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
1.4 基本操作
1.4.1 测试JavaBean
packagecom.czxy.zx.demo01; importcom.alibaba.excel.annotation.ExcelProperty; importlombok.Data; importjava.util.Date; /*** Created by liangtong.*/publicclassStudent { "编号") (privateStringid; "姓名") (privateStringname; "年龄") (privateIntegerage; "电话") (privateStringtelephone; "邮箱") (privateStringemail; "生日") (privateDatebrithday; }
1.4.2 测试文件路径
packagecom.czxy.zx.demo01; importorg.junit.jupiter.api.Test; /*** @author 桐叔* @email liangtong@itcast.cn*/publicclassTestExcel { /*** 获得根路径* @return*/publicStringgetPath() { returnthis.getClass().getResource("/").getPath(); } publicvoidtestPath() { // 测试文件路径Stringpath=getPath() +"student_demo.xls"; System.out.println(path); } }
1.4.3 写操作
- excel 属于 office组件一个软件
- 存在若干版本,大体上划分2种情况,2007前的,2007年后的
- 2003版:扩展名 xls,内容比较少,最大单元格
IV65536
,256列(IV) - 2007版:扩展名 xlsx,内容较多,最大单元格
XFD1048576
,16384列(XFD)
/*** 准备数据* @return*/privateList<Student>getData(){ List<Student>list=newArrayList<Student>(); for(inti=0 ; i<10 ; i++){ Studentstudent=newStudent(); student.setId("stu"+i); student.setName("wang"+i); student.setAge( 18+i ); student.setTelephone("1361234"+i); student.setEmail("wang"+i+"@czxy.com"); student.setBrithday(newDate()); list.add(student); } returnlist; } publicvoidtestWrite(){ Stringfile=getPath() +"student_demo.xls"; //EasyExcel.write(位置,对象).sheet("表名").doWrite(数据);EasyExcel.write(file,Student.class).sheet("班级").doWrite(getData()); }
1.4.3 读操作
- 处理类:
- 处理类需要实现
AnalysisEventListener
接口
packagecom.czxy.zx.demo01; importcom.alibaba.excel.context.AnalysisContext; importcom.alibaba.excel.event.AnalysisEventListener; importcom.czxy.zx.domain.Student; /*** @author 桐叔* @email liangtong@itcast.cn*/publicclassStudentListenerextendsAnalysisEventListener<Student> { publicvoidinvoke(Studentstudent, AnalysisContextanalysisContext) { System.out.println(student); } publicvoiddoAfterAllAnalysed(AnalysisContextanalysisContext) { System.out.println("解析完成"); } } 测试publicvoidtestRead(){ Stringfile=getPath() +"student_demo.xls"; //EasyExcel.read(文件, 封装对象, 处理类).sheet("表").doRead();EasyExcel.read(file, Student.class, newStudentListener()).sheet("班级").doRead(); }