SpringBoot怎么集成EasyExcel应用

SpringBoot怎么集成EasyExcel应用

这篇文章主要讲解了“SpringBoot怎么集成EasyExcel应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么集成EasyExcel应用”吧!

1、介绍

特点:

1、Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是 非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或 者JVM频繁的full gc。
2、EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减 少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一 行行读取数据,逐个解析。
3、EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理 (AnalysisEventListener)。

2、应用场景

1、数据导入:减轻录入工作量
2、数据导出:统计信息归档
3、数据传输:异构系统之间数据传输

3、要实现的效果

sql

CREATETABLE`edu_subject`(`id`char(19)NOTNULLCOMMENT"课程类别ID",`title`varchar(10)NOTNULLCOMMENT"类别名称",`parent_id`char(19)NOTNULLDEFAULT"0"COMMENT"父ID",`sort`intunsignedNOTNULLDEFAULT"0"COMMENT"排序字段",`gmt_create`datetimeNOTNULLCOMMENT"创建时间",`gmt_modified`datetimeNOTNULLCOMMENT"更新时间",PRIMARYKEY(`id`),KEY`idx_parent_id`(`parent_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ciROW_FORMAT=COMPACTCOMMENT="课程科目";

转成->

3、使用

3.1、pom依赖导入

温馨提示:以下版本不能更换,换了可能会不行

com.alibabaeasyexcel2.1.1org.apache.poipoi3.17org.apache.poipoi-ooxml3.17

3.2、controller

packagecom.zhz.serviceedu.controller;importcom.zhz.common.utils.R;importcom.zhz.serviceedu.service.EduSubjectService;importio.swagger.annotations.Api;importio.swagger.annotations.ApiOperation;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.CrossOrigin;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.multipart.MultipartFile;/***

*课程科目前端控制器*

**@authorzhz*@since2021-07-03*/@RestController@RequestMapping("/eduservice/subject")@CrossOrigin@Api(tags="课程科目")publicclassEduSubjectController{@AutowiredprivateEduSubjectServiceeduSubjectService;/***添加课程分类,获取上传过来的文件,把文件内容读取出来*/@PostMapping("/addSubject")@ApiOperation(value="添加课程分类,获取上传过来的文件,把文件内容读取出来")publicRaddSubject(MultipartFilefile){//上传过来的excel文件eduSubjectService.saveSubject(file,eduSubjectService);returnR.ok();}}

3.3、interface

packagecom.zhz.serviceedu.service;importcom.zhz.serviceedu.entity.EduSubject;importcom.baomidou.mybatisplus.extension.service.IService;importorg.springframework.web.multipart.MultipartFile;/***

*课程科目服务类*

**@authorzhz*@since2021-07-03*/publicinterfaceEduSubjectServiceextendsIService{/***添加课程信息**@authorzhz*@date2021/07/0202:18*@paramfile文件对象,用于获取excel文件*@parameduSubjectService方便监听器部分引用*/voidsaveSubject(MultipartFilefile,EduSubjectServiceeduSubjectService);}

3.4、impl

packagecom.zhz.serviceedu.service.impl;importcom.alibaba.excel.EasyExcel;importcom.zhz.serviceedu.entity.EduSubject;importcom.zhz.serviceedu.entity.excel.SubjectData;importcom.zhz.serviceedu.listener.SubjectExcelListener;importcom.zhz.serviceedu.mapper.EduSubjectMapper;importcom.zhz.serviceedu.service.EduSubjectService;importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;importorg.springframework.stereotype.Service;importorg.springframework.web.multipart.MultipartFile;importjava.io.InputStream;/***

*课程科目服务实现类*

**@authorzhz*@since2021-07-03*/@ServicepublicclassEduSubjectServiceImplextendsServiceImplimplementsEduSubjectService{/***添加课程信息**@paramfile文件对象,用于获取excel文件*@parameduSubjectService*@authorzhz*@date2021/07/0202:18*/@OverridepublicvoidsaveSubject(MultipartFilefile,EduSubjectServiceeduSubjectService){try{//文件输入流InputStreamin=file.getInputStream();//调用方法进行读取EasyExcel.read(in,SubjectData.class,newSubjectExcelListener(eduSubjectService)).sheet().doRead();}catch(Exceptione){e.printStackTrace();}}}

3.5、listener

packagecom.zhz.serviceedu.listener;importcom.alibaba.excel.context.AnalysisContext;importcom.alibaba.excel.event.AnalysisEventListener;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.zhz.servicebase.execptionhandler.GuliException;importcom.zhz.serviceedu.entity.EduSubject;importcom.zhz.serviceedu.entity.excel.SubjectData;importcom.zhz.serviceedu.service.EduSubjectService;importlombok.extern.slf4j.Slf4j;importorg.springframework.util.StringUtils;/***@authorzhouhengzhe*@Description:excel监听器*@date2021/7/3上午2:28*/@Slf4jpublicclassSubjectExcelListenerextendsAnalysisEventListener{/***创建有参数构造,传递subjectService用于操作数据库*因为SubjectExcelListener不能交给spring去管理,所以需要自己new,不能注入对象*此处一定要是public,不然永远获取不到对象*/publicEduSubjectServiceeduSubjectService;publicSubjectExcelListener(){}publicSubjectExcelListener(EduSubjectServiceeduSubjectService){this.eduSubjectService=eduSubjectService;}/***读取excel内容,一行一行进行读取,此处全是业务处理*@paramsubjectData*@paramanalysisContext*/@Overridepublicvoidinvoke(SubjectDatasubjectData,AnalysisContextanalysisContext){log.info("进入方法调用");if(StringUtils.isEmpty(subjectData)){thrownewGuliException(20001,"文件数据为空");}//一行一行去读取excel内容,每次读取有两个值,第一个值为一级分类,第二个值为二级分类//判断一级分类是否重复EduSubjectexistOneSubject=this.existOneSubject(eduSubjectService,subjectData.getOneSubjectName());if(StringUtils.isEmpty(existOneSubject)){existOneSubject=newEduSubject();existOneSubject.setParentId("0");//一级分类名称existOneSubject.setTitle(subjectData.getOneSubjectName());eduSubjectService.save(existOneSubject);}//获取一级分类的pid值Stringpid=existOneSubject.getId();//添加二级分类//判断二级分类是否重复EduSubjectexistTwoSubject=this.existTwoSubject(eduSubjectService,subjectData.getTwoSubjectName(),pid);if(StringUtils.isEmpty(existTwoSubject)){existTwoSubject=newEduSubject();existTwoSubject.setParentId(pid);//二级分类名称existTwoSubject.setTitle(subjectData.getTwoSubjectName());eduSubjectService.save(existTwoSubject);}}/***读取完成后执行*/@OverridepublicvoiddoAfterAllAnalysed(AnalysisContextanalysisContext){}/***判断一级分类是否重复*因为课程的的parent_id为0时,代表是一级分类,并且一级分类数据不重复*@parameduSubjectService*@paramname*@return*/privateEduSubjectexistOneSubject(EduSubjectServiceeduSubjectService,Stringname){QueryWrapperwrapper=newQueryWrapper<>();wrapper.eq("title",name);wrapper.eq("parent_id","0");EduSubjectsubject=eduSubjectService.getOne(wrapper);returnsubject;}/***判断二级分类是否重复**@parameduSubjectService*@paramname*@parampid*@return*/privateEduSubjectexistTwoSubject(EduSubjectServiceeduSubjectService,Stringname,Stringpid){QueryWrapperwrapper=newQueryWrapper<>();wrapper.eq("title",name);wrapper.eq("parent_id",pid);EduSubjecteduSubject=eduSubjectService.getOne(wrapper);returneduSubject;}}

3.6、小细节,实体类pojo

因为mybatisplus生成的实体类的主键生成策略是IdType.ID_WORKER,所以需要修改成IdType.ID_WORKER_STR,否则会有转换问题

packagecom.zhz.serviceedu.entity;importcom.baomidou.mybatisplus.annotation.FieldFill;importcom.baomidou.mybatisplus.annotation.IdType;importjava.util.Date;importcom.baomidou.mybatisplus.annotation.TableField;importcom.baomidou.mybatisplus.annotation.TableId;importjava.io.Serializable;importio.swagger.annotations.ApiModel;importio.swagger.annotations.ApiModelProperty;importlombok.Data;importlombok.EqualsAndHashCode;importlombok.experimental.Accessors;/***

*课程科目*

**@authorzhz*@since2021-07-03*/@Data@EqualsAndHashCode(callSuper=false)@Accessors(chain=true)@ApiModel(value="EduSubject对象",description="课程科目")publicclassEduSubjectimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@ApiModelProperty(value="课程类别ID")@TableId(value="id",type=IdType.ID_WORKER_STR)privateStringid;@ApiModelProperty(value="类别名称")privateStringtitle;@ApiModelProperty(value="父ID")privateStringparentId;@ApiModelProperty(value="排序字段")privateIntegersort;@ApiModelProperty(value="创建时间")@TableField(fill=FieldFill.INSERT)privateDategmtCreate;@ApiModelProperty(value="更新时间")@TableField(fill=FieldFill.INSERT_UPDATE)privateDategmtModified;}

感谢各位的阅读,以上就是“SpringBoot怎么集成EasyExcel应用”的内容了,经过本文的学习后,相信大家对SpringBoot怎么集成EasyExcel应用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是恰卡编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

发布于 2022-04-03 22:32:46
分享
海报
25
上一篇:Springboot项目部署的方法 下一篇:springboot怎么整合shiro实现多验证登录功能
目录

    忘记密码?

    图形验证码