当前位置: 首页 > news >正文

阿里巴巴 EasyExcel 真正的高效与通用导入(亿级数据秒级导入)

需要lombok、hutool、alibaba EasyExcel 相关依赖包

基于Lamba表达式的通用监听器


import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;@Slf4j
@UtilityClass
public class ExcelListenerUtil {public static String DATASOURCE = null;/*** 创建监听器** @param consumer  消费者* @param threshold 批量写入数* @param <T>* @return*/public <T> AnalysisEventListener<T> getListener(Consumer<List<T>> consumer, int threshold) {return new AnalysisEventListener<>() {private final List<T> dataList = new LinkedList<>();@Overridepublic void invoke(T t, AnalysisContext analysisContext) {//解析行dataList.add(t);if (dataList.size() == threshold) {consumer.accept(dataList);dataList.clear();}}@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {//解析头log.info("表格头信息:【{}】", headMap);//获取表格头数据if (StrUtil.isBlank(DATASOURCE)) {//将表格标题放入缓存,可自行定义其他头数据缓存,缓存数据结构自定义即可DATASOURCE = headMap.get(0);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {//结束解析if (dataList.size() > 0) {consumer.accept(dataList);}//清空内存的缓存数据ExcelListenerUtil.DATASOURCE = null;}};}
}

导入逻辑

			// 创建临时文件tempFile = FileUtil.writeBytes(file.getBytes(), FileUtil.file(FileUtil.getTmpDir() +FileUtil.FILE_SEPARATOR + "xxxx.xlsx"));// 自定义批次号String batchId = generateBatchId();// 分批导入监听器(提速1)AnalysisEventListener<QhHistoryImportParam> listener = ExcelListenerUtil.getListener(this.batchInsert(batchId), 100);// 读取excelList<QhHistoryImportParam> qhHistoryExcels = EasyExcel.read(tempFile, QhHistoryImportParam.class, listener).sheet().headRowNumber(2) //第3行开始读取数据//异步解析(提速2).doReadSync();

入库逻辑

private Consumer<List<QhHistoryImportParam>> batchInsert(String batchId) {log.info("消费者");return excelData -> {//自定义的数据库实体List<QhHistory> qhHistories = new ArrayList<>();excelData.forEach(q -> {QhHistory qhHistory = new QhHistory();BeanUtil.copyProperties(q, qhHistory);qhHistory.setContractName(FutureProducts.containsAndGet(q.getContractCode()));qhHistory.setBatchId(batchId);qhHistory.setDatesource(ExcelListenerUtil.DATASOURCE);qhHistories.add(qhHistory);});//异步保存(提速3)CompletableFuture.runAsync(() -> this.saveBatch(qhHistories));};}
http://www.lryc.cn/news/352181.html

相关文章:

  • 32.5k star!!替换 postman?【送源码】
  • 课时135:awk实践_逻辑控制_综合实践
  • c++ 读取MNIST数据集实现softmax回归
  • JS-04何为继承以及实现方式
  • 6款网站登录页(附带源码)
  • spring boot打的包直接运行
  • 移除元素-力扣
  • 代码随想录算法训练营第三天| 203.移除链表元素、 707.设计链表、 206.反转链表
  • 【题解】AB33 相差不超过k的最多数(排序 + 滑动窗口)
  • LSPatch免root手机模块应用
  • 深入解析kube-scheduler的算法自定义插件
  • java原型模式 (Prototype Pattern) 介绍
  • LLama3 | 一. 本地 Web Demo 部署
  • MariaDB 给指定列值自动加密(持久数据加触发器)
  • 深入理解Linux系统管理与网络配置高级指南
  • 朴素贝叶斯+SMSSpamCollections
  • 【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
  • 深度神经网络详解
  • MYSQL 数据迁移利器 MYSQLSH
  • 【MYSQL】分数排名
  • 【论文笔记】| 蛋白质大模型ProLLaMA
  • MySQL笔记第一天(从小白到入门)
  • 初识Qt:从Hello world到对象树的深度解析
  • 多维数据库创建
  • win11安装docker运行Open-Webui 界面化展示 ollama大模型
  • 网络模型-PoE技术
  • 网站策划是什么
  • MySQL基础学习: SET FOREIGN_KEY_CHECKS = 0
  • 信号:MSK调制和GMSK调制
  • 计算请假申请时长