EasyExcel教程
1 EasyExcel是什么
在java开发中,我们时常会遇到,excel数据的导入导出,EasyExcel 就是一个能够帮助我们快速导入导出excel文件的工具,他提供了标准的上传文件工具,以及一些文件解析工具。
2 为什么要使用EasyExcel
excel除了最简单的行对行列对列的表格以外,出现的最多的实际上是复杂的、无规律的表格,这之中包含了大量的合并单元格,读取的时候如果没有便捷的工具,处理起来就会很麻烦。
我们知道,java解析excel的工具有很多,比如Apache POI,JXL。但是这些工具也非常的耗内存,当数据达到一定程度的时候,就及其容易造成内存的溢出。但是EasyExcel就不会出现这些问题。一个3Mb的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几Mb,并且再大的excel也不会出现内存溢出,使用起来更加简单方便。
下面是使用POI的流程
1.创建xsshworkbook / hasfwordbook
2.读取sheet
3.拿到sheet所有行row
4.通过当前行去拿到对应的单元格的值
可以发现非常麻烦,所以我们使用EasyExcel。
3 EasyExcel解决的问题
- 读取excel时产生的内存溢出
- 解析工具使用复杂麻烦
- excel格式解析
4 工作原理
5 EasyExcel 使用方式
-
导入easy excel的依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.1</version> </dependency>
-
给要导出的实体类添加注解
@Data @AllArgsConstructor @NoArgsConstructor public class TbGoodsCategory { @ExcelProperty(index = 0,value = "分类id") private long categoryId; @ExcelProperty(index = 1,value = "分类等级") private long categoryLevel; @ExcelIgnore//不解析到excel private long parentId; @ExcelProperty(index = 2, value = "分类名称") private String categoryName; @ExcelProperty(index = 3, value = "分类排序") }
-
使用easy excel 进行数据的写出
写入相同类型的数据
@Test public void test2() { long l = System.currentTimeMillis(); //文件要存放的本地位置 String path = "C:\\Users\\demo\\Desktop\\test.xlsx"; Integer count = areaService.getCount(); //创建easy excel的写出类构造器 的参数, 告诉构造器我的excel到时候要写到哪里,以及excel的数据是基于哪个模板创建的 int sheetNum = count%10 == 0? count/10 : count/10+1; ExcelWriter build = EasyExcel.write(path,TbGoodsCategory.class).build(); for (int i = 1 ;i <=sheetNum ;i++) { List<TbGoodsCategory> list = areaService.getGoodsListByPage(i); //创建sheet构造器 WriteSheet sheet = EasyExcel.writerSheet("第"+i+"个test").build(); //使用excel对象将数据写入到创建的sheet中 build.write(list,sheet); } build.finish(); System.out.println("_______________________________________________________"); System.out.println("success"); System.out.println("_______________________________________________________"); long l1 = System.currentTimeMillis(); System.out.println(l1-l); }
写入不同类型的数据
@Test public void test3() { long l = System.currentTimeMillis(); //文件要存放的本地位置 String path = "C:\\Users\\demo\\Desktop\\test1.xlsx"; Integer count = areaService.getCount(); //创建easy excel的写出类构造器,告诉其输出位置即可 ExcelWriter build = EasyExcel.write(path,TbGoodsCategory.class).build(); //创建sheet构造器时通过head属性告诉其导出类型的模板 ExcelWriterSheetBuilder 分类等级 = EasyExcel.writerSheet("分类等级").head(TbNewbeeMallGoodsCategory.class); build.write(分类信息源,分类等级); }
-
读入sheet中相同类型的数据源
@Test public void test4() { //文件要存放的本地位置 String path = "C:\\Users\\demo\\Desktop\\test1.xlsx"; //创建easy excel的读取类构造器 的参数, 告诉构造器我的excel在本地的位置,以及读取监听器 ExcelReader build = EasyExcel.read(path,TbGoodsCategory.class, new EasyExcelListenner()).build(); ReadSheet build1 = EasyExcel.readSheet(0).build(); build.read(build1); build.finish(); }
创建读取监听器继承AnalysisEventListenner
public class EasyExcelListenner extends AnalysisEventListenner<TbGoodsCategory>{ @Override //逐行读取excel信息 public void invoke(TbGoodsCategory tbGoodsCategory, AnalysisContext analysisContext) { System.out.println(tbGoodsCategory); } @Override //excel读取完毕后触发执行 public void doAfterAllAnalysed(AnalysisContext analysisContext) { System.out.println("finish"); } }
excel的读取或者写入构造器在使用完毕后一定要调用 finish 方法 。
评论