介绍

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便

准备前提linux连接服务开启nacos

第一步导入pom依赖

<properties><easyexcel.version>3.0.5</easyexcel.version>
</properties><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>${easyexcel.version}</version>
</dependency>

其他可能需要依赖的pom

<properties><mysql.version>5.1.38</mysql.version><mybatis-plus.version>3.4.2</mybatis-plus.version><druid.version>1.1.9</druid.version><easyexcel.version>3.0.5</easyexcel.version><fastdss.verson>1.26.4</fastdss.verson><fastjson.version>1.2.83</fastjson.version>
</properties>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>${easyexcel.version}</version></dependency><dependency><groupId>net.oschina.zcx7878</groupId><artifactId>fastdfs-client-java</artifactId><version>1.27.0.0</version></dependency><dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>${fastdss.verson}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency></dependencies>

第二步 配置application.yml 连接nacos

server:port: 9090
spring:application:name: tc_managercloud:nacos:discovery:server-addr: 192.168.64.118:8848username: nacospassword: nacosnamespace: publicdatasource:druid:url: jdbc:mysql://192.168.64.118:3306/tc_towercrane?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&autoReconnect=trueusername: rootpassword: 3090_Cmok#初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时initial-size: 3max-active: 30min-idle: 3#  datasource:#    # druid连接池#    type: com.alibaba.druid.pool.DruidDataSource#    #数据库驱动#    driver: com.mysql.jdbc.Driver#    #最大连接池数量#    max-active: 20#    #初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时#    initial-size: 10# 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,# 并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。max-wait: 60000#最小连接池数量#有两个含义:#1: Destroy线程会检测连接的间隔时间#2: testWhileIdle的判断依据,详细看testWhileIdle属性的说明time-between-eviction-runs-millis: 60000#配置一个连接在池中最小生存的时间,单位是毫秒min-evictable-idle-time-millis: 180000#用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。validation-query: select 'x'#连接有效性检查的超时时间 1 秒validation-query-timeout: 1#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。test-on-borrow: false#设置从连接池获取连接时是否检查连接有效性,true时,如果连接空闲时间超过minEvictableIdleTimeMillis进行检查,否则不检查;false时,不检查test-while-idle: true#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能test-on-return: false#是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。pool-prepared-statements: true#要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,# 不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100max-open-prepared-statements: 20#数据库链接超过3分钟开始关闭空闲连接 秒为单位remove-abandoned-timeout: 1800#对于长时间不使用的连接强制关闭remove-abandoned: true#打开后,增强timeBetweenEvictionRunsMillis的周期性连接检查,minIdle内的空闲连接,# 每次检查强制验证连接有效性. 参考:https://github.com/alibaba/druid/wiki/KeepAlive_cnkeep-alive: true# 通过connectProperties属性来打开mergeSql功能;慢SQL记录connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000#是否超时关闭连接 默认为false ,若为true 就算数据库恢复连接,也无法连接上break-after-acquire-failure: false#设置获取连接出错时的自动重连次数connection-error-retry-attempts: 1# 设置获取连接出错时是否马上返回错误,true为马上返回fail-fast: true#属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:#监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wallfilters: stat,wall
mybatis-plus:mapper-locations: classpath:mapper/*.xml
fdfs:so-timeout: 3000connect-timeout: 1000thumb-image:width: 200height: 200tracker-list:- 192.168.64.118:22122

编写实体类Tcinfos

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Tcinfos {@TableId(type = IdType.AUTO)@ExcelIgnoreprivate Integer tcid;@ExcelProperty("吊塔类型")private String type;@JsonFormat(pattern = "yyyy-MM-dd")//取日期时使用@DateTimeFormat(pattern = "yyyy-MM-dd")//存日期时使用@ExcelProperty("建造日期")private Date makedate;@ExcelProperty("最大高度")private Integer maxhigh;@ExcelProperty("最大幅度")private Integer maxrange;@ExcelProperty("最大载重")private Integer maxweight;@ExcelProperty("安全员工号")private Integer secman;@ExcelProperty("负责人工号")private Integer resman;
}

第三步配置controller层

@RestController
@RequestMapping("/tcinfo")
public class TcinfosCtrl {
    @Resource
    private TcinfoStoreService tcinfoStoreService;
    /**
     * 批量插入
     * @param file
     * @return
     */

@PostMapping(value ="/batchTowerCrane")
    public String batchTc(MultipartFile file){
        tcinfoStoreService.batch_save(file);
        return BackinfoConf.BATCHADDTC_SUCCESS;
    }

 BackinfoConf类封装返回信息

