使用阿里的EasyExcel导入数据

news/2024/9/14 2:10:09/ 标签: java

工作遇到一种情况,在导入excel的时候数量过多,导致占用内存太大最终OOM.为了避免这样的情况再次出现,更换easyPoi为EasyExcel,它是一行一行读,非常节省内存且快速.
首先依赖

java">        <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel-core</artifactId><version>3.2.1</version></dependency>

然后java对象,注意该java对象的顺序要跟excel的列顺序完全一一对应,不需要@Excel注解,该注解是之前easyPoi的遗留,我删除了一些无用字段,反正不重要

java">@Data
@AllArgsConstructor
@NoArgsConstructor
public class ClientImportDTO {@Excel(name = "客户姓名")private String name;@Excel(name = "手机号")private String phone;@Excel(name = "获客渠道")private String source;@Excel(name = "微信号")private String wechat;@Excel(name = "客户星级")private String level;@Excel(name = "意向金额")private String wantAmount;@Excel(name = "贷款目的")private String purpose;@Excel(name = "性别")private String gender;
}

然后是重点,EasyExcel采用Listener来对excel进行操作

java">@Slf4j
public class ClientImportDTOListener implements ReadListener<ClientImportDTO> {
//这是队列长度,达到这个数量的时候就结束一波,这里数量过大依然会占用内存,正常50,100就可以private static final int BATCH_COUNT = 50;private List<ClientImportDTO> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);@Getterprivate List<ClientImportDTO> allDataList = new ArrayList<>();//这里是一条一条解析数据,然后加到上面的list中@Overridepublic void invoke(ClientImportDTO data, AnalysisContext context) {//log.info("解析到一条数据:{}", JSON.toJSONString(data));cachedDataList.add(data);if (cachedDataList.size() >= BATCH_COUNT) {allDataList.addAll(cachedDataList);cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}
//这里是解析完成之后执行的内容,比如存库就可以直接在这里存,但是因为我要做其他操作所以是做了一个getAllList的操作,全部拿到了再去做其他事情@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {allDataList.addAll(cachedDataList);log.info("所有数据解析完成,收集到 {} 条数据", allDataList.size());}}

重点基本都在代码注释中.然后是最后的controller方法

java">    @ApiOperation("个人线索excel导入")@PostMapping("/importClue")public R importClue(MultipartFile file) throws Exception {long start = System.currentTimeMillis();// 使用 EasyExcel 读取数据ClientImportDTOListener listener = new ClientImportDTOListener();EasyExcel.read(file.getInputStream(), ClientImportDTO.class, listener).sheet().doRead();// 获取所有数据List<ClientImportDTO> userList = listener.getAllDataList();long end = System.currentTimeMillis();log.info("当前导入的个人线索列表数量为{}, 耗时{}毫秒", userList.size(), end - start);// 调用 importBatch2 方法处理业务逻辑return clueService.importBatch2(userList);}

完事.实测非常优秀,3000条数据仅需100多毫秒


http://www.ppmy.cn/news/1516593.html

相关文章

对想学习人工智能或者大模型技术从业者的建议

“ 技术的价值在于应用&#xff0c;理论与实践相结合才能事半功倍” 写这个关于AI技术的公众号也有差不多五个月的时间了&#xff0c;最近一段时间基本上都在保持日更状态&#xff0c;而且写的大部分都是关于大模型技术理论和技术方面的东西。‍‍‍‍‍‍‍‍‍ 然后最近一段…

Mozilla为本地音频到文本翻译开发Whisperfile引擎

Mozilla Ocho 小组正进行 Mozilla 的"创新和实验"。Llamafile 用于将大型语言模型以单个文件的形式发布&#xff0c;以便在不同的硬件/软件间轻松执行。Whisperfile 是一项将音频轻松转化为文本的新引擎。 正如其名称所暗示的&#xff0c;Whisperfile 是围绕 OpenAI…

RabbitMQ如果有100万消息堆积在MQ,如何解决(消息堆积如何解决)面试版

什么情况下产生消息堆积 消息堆积&#xff1a;当生产者发送消息的速度 超过了 消费者处理消息的速度&#xff0c;就会导致队列中的消息堆积。 消息堆积会产生的问题&#xff1a;直到队列存储的消息达到上限。之后发送的消息就会成为死信&#xff0c;可能会被丢弃。 解决消息…

数据库表的nb3和sql后缀的处理方式

后缀是sql的话就直接运行sql文件 就可以把数据库添加到本地了&#xff08;像这样&#xff09; 右键你选择存放的数据库 -- 运行sql文件 -- 选择后缀是sql的文件 如果同事给你了一个后缀是nb3的话 那么就需要你去还原了 你想把这个表加到哪个库下就选择 右键备份 -- 还原备份从…

数据库查询大量数据避免内存溢出的方法

原理就是分批查询。每次查询一定数量数据之后记录id&#xff0c;进行数据处理之后再继续查询继续处理&#xff0c; allFrameObject mapper.findAllFrameObjectByMaxId(minTime, beginRow, 1000); while (CollectionUtils.isNotEmpty(allFrameObject)) {beginRow allFrameObj…

如何构建小学至大学素质评价档案系统 —— php Vue 实践指南

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

GPIO(通用输入/输出)、中断(hal库)

目录 GPIO&#xff08;通用输入/输出)&#xff08;hal库&#xff09; GPIO工作模式 推挽输出&#xff08;Push-Pull Output&#xff09; 开漏输出&#xff08;Open-Drain Output&#xff09; 复用推挽输出&#xff08;Alternate Function Push-Pull Output&#xff09; 复…

金融涉案账户压降行动的实施成效与挑战

2024年上半年我国出台了关于金融行业相关管理办法 1 - 5 号令&#xff0c;不断完善相关法律法规&#xff0c;加强对欺诈行为的打击力度。加强了对互联网企业的监管力度&#xff0c;要求企业加强内部管理&#xff0c;建立健全用户信息保护机制&#xff0c;防止用户信息泄露和被滥…

Lora微调训练参数解读

前言 通过前面两次微调训练欺诈文本分类微调&#xff08;六&#xff09;&#xff1a;Lora单卡和欺诈文本分类微调&#xff08;七&#xff09;—— lora单卡二次调优&#xff0c;我们已经初步理解了微调的整个过程&#xff0c;里面涉及到不少的参数配置&#xff0c;这篇文章就对…

redis面试(二十三)写锁释放

先加了写锁&#xff0c;后面再次加写锁或者读锁 anyLock: { “mode”: “write”, “UUID_01:threadId_01:write”: 2, “UUID_01:threadId_01”: 1 } 写锁的释放lua脚本在这里 RedissonWriteLock.unlockInnerAsync() 比如说现在的参数是这 KEYS[1] anyLock KEYS[2] redi…

卖旧电脑前怎么彻底清除数据?卖旧电脑不留隐患

在科技日新月异的今天&#xff0c;电脑已成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;随着技术的不断进步&#xff0c;我们可能会考虑更换新的电脑设备&#xff0c;而将旧的电脑出售或转让。 在卖旧电脑前&#xff0c;彻底清除电脑中的数据至关重要&#xff0c;…

leetcode46:全排列

全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 List<List<Integer>> list new ArrayList<>();public List<List<Integer>> permute(int[] nums) {LinkedList<Integer> …

Shader 中的渲染顺序

1、深度测试和深度写入 有了深度测试和深度写入发挥作用让我们不需要关心不透明物体的渲染顺序比如一个物体A 挡住了 物体B&#xff0c;即使底层逻辑中 先渲染A&#xff0c;后渲染B&#xff0c;我们也不用担心 B的颜色会把A覆盖&#xff0c;因为在进行深度测试时&#xff0c;远…

Java-BatchProcessingUtil结合CompletableFuture工具类

为了结合批处理与 CompletableFuture 并使用自定义线程池,我们可以创建一个功能全面的工具类 BatchProcessingUtil。这个工具类将支持以下功能: 批处理遍历列表中的每个元素。 使用自定义线程池执行批处理任务。 返回一个 CompletableFuture 对象以支持异步回调和结果处理…

BlazeFace: Sub-millisecond Neural Face Detection on Mobile GPUs

Abstract 我们提出了BlazeFace&#xff0c;这是一种轻量级且性能优异的面部检测器&#xff0c;专为移动GPU推理而设计。它在旗舰设备上运行速度可达200到1000 FPS。这种超实时性能使其能够应用于任何增强现实管道中&#xff0c;作为任务特定模型的输入来准确识别面部感兴趣区域…

从数据生成到图数据库:Linux下Neo4j的CSV导入

文章目录 简介找到import文件夹准备csv表格数据导入neo4jTeacherStudent 简介 介绍如何在Linux系统中设置和使用Neo4j数据库。 首先&#xff0c;找到Neo4j的import文件夹&#xff0c;通常位于Neo4j安装目录下的data文件夹内&#xff0c;并展示通过neo4j.conf配置文件查找和修…

MySQL 数据库的规范化与反规范化详解

在数据库设计中&#xff0c;规范化&#xff08;Normalization&#xff09;和反规范化&#xff08;Denormalization&#xff09;是两个重要的概念&#xff0c;它们直接影响数据的存储效率、数据一致性以及查询性能。本文将详细介绍 MySQL 中的第一范式、第二范式和第三范式&…

qt圆环饼状图,非常小的窗口都能显示

非常小的窗口都能显示 QT core gui charts#include <QtCharts> using namespace QtCharts;//创建饼状图 void MainWindow::createpieSewies() {//饼状图QPieSeries * my_pieSeries new QPieSeries();//中间圆与大圆的比例my_pieSeries->setHoleSize(0.35);//…

Python知识点:如何使用PostgreSQL与Psycopg2进行数据库操作

要使用PostgreSQL与Psycopg2进行数据库操作&#xff0c;首先需要确保你的环境中已经安装了PostgreSQL和Psycopg2库。以下是一个简单的指南&#xff0c;展示如何使用Psycopg2与PostgreSQL进行连接和执行基本的数据库操作。 1. 安装Psycopg2 如果你还没有安装Psycopg2&#xff…

【SQL基础】【leetcode】SQL50题

查询 &#xff08;1&#xff09;可回收且低脂的产品 题目链接 SELECT product_id FROM Products WHERE low_fatsY AND recyclableY;很简单&#xff0c;最基础的sql语句。 &#xff08;2&#xff09;寻找用户推荐人 题目链接 SELECT name FROM Customer WHERE referee_id …