导入Excel数据到数据库

导入Excel数据到数据库

EasyExcel

步骤

1.导入maven坐标

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

2.创建实体类,加入表头注解(对应excel的数据)

package com.gyb.eduservice.entity.excel;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
 * @Author: 郜宇博
 * @Date: 2021/10/2 16:57
 */
@Data
public class SubjectData {
    /**
     * 一级分类
     * 注解代表在excel的第一列
     */
    @ExcelProperty(index = 0)
    private String oneSubjectName;
    /**
     * 二级分类
     */
    @ExcelProperty(index = 1)
    private String twoSubjectName;

}

3.创建要添加到数据库的实体类

package com.gyb.eduservice.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;

/**
 * <p>
 * 课程科目
 * </p>
 *
 * @author 郜宇博
 * @since 2021-10-02
 */
@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.创建一个监听器,继承AnalysisEventListener

package com.gyb.eduservice.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gyb.eduservice.entity.EduSubject;
import com.gyb.eduservice.entity.excel.SubjectData;
import com.gyb.eduservice.service.EduSubjectService;
import com.gyb.servicebase.exceptionhandler.MyException;

/**
 * @Author: 郜宇博
 * @Date: 2021/10/2 17:03
 */
public class SubjectExcelListener extends AnalysisEventListener<SubjectData> {

    /**
     * 因为SubjectExcelListener,不能交给Spring容器管理,
     * 所以不能使用@Autowire自动导入eduSubjectService,
     * 因此需要使用构造函数获取到eduSubjectService
     */
    public EduSubjectService eduSubjectService;


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

    /**
     * 判断一级分类是否重复
     * @param oneName 一级分类的名称
     * @return
     */
    private EduSubject judgeExistOneSubject(String oneName){
        //获取该名称的一级分类,一级分类的parent_id为0
        EduSubject oneSubject = eduSubjectService.getOne(
                new QueryWrapper<EduSubject>()
                        .eq("title", oneName)
                        .eq("parent_id", "0"));
        return oneSubject;
    }
    /**
     * 判断二级分类是否重复
     * @param twoName 一级分类的名称
     * @return
     */
    private EduSubject judgeExistTwoSubject(String twoName,String pid){
        //获取该名称的一级分类,一级分类的parent_id为0
        EduSubject twoSubject = eduSubjectService.getOne(
                new QueryWrapper<EduSubject>()
                        .eq("title", twoName)
                        .eq("parent_id", pid));
        return twoSubject;
    }
    /**
     * 读取方法
     * 一行一行读,没有一级或二级分类就创建
     * @param subjectData 传入的文件数据
     * @param analysisContext
     */
    @Override
    public void invoke(SubjectData subjectData, AnalysisContext analysisContext) {
        if (subjectData == null){
            throw new MyException(20001,"文件数据为空");
        }
        //一行一行读,每行有两个值,第一个是一级分类,第二个是二级分类
        EduSubject one = this.judgeExistOneSubject(subjectData.getOneSubjectName());
        //一级分类
        //不重复。添加
        if (one == null){
            //创建对象
            one = new EduSubject();
            one.setParentId("0");
            one.setTitle(subjectData.getOneSubjectName());
            //添加到数据库
            eduSubjectService.save(one);
        }
        //获取该二级分类对应一级分类的id值
        String pid = one.getId();
        //二级分类
        EduSubject two = this.judgeExistTwoSubject(subjectData.getTwoSubjectName(), pid);
        if (two == null){
            //创建对象
            two = new EduSubject();
            two.setParentId(pid);
            two.setTitle(subjectData.getTwoSubjectName());
            //添加到数据库
            eduSubjectService.save(two);
        }

    }

    /**
     * 读取之后表头操作
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

5.在servie层编写添加文件的方法

package com.gyb.eduservice.service.impl;

import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gyb.eduservice.entity.EduSubject;
import com.gyb.eduservice.entity.excel.SubjectData;
import com.gyb.eduservice.listener.SubjectExcelListener;
import com.gyb.eduservice.mapper.EduSubjectMapper;
import com.gyb.eduservice.service.EduSubjectService;
import com.gyb.servicebase.exceptionhandler.MyException;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/**
 * <p>
 * 课程科目 服务实现类
 * </p>
 *
 * @author 郜宇博
 * @since 2021-10-02
 */
@Service
public class EduSubjectServiceImpl extends ServiceImpl<EduSubjectMapper, EduSubject> implements EduSubjectService {

