easyExcel模板数据导入数据库

这篇具有很好参考价值的文章主要介绍了easyExcel模板数据导入数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近项目中需要用到Excel表格的上传下载功能,于是选择了EasyExcel这款工具,总的来说非常的好用,下面就做一个简单的演示。

官方文档地址 

  • EasyExcel · 语雀
  • Alibaba Easy Excel - 简单、省内存的Java解析Excel工具 | 首页

一、依赖 

pom.xml 中需要添加的依赖

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
  <version>2.2.7</version>
</dependency>

二、创建实体类:和模板一致对应 

这里用到了 @ExcelProperty 注解,这个注解很重要必要的一个注解,注解中的两个参数value,index分别代表列名,列序号
1.value 通过标题文本对应
2.index 通过文本行号对应

easyExcel模板数据导入数据库

package com.sinosoft.springbootplus.org.param;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * <pre>
 * 监管机构系统-考勤管理 导入
 * </pre>
 *
 * @author ljk
 * @date 2022-05-18
 */
@Data
@ContentRowHeight(21)
@HeadRowHeight(30)
@ColumnWidth(25)
public class JgjgPersonAttendanceImport {

    @ExcelProperty(value = {"地区"},index = 0)
    private String areaName;

    @ExcelProperty(value = {"处室"},index = 1)
    private String officeName;

    @ExcelProperty(value = {"姓名"},index = 2)
    private String personName;

    @ExcelProperty(value = {"请假类型"},index = 3)
    private String leaveType;

    @ExcelProperty(value = {"开始时间"},index = 4)
    private Date startTime;

    @ExcelProperty(value = {"结束时间"},index = 5)
    private Date endTime;

    @ExcelProperty(value = {"时长"},index = 6)
    private Integer time;

    @ExcelProperty(value = {"天数"},index = 7)
    private BigDecimal day;


}

三、监听器(easyexcel是在监听器层完成excel数据读取): 

       由于读取excel需要实现监听器,并且该监听器不能被spring容器管理,所以我们spring的注解不能在里面用,所以我们需要将service层的接口传入该监听器,实现将excel的内容存储至数据库中。

       有个很重要的点 监听器不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去

package com.sinosoft.springbootplus.org.domain.entity;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.sinosoft.springbootplus.org.convert.JgjgPersonAttendanceConvert;
import com.sinosoft.springbootplus.org.domain.service.JgjgPersonAttendanceDomain;
import com.sinosoft.springbootplus.org.param.JgjgPersonAttendanceImport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
/**
 * <pre>
 * 监管机构系统-考勤管理
 * </pre>
 *
 * @author ljk
 * @since 2022-05-20
 */
public class JgjgPersonAttendanceListener  extends AnalysisEventListener<JgjgPersonAttendanceImport> {
    private static final Logger LOGGER = LoggerFactory.getLogger(JgjgPersonAttendanceListener.class);
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    List<JgjgPersonAttendanceImport> list = new ArrayList<JgjgPersonAttendanceImport>();

    private JgjgPersonAttendanceDomain jgjgPersonAttendanceDomain;

    public JgjgPersonAttendanceListener() {

    }

