SpringBoot整合EasyExcel二级分类_java easyexcel 分组汇总-程序员宅基地

技术标签: spring boot  SpringBoot  

一、Excel导入导出的应用场景

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

二、EasyExcel简介

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

三、EasyExcel的使用

1、引入pom文件
	<dependencies>
        <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.1</version>
        </dependency>
    </dependencies>
2、创建实体类
@Data
public class ExcelSubjectData{
    
	//设置列对应的属性
    @ExcelProperty(index = 0)
    private String oneSubjectName;

    @ExcelProperty(index = 1)
    private String twoSubjectName;
}
3、创建读取操作的监听器
package com.atguigu.eduservice.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.eduservice.entity.EduSubject;
import com.atguigu.eduservice.entity.excel.ExcelSubjectData;
import com.atguigu.eduservice.service.EduSubjectService;
import com.atguigu.servicebase.handler.GuliException;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

public class SubjectExcelListener extends AnalysisEventListener<ExcelSubjectData> {
    

    //因为SubjectExcelListener不能交给spring进行管理,需要自己new,不能注入其他对象
    public EduSubjectService subjectService;

    public void setSubjectService(EduSubjectService subjectService) {
    
        this.subjectService = subjectService;
    }

    public SubjectExcelListener(EduSubjectService subjectService) {
    
        this.subjectService = subjectService;
    }
    public SubjectExcelListener() {
     }

    //一行一行去读取excle内容,第一个值是一级分类,第二个值是二级分类
    @Override
    public void invoke(ExcelSubjectData excelSubjectData, AnalysisContext analysisContext) {
    
        if(excelSubjectData==null){
    
            throw new GuliException(20001, "文件数据为空");
        }

        // //判断一级分类是否重复
        EduSubject existOneSubject = this.existOneSubject(excelSubjectData.getOneSubjectName(), subjectService);
        //判断一级分类
        if(existOneSubject==null){
    
            existOneSubject=new EduSubject();
            existOneSubject.setTitle(excelSubjectData.getOneSubjectName());
            existOneSubject.setParentId("0");
            subjectService.save(existOneSubject);
        }

        String pid=existOneSubject.getId();
        EduSubject existTwoSubject = this.existTwoSubject(excelSubjectData.getTwoSubjectName(), subjectService, pid);

        //判断二级分类
        if(existTwoSubject==null){
    
            existTwoSubject=new EduSubject();
            existTwoSubject.setTitle(excelSubjectData.getTwoSubjectName());
            existTwoSubject.setParentId(pid);
            subjectService.save(existTwoSubject);
        }

    }

    //判断一级分类是否重复
    private EduSubject existOneSubject(String name,EduSubjectService subjectService){
    
        QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();
        wrapper.eq("title", name);
        wrapper.eq("parent_id", "0");
        EduSubject subject = subjectService.getOne(wrapper);
        return subject;
    }

    //判断二级分类是否重复
    private EduSubject existTwoSubject(String name,EduSubjectService subjectService,String pid){
    
        QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();
        wrapper.eq("title", name);
        wrapper.eq("parent_id",pid);
        EduSubject subject = subjectService.getOne(wrapper);
        return subject;
    }

    //读取完成后执行
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    

    }
}

5、接口
public interface EduSubjectService extends IService<EduSubject> {
    
    void saveSubject(MultipartFile file,EduSubjectService subjectService);
}
6、实现类
    public void saveSubject(MultipartFile file,EduSubjectService subjectService){
    
        InputStream in= null;
        try {
    
            in = file.getInputStream();
        } catch (IOException e) {
    
            e.printStackTrace();
        }
        EasyExcel.read(in, ExcelSubjectData.class, new SubjectExcelListener(subjectService)).sheet().doRead();
    }
