我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot怎么集成EasyExcel应用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot怎么集成EasyExcel应用

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

1、介绍

特点:

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

2、应用场景

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

3、要实现的效果

sql

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 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 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT COMMENT="课程科目";

SpringBoot怎么集成EasyExcel应用

转成->

SpringBoot怎么集成EasyExcel应用

3、使用

3.1、pom依赖导入

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

<dependency>            <groupId>com.alibaba</groupId>            <artifactId>easyexcel</artifactId>            <version>2.1.1</version>        </dependency><!--xls-->        <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi</artifactId>            <version>3.17</version>        </dependency>        <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi-ooxml</artifactId>            <version>3.17</version>        </dependency>

3.2、controller

package com.zhz.serviceedu.controller;import com.zhz.common.utils.R;import com.zhz.serviceedu.service.EduSubjectService;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;@RestController@RequestMapping("/eduservice/subject")@CrossOrigin@Api(tags = "课程科目")public class EduSubjectController {    @Autowired    private EduSubjectService eduSubjectService;        @PostMapping("/addSubject")    @ApiOperation(value = "添加课程分类,获取上传过来的文件,把文件内容读取出来")    public R addSubject(MultipartFile file){        //上传过来的excel文件        eduSubjectService.saveSubject(file,eduSubjectService);        return R.ok();    }}

3.3、interface

package com.zhz.serviceedu.service;import com.zhz.serviceedu.entity.EduSubject;import com.baomidou.mybatisplus.extension.service.IService;import org.springframework.web.multipart.MultipartFile;public interface EduSubjectService extends IService<EduSubject> {        void saveSubject(MultipartFile file, EduSubjectService eduSubjectService);}

3.4、impl

package com.zhz.serviceedu.service.impl;import com.alibaba.excel.EasyExcel;import com.zhz.serviceedu.entity.EduSubject;import com.zhz.serviceedu.entity.excel.SubjectData;import com.zhz.serviceedu.listener.SubjectExcelListener;import com.zhz.serviceedu.mapper.EduSubjectMapper;import com.zhz.serviceedu.service.EduSubjectService;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import org.springframework.stereotype.Service;import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;@Servicepublic class EduSubjectServiceImpl extends ServiceImpl<EduSubjectMapper, EduSubject> implements EduSubjectService {        @Override    public void saveSubject(MultipartFile file, EduSubjectService eduSubjectService) {        try {            //文件输入流            InputStream in = file.getInputStream();            //调用方法进行读取            EasyExcel.read(in, SubjectData.class,new SubjectExcelListener(eduSubjectService)).sheet().doRead();        }catch (Exception e){            e.printStackTrace();        }    }}

3.5、listener

package com.zhz.serviceedu.listener;import com.alibaba.excel.context.AnalysisContext;import com.alibaba.excel.event.AnalysisEventListener;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.zhz.servicebase.execptionhandler.GuliException;import com.zhz.serviceedu.entity.EduSubject;import com.zhz.serviceedu.entity.excel.SubjectData;import com.zhz.serviceedu.service.EduSubjectService;import lombok.extern.slf4j.Slf4j;import org.springframework.util.StringUtils;@Slf4jpublic class SubjectExcelListener extends AnalysisEventListener<SubjectData> {        public EduSubjectService eduSubjectService;    public SubjectExcelListener() {    }    public SubjectExcelListener(EduSubjectService eduSubjectService) {        this.eduSubjectService = eduSubjectService;    }        @Override    public void invoke(SubjectData subjectData, AnalysisContext analysisContext) {        log.info("进入方法调用");        if (StringUtils.isEmpty(subjectData)){            throw new GuliException(20001,"文件数据为空");        }        //一行一行去读取excel内容,每次读取有两个值,第一个值为一级分类,第二个值为二级分类        //判断一级分类是否重复        EduSubject existOneSubject = this.existOneSubject(eduSubjectService, subjectData.getOneSubjectName());        if (StringUtils.isEmpty(existOneSubject)){            existOneSubject=new EduSubject();            existOneSubject.setParentId("0");            //一级分类名称            existOneSubject.setTitle(subjectData.getOneSubjectName());            eduSubjectService.save(existOneSubject);        }        //获取一级分类的pid值        String pid=existOneSubject.getId();        //添加二级分类        // 判断二级分类是否重复        EduSubject existTwoSubject = this.existTwoSubject(eduSubjectService, subjectData.getTwoSubjectName(), pid);        if (StringUtils.isEmpty(existTwoSubject)){            existTwoSubject=new EduSubject();            existTwoSubject.setParentId(pid);            //二级分类名称            existTwoSubject.setTitle(subjectData.getTwoSubjectName());            eduSubjectService.save(existTwoSubject);        }    }        @Override    public void doAfterAllAnalysed(AnalysisContext analysisContext) {    }        private EduSubject existOneSubject(EduSubjectService eduSubjectService,String name){        QueryWrapper<EduSubject> wrapper=new QueryWrapper<>();        wrapper.eq("title",name);        wrapper.eq("parent_id","0");        EduSubject subject = eduSubjectService.getOne(wrapper);        return subject;    }        private EduSubject existTwoSubject(EduSubjectService eduSubjectService,String name,String pid){        QueryWrapper<EduSubject> wrapper=new QueryWrapper<>();        wrapper.eq("title",name);        wrapper.eq("parent_id",pid);        EduSubject eduSubject = eduSubjectService.getOne(wrapper);        return eduSubject;    }}

3.6、小细节,实体类pojo

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

package com.zhz.serviceedu.entity;import com.baomidou.mybatisplus.annotation.FieldFill;import com.baomidou.mybatisplus.annotation.IdType;import java.util.Date;import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableId;import java.io.Serializable;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.Data;import lombok.EqualsAndHashCode;import lombok.experimental.Accessors;@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;}

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot怎么集成EasyExcel应用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot怎么集成EasyExcel应用

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

SpringBoot怎么整合EasyExcel

这篇文章主要介绍“SpringBoot怎么整合EasyExcel”,在日常操作中,相信很多人在SpringBoot怎么整合EasyExcel问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot怎
2023-06-21

springboot集成postgresql使用怎么实现

要在Spring Boot应用程序中集成PostgreSQL数据库,可以按照以下步骤进行:1、添加PostgreSQL依赖在Spring Boot项目的pom.xml文件中添加PostgreSQL的依赖:
springboot集成postgresql使用怎么实现
2024-04-18

Nginx怎么与Redis集成应用

Nginx和Redis可以通过一些插件和模块来实现集成应用。以下是一种常见的方式:使用nginx-http-redis模块:这个模块可以让Nginx与Redis进行通信,实现缓存和负载均衡等功能。你可以在编译Nginx时添加这个模块,或者通
Nginx怎么与Redis集成应用
2024-05-06

SpringBoot怎么集成Druid连接MySQL8.0.11

这篇“SpringBoot怎么集成Druid连接MySQL8.0.11”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spri
2023-06-08

SpringBoot项目里怎么集成Hibernate

本篇内容介绍了“SpringBoot项目里怎么集成Hibernate”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Spring Boot项
2023-07-05

SpringBoot中怎么集成Swagger文档

在SpringBoot中集成Swagger文档,可以通过以下步骤:添加Swagger依赖:在项目的pom.xml文件中添加Swagger的依赖:io.springfox
SpringBoot中怎么集成Swagger文档
2024-03-07

使用SpringBoot怎么对Spring AOP进行集成

今天就跟大家聊聊有关使用SpringBoot怎么对Spring AOP进行集成,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。需要的jar包添加到工程里。新增Maven依赖如下:
2023-05-31

怎么使用Spring integration在Springboot中集成Mqtt

今天小编给大家分享一下怎么使用Spring integration在Springboot中集成Mqtt的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下
2023-07-05

什么是应用集成?

应用集成是一种将应用程序无缝连接起来的技术,旨在提高效率、自动化流程并改善用户体验。通过整合数据、功能和事件,集成应用程序可带来诸如提高效率、增强协作、改进用户体验、降低成本和获得竞争优势等诸多好处。常见的集成方法包括API集成、ESB集成和数据集成。虽然应用集成存在数据质量、安全性和复杂性等挑战,但遵循最佳实践,如定义明确的目标、选择合适的集成方法并进行全面测试,可以确保成功的集成。
什么是应用集成?
2024-04-02

EasyExcel怎么引用

今天小编给大家分享一下EasyExcel怎么引用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前提导出数据到Excel是非常
2023-06-27

SpringBoot集成如何使用Redis

小编给大家分享一下SpringBoot集成如何使用Redis,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!SpringBoot集成使用redisJedis 是 Redis 官方推出的一款面向 Java 的客户端,提供了很多
2023-06-29

SpringBoot怎么集成P6Spy实现SQL日志

本篇内容介绍了“SpringBoot怎么集成P6Spy实现SQL日志”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!P6Spy简介P6Spy是
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录