【easyexcel】导入到数据库功能 正版实测
在写代码的途中正好在这个问题上遇难题了就顺手记录下来了
按着我的代码一路走下来就不会错了
写的比较简单 直接上代码 直接代码复用就可以了,比其他的写的要实际,记得改类名和包名
这个首先要导入一个easyexcel和poi 的依赖进pom包
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.16</version>
</dependency>
剩下的就是代码了
最主要的还是要多建立一个 ExcelListener 类用来写监听器(每写一个导入就要重新写一个监听)
package com.tunnel.boot.web.constructionriskcontrol.controller;import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.tunnel.boot.web.constructionriskcontrol.dto.TunnelMaterialManagementDTO;
import com.tunnel.boot.web.constructionriskcontrol.service.TunnelMaterialManagementService;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;// 有个很重要的点 ExcelListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Slf4j
public class ExcelListener extends AnalysisEventListener<TunnelMaterialManagementDTO> {/*** 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 3000;private final List<TunnelMaterialManagementDTO> list = new ArrayList<>();/*** 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。*/private final TunnelMaterialManagementService tunnelMaterialManagementService;/*** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来*/public ExcelListener(TunnelMaterialManagementService tunnelMaterialManagementService) {this.tunnelMaterialManagementService = tunnelMaterialManagementService;}/*** 这个每一条数据解析都会来调用*/@Overridepublic void invoke(TunnelMaterialManagementDTO tunnelMaterialManagementDTO, AnalysisContext analysisContext) {log.info("解析到一条数据:========================{}", tunnelMaterialManagementDTO.toString());// 数据存储到datas,供批量处理,或后续自己业务逻辑处理。if (ObjectUtil.isNotEmpty(tunnelMaterialManagementDTO)) {list.add(tunnelMaterialManagementDTO);}// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (list.size() >= BATCH_COUNT) {saveData();// 存储完成清理dataslist.clear();}}/*** 所有数据解析完成了 都会来调用*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {saveData();//确保所有数据都能入库}/*** 加上存储数据库*/private void saveData() {log.info("=============================={}条数据,开始存储到数据库", list.size());tunnelMaterialManagementService.saveList(list);}
}
conroller 层
@RequestMapping("importExcel")@ResponseBodypublic String importExcel(@RequestParam(value = "file") MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), TunnelMaterialManagementDTO.class, new ExcelListener(tunnelMaterialManagementService)).sheet().doRead();return "success";}
service层
/*** 一次性存储导入的excel文件* @param list*/void saveList(List<TunnelMaterialManagementDTO> list);
impl层
/*** 存列表,excel文件** @param list*/@Override@Transactionalpublic void saveList(List<TunnelMaterialManagementDTO> list) {list.forEach(v->{tunnelMaterialManagementMapper.insert(AppBeanUtil.convert(v,TunnelMaterialManagement.class));});}
mapper层
/***excel导入*/int saveList(List<TunnelMaterialManagementDTO> tunnelMaterialManagementDTOList);
xml层
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tunnel.boot.web.constructionriskcontrol.mapper.TunnelMaterialManagementMapper"><!--一次性存储导入excel--><insert id="saveList" parameterType="java.util.List">insert into tunnel_material_management (task_name,material_number,specification,model_number,company,inventory_quantity,manager,contact_information,date_of_inventory,material_storage_location,remarks)values<foreach collection="list" item="item" index="index" separator=",">(#{item.taskName},#{item.materialNumber},#{item.specification},#{item.modelNumber},#{item.company},#{item.inventoryQuantity},#{item.manager},#{item.contactInformation},#{item.dateOfInventory},#{item.materialStorageLocation},#{item.remarks},#{item.typeOfMaterial})</foreach></insert></mapper>
【easyexcel】导入到数据库功能 正版实测相关推荐
- 教您如何三分钟搞定EasyExcel导入与导出功能
文章目录 目录 前言 一.EasyExcel是什么? 二.使用步骤 1.引入库 2.导入 2.1创建对应excel表格的实体类 2.2后端接收请求入口 2.3业务处理 2.4监听器处理数据 3.导出 ...
- oracle新建用户sql局域,oracle 新建数据库,及创建用户,表空间,sqlplus导入导出数据库...
oracle11G 新建数据库: 默认下一步: 默认下一步: 默认下一步: 填写数据库名下一步: 默认下一步: 完成,再按指示确定,就完成了数据库的创建. 数据库创建完后,在oracle11G Net ...
- 使用EasyExcel将本地excel数据读取后导入mysql数据库中
本篇文章只记录EasyExcel的读(read) 一. EasyExcel 是做什么的? 首先看下EasyExcel解释: EasyExcel是阿里巴巴开源的一个excel处理框架,是一个基于Java ...
- 高质量实现单文件导入、导出功能(使用EasyExcel )
前言 咋说呢,最近交接了一个XXX统计分析系统到我手上,显示页面平平无其,一看导入.导出功能的实现代码,每个小菜单目录里面都对应一个导入导出接口,看起来十分难受!(此处省略1w字内心os)正所谓前人栽 ...
- easyExcel 导入Excel数据
easyExcel 导入Excel数据 最近公司项目需要导入几十万的Excel数据,我这里用的是现在最流行的easyExcel, 希望能帮助到你 首先导入jar包 <dependency> ...
- 【使用EasyExcel导入导出】
使用EasyExcel导入导出 一,为什么要使用EasyExcel 1.1 EasyExcel与Poi的区别 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个 ...
- Spring Boot + EasyExcel 导入导出,好用到爆,可以扔掉 POI 了!
欢迎关注方志朋的博客,回复"666"获面试宝典 一.EasyExcel EasyExcel是阿里巴巴开源poi插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据 ...
- cmd导入oracle库文件,cmd 导入oracle数据库
从服务器将Oracle数据库导出到本地Oracle数据库的方法 原文:从服务器将Oracle数据库导出到本地Oracle数据库的方法 1.将服务器上的Oracle数据库导入到本地 在CMD模式下执 ...
- sqlite java excel,Android将Excel表数据导入SQLite数据库
前两天接了个私活,需求方给了一个Excel表格,需要使用到里面的7000+条数据进行查询,最开始以为7000条一条条加入数据库也还好,以下是其中一部分数据: 但当我添加了20多条的时候突然发现这样的方 ...
最新文章
- 关于nginx rewrtie的四种flag
- 015_请求转发和重定向
- J.U.C系列(五)BlockingQueue的使用
- java base64转bitmap,如何将Bitmap位图与base64字符串相互转换
- C/C++预处理指令
- 只要加一行,让 IE 五倍速执行 JavaScript
- iphone固件降级_手机资讯:降级必备:Phone5如何下载备份SHSH文件
- 关于linux安装openoffice无法启动
- vs2015环境搭建与简单程序测试
- 神经网络仿真实验matlab,神经网络及其matlab实现
- 免费正确使用计算机ppt,计算机基础课件ppt
- 群辉安装linux软件下载,群晖系统Synology DSM安装ipkg包管理和套件安装方法
- 织梦登陆总是提示验证码错误
- 中职计算机vb听课记录,《高级语言程序设计VB》听课笔记:12
- 3dmax怎么渲染全景图,如何使用vray渲染制作360度全景图?
- DNX 版本升级命令
- 计算机语言替换,Zig 0.7.0 发布,想要替换 C的编程语言
- 2022年版中国腰果酚市场趋势研究与竞争策略分析报告
- Java中jdk1.8和jdk17相互切换
- Java基础篇(集合)