7、Controller层
@Autowired
    EduSubjectService subjectService;

    //添加课程
    @PostMapping("addSubject")
    public R addSubject(MultipartFile file){
    
        subjectService.saveSubject(file,subjectService);
        return R.ok();
    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wangbeita/article/details/107472393

智能推荐

新增CSS外观属性(CSS3)_css 附加外观-程序员宅基地

文章浏览阅读120次。新增CSS外观属性(CSS3)文字半透明(CSS3)文字颜色到了CSS3可以采取半透明的格式,语法如下:color:rgba(r,g,b,a) a是alpha透明的意思,取值为0-1之间,如:color:rgba(255,0,0,50%)文字阴影(CSS3)语法:text-shadow:h-shadow v-shadow blur colorh-shadow:必需,水平阴影位置..._css 附加外观

Android开发笔记之发送小表情的实现_android表情如何传输-程序员宅基地

文章浏览阅读2.7k次。本博客主要实现的是像QQ表情的发送以及文字与表情的一起发送我们首先要明白QQ表情的发送其实是一种特别的文本,也是文本的形式,所以我们需要将QQ表情转化为特殊的文本形式 第一步我们先做一个资源工具类,如下所示//我们把表情资源做成一个工具类public class EmoUtils { public static int[] face = new int[] { R.drawable.ee_android表情如何传输

golang encoding/binary 包_encoding/binary bigendian.putuint32-程序员宅基地

文章浏览阅读3.8k次。// ByteOrder规定了如何将字节序列和 16、32或64比特的无符号整数互相转化。type ByteOrder interface { Uint16([]byte) uint16 Uint32([]byte) uint32 Uint64([]byte) uint64 PutUint16([]byte, uint16) PutUint32([]by..._encoding/binary bigendian.putuint32

神州笔记本电脑开机出现CMOS message【已解决】-程序员宅基地

文章浏览阅读3.7w次,点赞13次,收藏25次。配置信息如下开机出现这个The CMOS battery is bad or was recent ly replaced.(If you cont inue to see this message, consult the system user 's guide for more information.)CMOS电池坏了或最近更换过。(如果您继续看到此消息,请参阅系统用户指南以获取更多信息。)按回车A first boot or NVRAM reset condition has been de_cmos message

html期末作业代码网页设计——代码质量好-宠物网(8页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码_网页设计作业成品代码-程序员宅基地

文章浏览阅读1.2k次。HTML5期末大作业:宠物网网站设计——代码质量好-宠物网(8页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 军事、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他 等网页设计题目, A+水平作_网页设计作业成品代码

MySQL 客户端工具_mysql客户端-程序员宅基地

文章浏览阅读803次。MySQL的管理维护工具非常多,除了系统自带的命令行管理工具之外,还有许多其他的图形化管理工具,这里我介绍几个经常使用的MySQL图形化管理工具,供大家参考。1、phpMyAdminhttp://www.phpmyadmin.net/phpMyAdmin是最常用的MySQL维护工具,是一个用PHP开发的基于Web方式架构在网站主机上的MySQL管理工具,支持中文,管理数据库非常方便。不足之处在于对大数据库的备份和恢复不方便。2、MySQLDumperhttp://www.mysqldumper._mysql客户端

随便推点

2019年6月全国程序员工资统计--两个月岗位减少11%,互联网寒冬来了-程序员宅基地

文章浏览阅读6.8k次。本统计采集了某网站6月发布的程序员招聘信息,并统计如下。2019年6月全国程序员平均工资13255元,有所上涨。而5月和4月的工资分别为13041元和12807元。招聘人数招聘人数持续减少月人数4302,3035283,1436269,448有上表可知,两个月招聘人数减少了11%如果,考虑到4月还比5月少一天,那么,情况更加严重。全国各省程...

hdu 1753 大明 A+B_话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。-程序员宅基地

文章浏览阅读440次。话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。 现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。 Input本题目包含多组测试数据,请处理到文件结束。 每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。Output请在一行里面输出输出A+B的..._话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。

小程序人脸核身_verify_mpsdk-程序员宅基地

文章浏览阅读3.9k次。一、先去腾讯云平台开通人脸核身功能,需要填写正确的小程序APPID二、开通后、进入账号信息中->访问管理->访问秘钥,可得到调用API接口的参数:三、进入微信小程序中申请类目:政府/明生 申请成功后、可在接口设置授权中使用。四、在小程序设置中关联第三方平台,记住不要分配开发权限五、下载小程序SDK ,下载位置见步骤1的图。六、根据文档、在小程序代码..._verify_mpsdk

vue之强制刷新子组件:this.$forceUpdate()_forceupdate vue 子组件-程序员宅基地

文章浏览阅读1.5k次。今天发现vue中一个有用的方法this.$forceUpdate()意思:正如方法名定义的那样,强制更新组件内容举个栗子:场景:elementUI , 有个select 选择框,option是个list循环现象:在方法中给select中的value 赋值之后,value改变了但是对应的字典并没有翻译。解决:利用select中change时间,当值改变后执行:this.$forceUpdate(),发现对应的字典也翻译了皆大欢喜,收工!!!另外用途:解决在数组中给某个对象属性直接赋值页面不改_forceupdate vue 子组件

什么是屏幕适配_屏幕适配是什么意思-程序员宅基地

文章浏览阅读2.2k次。Android中屏幕适配就是通过对尺寸单位、图片、文字、布局这四种类型的资源进行合理的设计和规划,在布局时合理利用各种类型的资源,让布局拥有适应能力,能在各种设备下保持良好的展现效果。..._屏幕适配是什么意思

Linux 监控tcp连接数及状态_如何实时监控/proc/net/tcp-程序员宅基地

文章浏览阅读6.1k次,点赞2次,收藏13次。一、查看哪些IP连接本机netstat -an二、查看TCP连接数查看tcp连接数状态 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 统计8080端口上有多少个TCP连接,命令: netstat -ant |grep 80|wc -l TCP连接中有多少个连接状..._如何实时监控/proc/net/tcp

推荐文章

热门文章

相关标签