    /**
     * 添加课程分类
     * @param file
     */
    @Override
    public void addSubject(MultipartFile file,EduSubjectService eduSubjectService) {
        try {
            InputStream inputStream = file.getInputStream();
            //读取文件内的内容,因为是一行行读,因此第三个参数需要传递一个监听器
            EasyExcel.read(inputStream, SubjectData.class,new SubjectExcelListener(eduSubjectService))
                    .sheet()
                    .doRead();
        } catch (IOException e) {
            throw new MyException(20001,e.getMessage());
        }

    }
}

6.在controller层调用

package com.gyb.eduservice.controller;


import com.gyb.commonutils.Result;
import com.gyb.eduservice.service.EduSubjectService;
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 郜宇博
 * @since 2021-10-02
 */
@RestController
@RequestMapping("/eduservice/edu-subject")
@CrossOrigin
public class EduSubjectController {
    @Autowired
    private EduSubjectService eduSubjectService;

    /**
     * 添加课程分类
     * @param file 上传的excel文件
     * @return
     */
    @PostMapping("addSubject")
    @ApiOperation("添加文件")
    public Result addSubject(MultipartFile file){
        try {
            eduSubjectService.addSubject(file,eduSubjectService);
        } catch (Exception e) {
            return Result.error().message(e.getMessage());
        }
        return Result.ok();
    }

}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115164.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 沪市和深市有什么区别?

    沪市和深市有什么区别?1、板块不同:沪市只有主板与B股;深市有主板、中小板、创业板和B股。2、股票代码不同:沪市主板是60开头,B股是900开头;深市主板是000开头,中小板是002开头、创业板是300开头、B股是200

    2022年8月3日
    6
  • python把局部变量赋值给全局变量_局部变量不赋初值

    python把局部变量赋值给全局变量_局部变量不赋初值理解的都没问题。但我想聊聊出现这种情况的原因。在讲原因之前,需要先知道python中变量的搜索顺序,这个顺序是LGB(不考虑闭包情况)即local本地,global全局,builtin内建。比如:a=1deftest():a=3print(a)test()函数内声明了局部变量a,在打印中使用,在本地环境中命中,因此使用的是3。也许你会问这个知识点我早就知道了,这和本问题有什么关…

    2025年8月6日
    2
  • windows 10安装sqlyog详细步骤

    windows 10安装sqlyog详细步骤sqlyog下载链接:链接:https://pan.baidu.com/s/1D_iRna8V90omfHsKHyeBtg提取码:bqht复制这段内容后打开百度网盘手机App,操作更方便哦1.下载完以后解压,双击SQLyog-12.0.9-0.x642.如下图,选择Ok3.如图,点击下一步4.选择“我接受“许可证协议”中的条款(A)”单击下一步…

    2022年5月28日
    77
  • PLSQL基本操作手册

    PLSQL基本操作手册公众号:池哥搬砖QQ1群:745460286个人WX公号:目录第1章用PLSQL连接Oracle数据库§1.2登录信息保存功能设置:§1.3进入PLSQL后切换数据库连接:第2章PLSQL中编写SQL语句并执行第3章PLSQL中查看数据库表结构§3.1查看表结构:§3.2表结构窗口和SQL编写窗口切换:第4章…

    2022年5月2日
    36
  • RT Thread FinSH组件

    RT Thread FinSH组件FinSH入口rt_components_init();voidmain_thread_entry(void*parameter){externintmain(void);#ifdefRT_USING_COMPONENTS_INIT/*RT-Threadcomponentsinitialization*/rt_components_init();#endif/*RT_USING_COMPONENTS_INIT*/#ifdefRT_US

    2022年5月21日
    41
  • C3P0数据库连接池连接Mysql8.0.11的配置问题

    C3P0数据库连接池连接Mysql8.0.11的配置问题C3P0(0.9.5.2)连接Mysql8.0.11的配置问题**小白一个,这几天,在学C3P0数据连接池,把遇到的一些问题记录一下,希望能帮到你们。题主的环境:EclipseC3P0-0.9.5.2可参考这里下载Mysql8.0.11****1.创建配置文件c3p0-config.xml**&amp;amp;amp;amp;amp;lt;?xmlversion=&amp;amp;amp;amp;quot;1.0&am

    2022年5月4日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号