最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成EasyExcel的應用場景分析

 更新時間:2021年07月12日 10:37:44   作者:zhz小白弟弟  
這篇文章主要介紹了SpringBoot集成EasyExcel的應用場景,java領域解析、生成excel比較有名的框架有apache poi、jxl等,今天通過實例代碼給大家詳細介紹,需要的朋友可以參考下

1、介紹

官網(wǎng)地址:https://www.yuque.com/easyexcel
特點:

1、Java領域解析、生成Excel比較有名的框架有Apache poi、jxl等。但他們都存在一個嚴重的問題就是 非常的耗內(nèi)存。如果你的系統(tǒng)并發(fā)量不大的話可能還行,但是一旦并發(fā)上來后一定會OOM或 者JVM頻繁的full gc。
2、EasyExcel是阿里巴巴開源的一個excel處理框架,以使用簡單、節(jié)省內(nèi)存著稱。EasyExcel能大大減 少占用內(nèi)存的主要原因是在解析Excel時沒有將文件數(shù)據(jù)一次性全部加載到內(nèi)存中,而是從磁盤上一 行行讀取數(shù)據(jù),逐個解析。
3、EasyExcel采用一行一行的解析模式,并將一行的解析結果以觀察者的模式通知處理 (AnalysisEventListener)。

2、應用場景

1、數(shù)據(jù)導入:減輕錄入工作量
2、數(shù)據(jù)導出:統(tǒng)計信息歸檔
3、數(shù)據(jù)傳輸:異構系統(tǒng)之間數(shù)據(jù)傳輸

