导入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();
    }

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java实现高斯日记[通俗易懂]

    java实现高斯日记[通俗易懂]题目标题:高斯日记大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记上标注着:5343,因…

  • ASP.NET 页面中的 ValidateRequest属性

    ASP.NET 页面中的 ValidateRequest属性ValidateRequest指示是否应发生请求验证。如果为true,请求验证将根据具有潜在危险的值的硬编码列表检查所有输入数据。如果出现匹配情况,将引发HttpRequestValidationException异常。默认值为true。该功能在计算机配置文件(Machine.config)中启用。可以在应用程序配置文件(Web.config)中或在页上将该属性设置为false来禁用该功能。注意:该功能有助于减少对简单页或ASP.NET应用程序进行跨站点脚本攻击的

    2022年10月26日
  • 换BLOG了~http://hi.baidu.com/aekdycoin/blog

    换BLOG了~http://hi.baidu.com/aekdycoin/bloghttp://hi.baidu.com/aekdycoin/blog

  • 通过bindservice方法开启的服务,通过什么方法解绑_controller调用多个service

    通过bindservice方法开启的服务,通过什么方法解绑_controller调用多个service绑定本地服务AndroidManifest.xml中声明服务:&lt;serviceandroid:name=".TestLocalService"&gt;&lt;intent-filter&gt;&lt;actionandroid:name="maureen.intent.action.BIND_LOCAL…

  • chmod- linux修改文件权限[通俗易懂]

    chmod- linux修改文件权限[通俗易懂]在Unix和Linux的各种操作系统下,每个文件(文件夹也被看作是文件)都按读、写、运行设定权限。例如我用ls-l命令列文件表时,得到如下输出:-rw-r–r–1appleusers22542006-05-2013:47tt.htm从第二个字符起rw-是说用户apple有读、写权,没有运行权,接着的r–表示用户组users只有读权限,没有运行权,最后的r–指其他人(others)只有读权限,没有写权和运行权。这是系统默认设置,我可以改写tt.htm,同组的人和其他

  • 搭建IntelliJ IDEA激活服务器(在线激活)「建议收藏」

    搭建IntelliJ IDEA激活服务器(在线激活),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

您的电子邮箱地址不会被公开。

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