导入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)
上一篇 2021年11月12日 下午5:00
下一篇 2021年11月12日 下午6:00


相关推荐

  • 十进制小数如何转换为二进制小数[通俗易懂]

    十进制小数如何转换为二进制小数[通俗易懂]关于十进制小数转换为二进制数,下面是我的详细操作说明,仅供参考。纯小数首先,最高位是符号位,正数是0,负数是1;小数部分乘以2,然后取整数部分,,剩余小数部分继续乘以2,取整数部分,……直到小数部分为0。以+0.125为例:+数,最高位为0;小数部分0.125×2=0.25,取0;再取小数部分0.25×2=0.5,取0;再取小数部分0.5×2=1.0,取1;这时小数部分是0,结束。…

    2026年3月8日
    11
  • vue 虚拟dom和diff算法详解

    vue 虚拟dom和diff算法详解虚拟 dom 是当前前端最流行的两个框架 vue 和 react 都用到的一种技术 都说他能帮助 vue 和 react 提升渲染性能 提升用户体验 那么今天我们来详细看看虚拟 dom 到底是个什么鬼虚拟 dom 的定义与作用什么是虚拟 dom 大家一定要记住的一点就是 虚拟 dom 就是一个普通的 js 对象 是一个用来描述真实 dom 结构的 js 对象 因为他不是真实 dom 所以才叫虚拟 dom 虚拟 dom 的结构从下图中 我们来看一看虚拟 dom 结构到底是怎样的如上图 这就是虚拟 dom 的结构 他是一个对象 下面有 6 个属性

    2026年3月20日
    1
  • 2025最新扣子coze智能体转人工教程,保姆级教程!

    2025最新扣子coze智能体转人工教程,保姆级教程!

    2026年3月12日
    2
  • 微信小程序–单选复选按钮组的实现

    微信小程序–单选复选按钮组的实现本文主要介绍微信小程序单选按钮很多选按钮的实现方式。众所周知,小程序目前无法绑定DOM截点,实现的原理就是通过bindtap点击的事件方法获取data-id进行循环遍历取反而实现该效果。(一)单选按钮组模型图如下:index.jsPage({data:{parameter:[{id:1,name:’银色’},{id:2,name:’白色’},{i

    2022年5月7日
    217
  • Pycharm设置自动换行显示

    Pycharm设置自动换行显示只对当前文件有效的操作 菜单栏 gt View gt ActiveEditor gt UseSoftWraps 如果想对所有文件都有效 就要在 setting 里面进行操作 File gt Setting gt Editor gt General gt Usesoftwraps

    2025年10月19日
    3
  • 打开文件夹,定位指定文件[c WinForm]

    打开文件夹,定位指定文件[c WinForm]程序打开文件夹 并定位选择指定文件 Process Start explorer select C WINDOWS explorer exe nbsp

    2026年3月26日
    2

发表回复

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

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