    public JgjgPersonAttendanceListener(JgjgPersonAttendanceDomain jgjgPersonAttendanceDomain) {
        this.jgjgPersonAttendanceDomain = jgjgPersonAttendanceDomain;
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param jgjgPersonAttendanceImport
     *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(JgjgPersonAttendanceImport jgjgPersonAttendanceImport, AnalysisContext context) {
        LOGGER.info("解析到一条数据:{}", JSON.toJSONString(jgjgPersonAttendanceImport));
        list.add(jgjgPersonAttendanceImport);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        LOGGER.info("所有数据解析完成!");
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
        LOGGER.info("{}条数据,开始存储数据库!", list.size());
        for (JgjgPersonAttendanceImport jgjgPersonAttendanceImport : list) {
            /*SimpleDateFormat formatTime = new SimpleDateFormat("yyyy-MM-dd");
            jgjgPersonAttendanceImport.setStartTime(formatTime.format(jgjgPersonAttendanceImport.getStartTime()));
            jgjgPersonAttendanceImport.setEndTime(formatTime.format(jgjgPersonAttendanceImport.getEndTime()));*/
            //判断状态重新赋值
            if (jgjgPersonAttendanceImport.getLeaveType().equals("病假")){
                jgjgPersonAttendanceImport.setLeaveType("0");
            }else if (jgjgPersonAttendanceImport.getLeaveType().equals("事假")){
                jgjgPersonAttendanceImport.setLeaveType("1");
            }else if (jgjgPersonAttendanceImport.getLeaveType().equals("产假")){
                jgjgPersonAttendanceImport.setLeaveType("2");
            }else if (jgjgPersonAttendanceImport.getLeaveType().equals("婚假")){
                jgjgPersonAttendanceImport.setLeaveType("3");
            }else if (jgjgPersonAttendanceImport.getLeaveType().equals("丧假")){
                jgjgPersonAttendanceImport.setLeaveType("4");
            }else if (jgjgPersonAttendanceImport.getLeaveType().equals("其他")){
                jgjgPersonAttendanceImport.setLeaveType("5");
            }
            JgjgPersonAttendance jgjgPersonAttendance =
                    JgjgPersonAttendanceConvert.INSTANCE.jgjgPersonAttendanceImportToJgjgPersonAttendance(jgjgPersonAttendanceImport);
            jgjgPersonAttendanceDomain.saveJgjgPersonAttendance(jgjgPersonAttendance);
        }
        LOGGER.info("存储数据库成功!");
    }
}

四、controller层 

//导入
    @PostMapping("/insertList")
    @ApiOperation(value = "获取JgjgPersonAttendance导入", notes = "监管机构系统-导入")
    public void insetJgjgPersonAttendanceImport(MultipartFile file){
        jgjgPersonAttendanceServiceImpl.insetJgjgPersonAttendanceImport(file);
    }

五、service层 文章来源地址https://www.toymoban.com/news/detail-404207.html

//导入
    public void insetJgjgPersonAttendanceImport(MultipartFile file){
        try {
            InputStream inputStream = file.getInputStream();
            EasyExcel.read(inputStream, JgjgPersonAttendanceImport.class, new JgjgPersonAttendanceListener(jgjgPersonAttendanceDomain)).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

到了这里,关于easyExcel模板数据导入数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据库】将excel数据导入mysql数据库

    环境:Windows10 mysql8以上 将你要导入的excel表另存为txt格式 打开txt格式文件,删除表头行并另存为并更改编码方式(由于与数据库的编码不同,会导致导入报错)   通过命令行登录数据库 win+r cmd进入  进入装mysql的目录位置(进入到bin目录)  输入命令进入数据库,注意由于

    2024年02月14日
    浏览(55)
  • 数据库——多种方法导入Excel数据

    接下来就一直点击NEXT,直到完成 此时EXCEL的数据就被导入进SQL Server了: 这个技巧就是直接使用复制粘贴的方式: 注意:这种方法只适用于添加少量数据,如果是 几十万行 的数据,是无法这样导入的。 如图,我们在Excel当中直接复制数据: 右键PTYPES表,选择编辑前2002行:

    2024年02月04日
    浏览(76)
  • 《数据库系统概论》SQL Server 数据库导出、导入教程

    在SQL Server的使用过程中,大家难免遇到数据库表的导出、导入,从而实现用其它电脑打开数据库。 如果是使用学校实验室(机房)电脑做实验的同学,一定要掌握本技能!!! 1、右键点击数据库,“任务”,“生成脚本”,如下图 2、选择对象操作如图,“选择具体的数据

    2024年02月10日
    浏览(72)
  • (2)数据库mongodb 终端 和 vscode创建数据库 数据导入导出

    可视化工具:  Robo 3T | Free, open-source MongoDB GUI (formerly Robomongo) mongodb安装官网 :MongoDB: The Developer Data Platform | MongoDB 文档: 安装 MongoDB - MongoDB-CN-Manual (mongoing.com) 配置环境变量: 是为了扩大调用命令的范围 具体步骤 :我的电脑点右键-属性-高级系统设置-环境变量-系统变量

    2024年02月09日
    浏览(53)
  • 【Navicat】怎么在Navicat新建连接、新建数据库、导入数据库

    新建一个MySQL连接:打开Navicat,点击“ 左上角第一个图标 -- MySQL ”。 其他的信息都是自动出现的,只需填写 连接名和密码 后点击保存,就新建好了一个连接。 打开新建好的连接:点击“Open Connection”打开连接。 出现绿色说明打开了数据库的连接,然后单击右键。 新建数

    2023年04月27日
    浏览(81)
  • 达梦数据库导入导出

    说明(默认值) USERID 用户名/口令 FILE 导出文件 (dexp.dmp) DIRECTORY 导出文件所在目录 FULL 整库导出 (N) OWNER 以用户方式导出 格

    2024年02月14日
    浏览(68)
  • 100万数据,如何快速的导入数据库?

    数据导出、导入是非常常见的开发操作,但在这个过程中,很多开发者都会遇到诸如数据乱码、数据格式不支持、数据量太大等问题。NineData 最新发布的数据导入功能,帮助用户在保障数据完整和准确的同时,轻松地将大量的数据从文件中导入到目标数据库中。 NineData 的数据

    2024年02月09日
    浏览(55)
  • 将数据库的数据导入es中

    2024年02月11日
    浏览(60)
  • MongoDB 数据库数据导入 - 关于如何使用 csv 导入数据的命令方法、图形界面可视化导入方法

    兴趣使然,突发奇想,想到了就写,就当打发时间了。 csv文件路径问题,绝对路径和相对路径都可以 type 没有=号,也是可以的,空格自动识别 将 测试表.csv 文件导入到 mongodatabase 库, mycollection 集合中,导入时必须指定列名称 (如果 csv 文件第一行是列名称,也会被当成数据

    2023年04月22日
    浏览(53)
  • Linux 使用bash创建MYSQL数据库并导入数据库文件

    主要是杠一下的数据库123-456.sql,这个神经病一样,试了很多写法

    2024年01月22日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包