SpringBoot整合EasyExcel进行大数据处理的方法详解
作者:胡安民
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。本文将在SpringBoot中整合EasyExcel进行大数据处理,感兴趣的可以了解一下
EasyExcel
我用过Poi和EasyPoi这些工具总体来说:
- POI 优点我觉得自由,但是迎来的就是复杂度,和大数据量时候性能的缺点
- EasyPoi基于POI 的二次封装,解决了大部分的常用场景,简化了代码,但是特别复杂表格处理还是不行,而且性能的话和poi差不多,简单来说就是简化了Poi的操作,少些点代码
下面来说说今天的主角EasyExcel,这个项目是阿里巴巴开发的开源的,专门针对大数据批量处理,比如100万+的Excel数据这种,会比以上几款要快很多并且性能上也不会太占用系统的资源,但是不好的地方就是,处理不了复杂的表单 ,不能像poi那么自由,所以有得有失,基本日常所需都能办到,特殊场景在可以使用模板的方式,或者使用poi也行
主流操作的excel格式
下面这种分组的也能读取,但是需要跳过前两行的标题
下面演示,基础的入门读和写案例, 需要对数据进行特殊处理,多Sheet,或者同步等需要参考文档,基础会了看文档就简单了
需要的Maven
<dependencies> <!-- 开发web 项目和启动Springboot必须添加的--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.4.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.3.graal</version> <scope>compile</scope> </dependency> </dependencies>
基础读案例
操作的excel
实体类
@Data @Builder @AllArgsConstructor @NoArgsConstructor public class EmployeesEntity { @ExcelProperty(index = 0) private Integer no; //工号 @ExcelProperty(index = 1) private String name; @ExcelProperty(index = 2) private Double fund; @ExcelProperty(index = 3) private Double postSalary; @ExcelProperty(index = 4) private Double performanceOf; @ExcelProperty(index = 5) private Double allWork; @ExcelProperty(index = 6) private Double violations; @ExcelProperty(index = 7) private Double traffic; @ExcelProperty(index = 8) private Double communication; }
读取监听器
一般是异步读取,可以指定同步读取数据(看文档)
public class EmployeesListener extends AnalysisEventListener<EmployeesEntity> { /** * 这个每一条数据解析都会来调用 * * @param data * one row value. Is is same as {@link AnalysisContext#readRowHolder()} * @param context */ @Override public void invoke(EmployeesEntity data, AnalysisContext context) { System.out.println("解析到一条数据:"+JSON.toJSONString(data)); } /** * 所有数据解析完成了 都会来调用 * * @param context */ @Override public void doAfterAllAnalysed(AnalysisContext context) { } }
测试
@Test public void get(){ File file = new File("./src/main/resources/大客户部-薪酬表.xlsx"); String absolutePath = file.getAbsolutePath(); // // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭 EasyExcel.read(absolutePath, EmployeesEntity.class, new EmployeesListener()).sheet().doRead(); }
基础写案例
写可以指定Sheet进行写,还可以指定列进行写,还可以写入图片,简单的合并单元格…下面教程默认写入第一个Sheet中
实体类
@ExcelProperty("字符串标题") 列的标题
@Data public class DemoData { @ExcelProperty("字符串标题") private String string; @ExcelProperty("日期标题") private Date date; @ExcelProperty("数字标题") private Double doubleData; /** * 忽略这个字段 */ @ExcelIgnore private String ignore; }
测试
//生成模拟数据 private List<DemoData> data() { List<DemoData> list = new ArrayList<DemoData>(); for (int i = 0; i < 10; i++) { DemoData data = new DemoData(); data.setString("字符串" + i); data.setDate(new Date()); data.setDoubleData(0.56); list.add(data); } return list; } /** * 最简单的写 * <p>1. 创建excel对应的实体对象 参照{@link DemoData} * <p>2. 直接写即可 */ @Test public void simpleWrite() { // 写 File file = new File("./src/main/resources/DemoData.xlsx"); // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 // 如果这里想使用03 则 传入excelType参数即可 EasyExcel.write(file.getAbsolutePath(), DemoData.class).sheet("DemoData").doWrite(data()); }
Excel模板方式
一般特别复杂的excel,比如发票,等, 一般就需要使用模板的方式,如果使用代码的话太复杂了
准备模块
实体类
@Data public class FillData { private String name; private double number; }
测试
@Test public void simpleFill() { // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替 File templateFileName = new File("./src/main/resources/模板.xlsx"); File fill = new File("./src/main/resources/fillData.xlsx"); // 这里 会填充到第一个sheet, 然后文件流会自动关闭 FillData fillData = new FillData(); fillData.setName("张三"); fillData.setNumber(5.2); EasyExcel.write(fill.getAbsolutePath()).withTemplate(templateFileName.getAbsolutePath()).sheet().doFill(fillData); }
如果是统计表,而且标题是非常复杂的情况下,那么我们使用列表填充会很容易解决(自行看文档)
到此这篇关于SpringBoot整合EasyExcel进行大数据处理的方法详解的文章就介绍到这了,更多相关SpringBoot EasyExcel大数据处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!