SpringBoot整合EasyExcel进行大数据处理的方法详解

网友投稿 1338 2022-10-04

SpringBoot整合EasyExcel进行大数据处理的方法详解

SpringBoot整合EasyExcel进行大数据处理的方法详解

目录EasyExcel需要的Maven基础读案例操作的excel实体类读取-测试基础写案例实体类测试Excel模板方式准备模块实体类测试

EasyExcel

EasyExcel文档

我用过Poi和EasyPoi这些工具总体来说:

POI 优点我觉得自由,但是迎来的就是复杂度,和大数据量时候性能的缺点EasyPoi基于POI 的二次封装,解决了大部分的常用场景,简化了代码,但是特别复杂表格处理还是不行,而且性能的话和poi差不多,简单来说就是简化了Poi的操作,少些点代码

下面来说说今天的主角EasyExcel,这个项目是阿里巴巴开发的开源的,专门针对大数据批量处理,比如100万+的Excel数据这种,会比以上几款要快很多并且性能上也不会太占用系统的资源,但是不好的地方就是,处理不了复杂的表单 ,不能像poi那么自由,所以有得有失,基本日常所需都能办到,特殊场景在可以使用模板的方式,或者使用poi也行

主流操作的excel格式

下面这种分组的也能读取,但是需要跳过前两行的标题

下面演示,基础的入门读和写案例, 需要对数据进行特殊处理,多Sheet,或者同步等需要参考文档,基础会了看文档就简单了

需要的Maven

org.springframework.boot

spring-boot-starter-web

2.4.1

com.alibaba

easyexcel

3.1.0

org.projectlombok

lombok

junit

junit

test

com.alibaba

fastjson

2.0.3.graal

compile

基础读案例

操作的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 {

/**

* 这个每一条数据解析都会来调用

*

* @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) {

eNmRTFD }

}

测试

@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 data() {

List list = new ArrayList();

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;

}

/**

* 最简单的写

*

1. 创建excel对应的实体对象 参照{@link DemoData}

*

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);

}

如果是统计表http://,而且标题是非常复杂的情况下,那么我们使用列表填充会很容易解决(自行看文档)

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:小程序引导用户授权的思路及项目实现方法(附代码)(小程序授权管理)
下一篇:【github myLocker】线程切换调试,读写指针修改文件,socket 阻塞设置
相关文章

 发表评论

暂时没有评论,来抢沙发吧~