3、要實現(xiàn)的效果

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 '創(chuàng)建時間',
  `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='課程科目';

在這里插入圖片描述

轉(zhuǎn)成->

在這里插入圖片描述

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;

/**
 * <p>
 * 課程科目 前端控制器
 * </p>
 *
 * @author zhz
 * @since 2021-07-03
 */
@RestController
@RequestMapping("/eduservice/subject")
@CrossOrigin
@Api(tags = "課程科目")
public class EduSubjectController {

    @Autowired
    private EduSubjectService eduSubjectService;

    /**
     * 添加課程分類,獲取上傳過來的文件,把文件內(nèi)容讀取出來
     */
    @PostMapping("/addSubject")
    @ApiOperation(value = "添加課程分類,獲取上傳過來的文件,把文件內(nèi)容讀取出來")
    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;

/**
 * <p>
 * 課程科目 服務類
 * </p>
 *
 * @author zhz
 * @since 2021-07-03
 */
public interface EduSubjectService extends IService<EduSubject> {

    /**
     * 添加課程信息
     *
     * @author zhz
     * @date 2021/07/02 02:18
     * @param file 文件對象,用于獲取excel文件
     * @param eduSubjectService 方便監(jiān)聽器部分引用
     */
    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;

/**
 * <p>
 * 課程科目 服務實現(xiàn)類
 * </p>
 *
 * @author zhz
 * @since 2021-07-03
 */
@Service
public class EduSubjectServiceImpl extends ServiceImpl<EduSubjectMapper, EduSubject> implements EduSubjectService {

    /**
     * 添加課程信息
     *
     * @param file 文件對象,用于獲取excel文件
     * @param eduSubjectService
     * @author zhz
     * @date 2021/07/02 02:18
     */
    @Override
    public void saveSubject(MultipartFile file, EduSubjectService eduSubjectService) {
        try {
            //文件輸入流
            InputStream in = file.getInputStream();
            //調(diào)用方法進行讀取
            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;

/**
 * @author zhouhengzhe
 * @Description: excel監(jiān)聽器
 * @date 2021/7/3上午2:28
 */
@Slf4j
public class SubjectExcelListener extends AnalysisEventListener<SubjectData> {

    /**
     * 創(chuàng)建有參數(shù)構造,傳遞subjectService用于操作數(shù)據(jù)庫
     * 因為SubjectExcelListener不能交給spring去管理,所以需要自己new,不能注入對象
     * 此處一定要是public,不然永遠獲取不到對象
     */
    public EduSubjectService eduSubjectService;
    public SubjectExcelListener() {
    }
    public SubjectExcelListener(EduSubjectService eduSubjectService) {
        this.eduSubjectService = eduSubjectService;
    }

    /**
     * 讀取excel內(nèi)容,一行一行進行讀取,此處全是業(yè)務處理
     * @param subjectData
     * @param analysisContext
     */
    @Override
    public void invoke(SubjectData subjectData, AnalysisContext analysisContext) {
        log.info("進入方法調(diào)用");
        if (StringUtils.isEmpty(subjectData)){
            throw new GuliException(20001,"文件數(shù)據(jù)為空");
        }
        //一行一行去讀取excel內(nèi)容,每次讀取有兩個值,第一個值為一級分類,第二個值為二級分類
        //判斷一級分類是否重復
        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);
        }

    }

    /**
     * 讀取完成后執(zhí)行
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }

    /**
     * 判斷一級分類是否重復
     * 因為課程的的parent_id為0時,代表是一級分類,并且一級分類數(shù)據(jù)不重復
     * @param eduSubjectService
     * @param name
     * @return
     */
    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;
    }
    /**
     * 判斷二級分類是否重復
     *
     * @param eduSubjectService
     * @param name
     * @param pid
     * @return
     */
    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、小細節(jié),實體類pojo

因為mybatisplus生成的實體類的主鍵生成策略是IdType.ID_WORKER,所以需要修改成IdType.ID_WORKER_STR,否則會有轉(zhuǎn)換問題

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;

/**
 * <p>
 * 課程科目
 * </p>
 *
 * @author zhz
 * @since 2021-07-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 = "創(chuàng)建時間")
    @TableField(fill = FieldFill.INSERT)
    private Date gmtCreate;

    @ApiModelProperty(value = "更新時間")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date gmtModified;

}

3.7、其余,swagger集成,R類統(tǒng)一返回,統(tǒng)一日志等,請看我其他博客

統(tǒng)一日志:https://blog.csdn.net/zhouhengzhe/article/details/118078080
統(tǒng)一返回值:https://blog.csdn.net/zhouhengzhe/article/details/118065066
統(tǒng)一異常:https://blog.csdn.net/zhouhengzhe/article/details/118064739
swagger集成:https://blog.csdn.net/zhouhengzhe/article/details/118063779

到此這篇關于SpringBoot集成EasyExcel的應用場景的文章就介紹到這了,更多相關SpringBoot集成EasyExcel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java中的常用集合類整理

    java中的常用集合類整理

    在本篇文章里小編給大家整理的是關于java中的常用集合類的相關知識點內(nèi)容,有興趣的朋友們學習下。
    2019-12-12
  • 一文帶你看懂Java8中的lambda表達式和方法引用

    一文帶你看懂Java8中的lambda表達式和方法引用

    Lambda 表達式是 Java 8 引入的一項重要特性,它提供了一種簡潔、清晰且靈活的語法來表示可傳遞的匿名函數(shù),下面就跟隨小編一起學習一下Java8中的lambda表達式和方法引用的相關知識吧
    2023-12-12
  • Java用遞歸方法解決漢諾塔問題詳解

    Java用遞歸方法解決漢諾塔問題詳解

    漢諾塔問題是一個經(jīng)典的問題。漢諾塔(Hanoi?Tower),又稱河內(nèi)塔,源于印度一個古老傳說。本文將用Java遞歸方法求解這一問題,感興趣的可以學習一下
    2022-04-04
  • Java多線程之Disruptor入門

    Java多線程之Disruptor入門

    這篇文章主要介紹了Java多線程之Disruptor入門,文中有非常詳細的代碼示例,對正在學習java多線程的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • IntelliJ IDEA 安裝目錄的核心文件的功能及用法

    IntelliJ IDEA 安裝目錄的核心文件的功能及用法

    這篇文章我們主要講解一下 IntelliJ IDEA 安裝目錄中的一些核心文件的功能及用法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-10-10
  • Java遍歷起止日期中間的所有日期操作

    Java遍歷起止日期中間的所有日期操作

    這篇文章主要介紹了Java遍歷起止日期中間的所有日期操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • nacos gateway動態(tài)路由實戰(zhàn)

    nacos gateway動態(tài)路由實戰(zhàn)

    這篇文章主要介紹了nacos gateway動態(tài)路由實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • mybatis xml如何使用not in 某個集合的格式

    mybatis xml如何使用not in 某個集合的格式

    這篇文章主要介紹了mybatis xml如何使用not in 某個集合的格式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java 打造阻塞式線程池的實例詳解

    java 打造阻塞式線程池的實例詳解

    這篇文章主要介紹了java 打造阻塞式線程池的實例詳解的相關資料,這里提供實例幫助大家,理解這部分知識,需要的朋友可以參考下
    2017-07-07
  • Springboot配置security basic path無效解決方案

    Springboot配置security basic path無效解決方案

    這篇文章主要介紹了Springboot配置security basic path無效解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09

最新評論

汾阳市| 武强县| 黄石市| 霍州市| 漳浦县| 泰来县| 绍兴县| 赤城县| 石棉县| 永泰县| 波密县| 德庆县| 九台市| 九龙坡区| 绥德县| 普安县| 武宣县| 屏南县| 钟山县| 北安市| 临清市| 兰州市| 黔南| 博白县| 武川县| 黔东| 巴中市| 阳东县| 二连浩特市| 萨嘎县| 景东| 英吉沙县| 巴东县| 重庆市| 益阳市| 嘉义市| 镇宁| 临沧市| 本溪| 曲阳县| 若尔盖县|