SpringBoot整合EasyExcel(3)

本文介绍了如何在SpringBoot项目中使用EasyExcel进行高效内存优化的Excel读写操作,包括创建实体类、编写读写代码示例,以及在实际场景中如添加课程分类的实践应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot整合EasyExcel

==============================================================================

1.EasyExcel简介


  • Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或 者JVM频繁的full gc。

  • EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一 行行读取数据,逐个解析。

  • EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理 (AnalysisEventListener)

2.使用EasyExcel实现写


2.1 创建实体类

创建与Excel对应的实体类

/**

  • @author xppll

  • @date 2021/12/3 10:05

*/

@Data

public class DemoData {

//设置excel表头名称,index表示对应的第几列

@ExcelProperty(value = “学生编号”,index = 0)

private Integer sno;

@ExcelProperty(value = “学生姓名”,index = 1)

private String sname;

}

ExcelProperty:指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index=0,以此类推。

2.2 测试写Excel

/**

  • @author xppll

  • @date 2021/12/3 10:08

*/

public class TestWriteExcel {

public static void main(String[] args) {

//实现excel写的操作

//1.设置写入文件夹的地址和excel文件名称

String fileName = “D:\write.xlsx”;

//2.调用easyexcel里面方法实现写操作

//传入:文件存放的路径+对应的实体类class

EasyExcel.write(fileName, DemoData.class).sheet(“学生列表”).doWrite(getData());

}

//创建方法返回list集合(测试数据)

private static List getData() {

List list = new ArrayList<>();

for (int i = 0; i < 10; i++) {

DemoData data = new DemoData();

data.setSno(i);

data.setSname(“lucy” + i);

list.add(data);

}

return list;

}

}

结果如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R51xa0VB-1638630992973)(SpringBoot项目整合EasyExcel.assets/image-20211203105225367.png)]

3.使用EasyExcel实现读


3.1 创建读取操作的监听器

/**

  • @author xppll

  • @date 2021/12/3 10:29

*/

public class ExcelListener extends AnalysisEventListener {

/**

  • 一行一行读取Excel中的内容

  • @param data

  • @param analysisContext

*/

@Override

public void invoke(DemoData data, AnalysisContext analysisContext) {

System.out.println(“****” + data);

}

/**

  • 读取表头

  • @param headMap

  • @param context

*/

@Override

public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {

System.out.println(“表头:”+headMap);

}

/**

  • 读取完成之后做的事

  • @param analysisContext

*/

@Override

public void doAfterAllAnalysed(AnalysisContext analysisContext) {

}

}

3.2 测试读Excel

/**

  • @author xppll

  • @date 2021/12/3 10:35

*/

public class TestReadExcel {

public static void main(String[] args) {

//读取文件的路径

String fileName = “D:\write.xlsx”;

//传入三个参数:文件路径+封装的类的class+监听器

EasyExcel.read(fileName, DemoData.class,new ExcelListener())

.sheet()

.doRead();

}

}

控制台输出如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ugT2UNpq-1638630992975)(SpringBoot项目整合EasyExcel.assets/image-20211203105451947.png)]

4.springboot项目实践EasyExcel


通过在后台管理上传excel文件添加课程分类(一共两级分类)

4.1 pom中引入相关依赖

com.alibaba

easyexcel

3.0.5

4.2 创建数据库表及添加数据

这里创建一个课程表用EasyExcel实现课程的分类

CREATE TABLE edu_subject (

id char(19) NOT NULL COMMENT ‘课程类别ID’,

title varchar(10) NOT NULL COMMENT ‘类别名称’,

parent_id char(19) NOT NULL DEFAULT ‘0’ COMMENT ‘父ID’,

sort int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘排序字段’,

gmt_create datetime NOT NULL COMMENT ‘创建时间’,

gmt_modified datetime NOT NULL COMMENT ‘更新时间’,

PRIMARY KEY (id),

KEY idx_parent_id (parent_id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT=‘课程科目’;

INSERT INTO edu_subject VALUES (‘1178214681118568449’,‘后端开发’,‘0’,1,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681139539969’,‘Java’,‘1178214681118568449’,1,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681181483010’,‘前端开发’,‘0’,3,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681210843137’,‘JavaScript’,‘1178214681181483010’,4,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681231814658’,‘云计算’,‘0’,5,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681252786178’,‘Docker’,‘1178214681231814658’,5,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681294729217’,‘Linux’,‘1178214681231814658’,6,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681324089345’,‘系统/运维’,‘0’,7,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681353449473’,‘Linux’,‘1178214681324089345’,7,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681382809602’,‘Windows’,‘1178214681324089345’,8,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681399586817’,‘数据库’,‘0’,9,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681428946945’,‘MySQL’,‘1178214681399586817’,9,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681454112770’,‘MongoDB’,‘1178214681399586817’,10,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681483472898’,‘大数据’,‘0’,11,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681504444418’,‘Hadoop’,‘1178214681483472898’,11,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681529610242’,‘Spark’,‘1178214681483472898’,12,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681554776066’,‘人工智能’,‘0’,13,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681584136193’,‘Python’,‘1178214681554776066’,13,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681613496321’,‘编程语言’,‘0’,14,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178214681626079234’,‘Java’,‘1178214681613496321’,14,‘2019-09-29 15:47:25’,‘2019-09-29 15:47:25’),(‘1178585108407984130’,‘Python’,‘1178214681118568449’,2,‘2019-09-30 16:19:22’,‘2019-09-30 16:19:22’),(‘1178585108454121473’,‘HTML/CSS’,‘1178214681181483010’,3,‘2019-09-30 16:19:22’,‘2019-09-30 16:19:22’);

4.3 实体类

@Data

public class SubjectData {

@ExcelProperty(index = 0)

private String oneSubjectName;

@ExcelProperty(index = 1)

private String twoSubjectName;

}

/**

  • 课程科目

  • @author xppll

  • @since 2021-12-03

*/

@Data

@EqualsAndHashCode(callSuper = false)

@Accessors(chain = true)

@ApiModel(value=“EduSubject对象”, description=“课程科目”)

public class EduSubject implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty(value = “课程类别ID”)

@TableId(value = “id”, type = IdType.ID_WORKER_STR)

private String id;

@ApiModelProperty(value = “类别名称”)

private String title;

@ApiModelProperty(value = “父ID”)

private String parentId;

@ApiModelProperty(value = “排序字段”)

private Integer sort;

@ApiModelProperty(value = “创建时间”)

@TableField(fill = FieldFill.INSERT)

private Date gmtCreate;

@ApiModelProperty(value = “更新时间”)

@TableField(fill = FieldFill.INSERT_UPDATE)

private Date gmtModified;

}

4.4 Controller层

@Autowired

private EduSubjectService subjectService;

//添加课程分类

//获取前端上传过来的excel文件,把文件内容读取出来保存到数据库

@PostMapping(“addSubject”)

public R addSubject(MultipartFile file){

subjectService.saveSubject(file,subjectService);

return R.ok();

}

4.5 Service层

//添加课程分类

@Override

public void saveSubject(MultipartFile file, EduSubjectService subjectService) {

try {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。

很多人担心学了容易忘,这里教你一个方法,那就是重复学习。

打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。

从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。

人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
t=“img” style=“zoom: 33%;” />

总结

上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。

很多人担心学了容易忘,这里教你一个方法,那就是重复学习。

打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。

从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。

[外链图片转存中…(img-Xy9IFhQy-1713411460233)]

人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值