public class BackinfoConf {public static final String FILEUPLOAD_SUCCESS="{\"upload_status\":\"success\"}";public static final String FILEUPLOAD_FAIL="{\"upload_status\":\"fail\"}";public static final String ADDTCCHECK_SUCCESS="{\"addcheck_status\":\"success\"}";public static final String ADDTCCHECK_FAIL="{\"addcheck_status\":\"fail" + "\"}";public static final String MANUALADDTC_SUCCESS="{\"manualaddtc_status\":\"success" + "\"}";public static final String MANUALADDTC_FAIL="{\"manualaddtc_status\":\"fail" + "\"}";public static final String MODTC_SUCCCESS="{\"modtc_status\":\"success" + "\"}";public static final String MODTC_FAIL="{\"modtc_status\":\"fail" + "\"}";public static final String BATCHADDTC_SUCCESS="{\"batchaddtc_status\":\"success" + "\"}";public static final String BATCHADDTC_FAIL="{\"batchaddtc_status\":\"fail" + "\"}";
}

第四步配置service层接口 和实现类

public interface TcinfoStoreService {/*** 上传文件 读取文件内容* 并批量保存数据* @param file*/void batch_save(MultipartFile file);
}
@Service
public class TcinfoStoreServiceImpl implements TcinfoStoreService {@Resourceprivate TCinfosMapper tCinfosMapper;@Resourceprivate FastFileStorageClient ffsc;@Resourceprivate TcappendixMapper tcappendixMapper;@Transactional@Overridepublic void batch_save(MultipartFile file) {try {//new ExcelReadListener调用他的有参构造  注入mapper对象
//sheet()方法代表第一个表格
//可以用类似sheet name no 方法用名字或者数字自定义EasyExcel.read(file.getInputStream(),Tcinfos.class,new ExcelReadListener(tCinfosMapper)).sheet().doRead();} catch (IOException e) {e.printStackTrace();}}
}
 //EasyExcel在读取excel表格时,每读取到一行,就会调用一次这个方法,//并且将读取到的行数据,封装到指定类型(Question1)的对象中,传递给我们(Object object)/*此问题可能出现在低版本的easyExcel中,出现时可以按照下列方式解决如果表格数据不是顶行写的,需要通过headRowNumber指定表头行的数量如果表格数据不是顶列写的,需要在封装的实体属性上通过@ExcelProperty将实体属性和表格列名进行对应*/

第五步配置mapper层接口 和实现类

@Mapper
//使用mybatis-plus实现crud
//mybatis-plus没有批量插入的方法 所以我们手写一个批量插入的接口
public interface TCinfosMapper extends BaseMapper<Tcinfos> {void batchSaveTcInfo(List<Tcinfos> tc);
}
<?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"><!--使用mybatis动态sql 对集合进行批量插入-->
<mapper namespace="com.kgc.towercrane.tcmanager.mapper.TCinfosMapper"><insert id="batchSaveTcInfo">insert into tcinfos(type,makedate,maxhigh,maxrange,maxweight,secman,resman) values<foreach collection="list" item="tc" separator=",">(#{tc.type},#{tc.makedate},#{tc.maxhigh},#{tc.maxrange},#{tc.maxweight},#{tc.secman},#{tc.resman})</foreach></insert>
</mapper>

第六步配置ExcelReadListener类

package com.kgc.towercrane.tcmanager.common;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.kgc.towercrane.tcmanager.domian.module.Tcinfos;
import com.kgc.towercrane.tcmanager.mapper.TCinfosMapper;import java.util.ArrayList;
import java.util.List;public class ExcelReadListener extends AnalysisEventListener<Tcinfos> {//定义批量  每次读取500行数据  最合适可以3000private static final int BATCH_SIZE=500;//创建一个全局集合 每次读取数据存入其中private List<Tcinfos> tcs=new ArrayList<>();//定义一个mapper接口属性 private TCinfosMapper tCinfosMapperss;//创建一个有参构造 方便在controller层传入mapper接口public ExcelReadListener(TCinfosMapper tcinfos){this.tCinfosMapperss=tcinfos;}/*** 每读一行 自动触发invoke方法* @param tcinfos* @param analysisContext*/@Overridepublic void invoke(Tcinfos tcinfos, AnalysisContext analysisContext) {System.out.println(tcinfos);//读取数据到集合tcs.add(tcinfos);//判断集合有木有到500if(tcs.size()>=BATCH_SIZE){//读取到的数据大于等于500  插入500条数据到mysql数据库tCinfosMapperss.batchSaveTcInfo(tcs);//清空集合tcs.clear();}}/*** 文件读完后触发doAfterAllAndLysed一次* 假设数据量是3490条 invoke方法每500跳插入一次* 最后一条还剩490就不会插入 我们在这个方法手动在保存一次* 插入最后的490条* @param analysisContext*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("文件读完后再触发一次!!");tCinfosMapperss.batchSaveTcInfo(tcs);tcs.clear();}
}

 查看源码 AnalysisEventListener是一个抽象类

第七步apipost或者postman测试接口---这里使用的是apiPost

第八步使用DataGrip查看数据信息

数据批量插入成功!!!!

												

使用EasyExcel导入表格实现xlsx文件批量插入-----linux的mysql相关推荐

  1. easyExcel导入表格

    easyExcel导入表格 本文章是介绍java,通过easyExcel导入较为复杂的表格 导入表格如下 前提工作导包 <!-- hutool--><dependency>&l ...

  2. ASP.NET Core 导入导出Excel xlsx 文件

    ASP.NET Core 使用EPPlus.Core导入导出Excel xlsx 文件,EPPlus.Core支持Excel 2007/2010 xlsx文件导入导出,可以运行在Windows, Li ...

  3. Excel 文件怎么批量插入首页、扉页、尾页?怎么将某个 Excel 文件批量插入到其它 Excel 文件的指定位置?

    概要:在我们日常办公中,经常会碰到需要给一批 Excel 文件批量插入首页或者尾页,或者在指定的位置插入新的 Sheet 的需求.「我的ABC软件工具箱」就实现了批量在指定位置插入新的内容的功能,可以 ...

  4. c mysql 批量插入_c#之mysql四种带事务批量插入

    前言 对于像我这样的业务程序员开发一些表单内容是家常便饭的事情,说道表单 我们都避免不了多行内容的提交,多行内容保存,自然要用到数据库,如果循环打扰我数据库,数据库也会觉得很累,从而增加数据库服务器压 ...

  5. php mysql导入表格大量数据,PHP批量导入excell表格到mysql数据库

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 PHP将excell表批量导入到mysql数据库中,我亲自通过了测试,并与此处的所有人共享 1.下载php吗? ex ...

  6. mac r 导出csv文件_R在Max OS进行导入和导出xlsx文件

    R作为一门为统计设计的语言,可以方便灵活的进行文件导入和导出,大多数数据格式包括,csv, xlsx, txt,还有来自其他统计工具的SAS, SPSS, Stata, 数据文件都可以方便的导入和导出 ...

  7. 使用阿里的easyexcel 导入xls类型Excel文件报错问题深挖

    1.报错如下: Xls must be available markSupported,you can do like this <code> new BufferedInputStrea ...

  8. linux将mysql导出表数据导入另一台服务器_远程linux服务器mysql数据库导入和导出.sql文件...

    今天对需要将服务器上的数据库放到本地环境,之前没怎么这么操作过,ORZ,弱鸡,这篇帖子不错,收藏了!!! 远程linux服务器mysql数据库导入和导出.sql文件 大部分情况本地开发环境为windo ...

  9. java取linux本地xml,java-使用apache poi读取.xlsx文件会在Linux机器...

    我有一个读取.xlsx文件并向用户显示内容的应用程序.该应用程序在Windows环境下运行良好. 我将此Web应用程序的.war文件部署在ubuntu服务器上的tomcat6上.我还复制了服务器上的. ...

最新文章

  1. QLocalServer与QLocalSocket进程通讯
  2. 10 款 VS Code 插件神器,第 7 款超级实用!
  3. java七大设计原则
  4. 如何启动/停止/重启MySQL
  5. php怎么输出mysql一条数据,MySQL数据输出在一个可打印的PHP变量
  6. 下载文件(弹出迅雷来下载)
  7. Vue深入学习—虚拟DOM和Diff算法
  8. linux查看进程打开的句柄数,【转】Linux下查看进程打开的文件句柄数
  9. opencv viz3d 中的坐标系
  10. inceptionv 1-4
  11. 射频电路PCB的设计技巧
  12. 山西民生云 执行认证校验出错_山西民生云app最新版下载,山西民生云大同app认证官网最新版本下载 v2.2 - 浏览器家园...
  13. 【暑期每日一题】洛谷 P5708 【深基2.习2】三角形面积
  14. VMware ESXi 与ESX 产品之比较
  15. CentOS7 中查看进程端口号
  16. Failed to load resource: the server responded with a status of 404 (Not Found) favicon.ico文件找不到
  17. PTK(Pulmonarytoolkit)环境搭建与 ITK4.13+VS2015的配置
  18. 关于模态分析的基础知识总结
  19. r76800h怎么样r7 6800h参数
  20. Spark自定义对象排序及自定义序列化

热门文章

  1. 使用CAD看图如何打印图纸的部分内容?
  2. 云栖大会人脸识别闸机【技术亮点篇3】--人脸识别闸机摆闸可达500万次
  3. 计算机故障检修的常用流程及方法,常见品牌变频空调通讯故障通用检修流程与方法...
  4. 金融行业用户画像六大维度
  5. 控制系统Matlab仿真——校正
  6. Android实现异步加载图片 ListView
  7. 读书笔记--Neural Networks and Deep Learning(CH1)
  8. Vue学习(二)动态绑定与事件监听
  9. 如何使用charles+mock替换接口返回来测试
  10. python发微信-python实现向微信用户发送每日一句