EasyExcel的追加写入(新增POI、CSV)
总结:目前市面上流行的2种 EasyExcel和POI都不是真正的对物理excel文件进行追加导入。只是在缓存里面追加,最后一次性写入,并不能解决内存占用问题。
- 1.EasyExcel
- 2.POI
- 3.CSV
无非就是下面两种逻辑:
1.for循环查询数据,将数据写入缓存,最后一次性写入excel。
2.将已有的excel通过FIleInputStream流读出来,加载到内存当中,然后获取对应sheet页的行数,进行追加操作。
PS:建议使用CSV文件格式,直接使用Java原生的FileUtils追加写入
FileUtils.writeStringToFile(file, sb.toString(), "GBK", true);
下面来讲讲easyExcel、POI、csv相关的代码写法:
要求:
1.对表头进行排序过滤
2.对列进行排序过滤
1.EasyExcel
官网地址:EasyExcel官网
我们使用新版本的,旧的对于字段排序/过滤都不支持<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version></dependency>//此为线程池异步导出
commonExecutor.execute(() -> {File file = null;ExcelWriter excelWriter = null;try {file = File.createTempFile("a", ".xlsx");file.deleteOnExit();excelWriter = EasyExcel.write(file, UserVO.class).head(headlist) // 表头,传入一个list集合.includeColumnFieldNames(showColumnList) // 对于UserVO要展示的列集合.orderByIncludeColumn(true) // 是否根据showColumnList集合的顺序排序.autoCloseStream(true) // 自动关闭流.build();WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();// 循环 200/页查询数据int pageNum = 1;int pageSize = 200;while (true) {List<UserVO> voList = getData(pageNum, pageSize); // getData根据业务实现// 将数据写入临时文件 此处循环追加就是写到内存里面excelWriter.write(voList , writeSheet);if (pageNum * pageSize >= count) {break;}pageNum++;}// 数据处理完毕后,刷盘写入物理文件excelWriter.finish();} catch (Exception e) {log.error("导出 异常:" + e.getMessage(), e);} finally {// 删除临时文件if (!Objects.isNull(file)) {file.delete();}}
});
2.POI
网传SXSSFWorkbook可以实现追加写入,然后实操后,其实是覆盖写入。
//SXSSFWorkbook 和 XSSFWorkbook 都差不多,只是定义不同,写法都差不多import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;public class ExcelAppender {public static void main(String[] args) {String filePath = "C:\\Local\\Temp\\11.xlsx";// 构造一个查询数据的列表List<String> queryDataList = List.of("query4", "query5", "query6");// 加载已存在的 Excel 文件try (Workbook workbook = new SXSSFWorkbook(new FileInputStream(new File(filePath)))) {Sheet sheet = workbook.getSheetAt(0);// 获取已存在数据的最后一行索引int lastRowNum = sheet.getLastRowNum();// 在最后一行索引的下一行开始追加写入查询数据int rowNum = lastRowNum + 1;for (String queryData : queryDataList) {Row row = sheet.createRow(rowNum++);Cell cell = row.createCell(0);cell.setCellValue(queryData);}// 保存修改后的工作簿到文件try (FileOutputStream outputStream = new FileOutputStream(new File(filePath))) {workbook.write(outputStream); System.out.println("查询数据已覆盖写入到 Excel 文件:" + filePath);} catch (IOException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();}}
}
3.CSV
来写我最终选择的写法CSV,就是追加物理文件数据。很不错。
commonExecutor.execute(() -> {File temp = null;try {temp = File.createTempFile("aaa", ".csv");temp.deleteOnExit();List<List<String>> fillData = new ArrayList<>();// 1.初始化表头,showNameList是表头集合,有顺序的哈~fillData.add(ImmutableList.of(showNameList.toString()));// 2.循环 200/页查询数据int pageNum = 1;int pageSize = 200;while (true) {List<UserVO> recordVOList = getData(pageNum, pageSize);// 3.填充业务数据 我用的反射fillData.addAll(ExcelUtil.convertSortEntityListToDataList(showColumnList, recordVOList));StringBuilder sb = new StringBuilder();for (List<String> rowData : fillData) {sb.append(String.join(",", rowData));sb.append(System.lineSeparator());}try {FileUtils.writeStringToFile(temp, outPutStr, "GBK", true);} catch (IOException e) {log.error("写入CSV 异常:{}", e.getMessage(), e);return;}if (pageNum * pageSize >= count) {break;}pageNum++;fillData.clear();}} catch (Exception e) {log.error("导出 异常:{}", e.getMessage(), e);} finally {// 4.删除临时文件if (!Objects.isNull(temp)) {temp.delete();}}
});
当然,会存在一定的问题,比如csv文件打开时,office全家桶会把日期格式转换,比如:
“2024-01-04 14:28:29” -> “2024/1/4 14:28:29”
就看大家能不能接受了。
相关文章:
EasyExcel的追加写入(新增POI、CSV)
总结:目前市面上流行的2种 EasyExcel和POI都不是真正的对物理excel文件进行追加导入。只是在缓存里面追加,最后一次性写入,并不能解决内存占用问题。 1.EasyExcel2.POI3.CSV 无非就是下面两种逻辑: 1.for循环查询数据,…...
JetBrains 开发工具——免费教育许可申请流程
JetBrains 开发工具——免费教育许可申请流程 本文将详细介绍通过教育邮箱申请Free Educational Licenses. Free Educational Licenses地址 1.选择符合自己的申请入口 2.填写申请表单提交 官方指南 😃😃😃...
打造高性价比小程序,轻松降低成本
随着移动互联网的普及,小程序已经成为一个热门的应用开发方向。然而,对于许多企业和个人而言,制作一个小程序的费用却让人望而却步。那么,如何以最低的成本制作一款高性价比的小程序呢? 答案很简单,只需要找…...
mysql 索引优化查询
MySQL的索引可以提高数据库查询性能。下面是一些常用的MySQL索引优化技巧: 创建合适的索引:根据查询条件选择合适的列作为索引,并确保这些索引在WHERE子句中被使用到。 示例代码:CREATE INDEX idx_name ON table_name (column_nam…...
跟着cherno手搓游戏引擎【4】窗口抽象、GLFW配置
引入GLFW: 在vendor里创建GLFW文件夹: 在github上下载,把包下载到GLFW包下。 GitHub - TheCherno/glfw: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input修改SRC/premake5.lua的配置:12、13、15、36…...
Tomcat基础升华学习
01 What is Tomcat 1.1 Tomcat官网 官网 :https://tomcat.apache.org 1.2 Understand 为什么说Tomcat是Servlet之类技术的实现? 在我们的理解中,Tomcat可以称为Web容器或者Servlet容器 不妨通过手写一个Tomcat来推导一下 1.2.1 创建Tomc…...
一种具有轨迹优化的无人驾驶车实时运动规划器 论文阅读
论文题目:A Real-Time Motion Planner with Trajectory Optimization for Autonomous Vehicles Abstract 本文的实时规划器首先将空间离散化,然后基于一组成本函数搜索出最佳轨迹。迭代优化所得到的轨迹的Path和Speed。post-optimization计算复杂度低&…...
GPDB - 高可用 - 流复制状态
GPDB - 高可用 - 流复制状态 GPDB的高可用基于流复制,通过FTS进行自动故障切换。自动故障切换需要根据primary-mirror流复制的各种状态进行判断。本节就聊聊primary-mirror流复制的各种状态。同样适用于PgSQL 1、WalSndState typedef enum WalSndState {WALSNDSTATE…...
最佳解决方案:如何在网络爬虫中解决验证码
Captcha(全自动区分计算机和人类的公开图灵测试)是广泛应用的安全措施,用于区分合法的人类用户和自动化机器人。它通过呈现复杂的挑战,包括视觉上扭曲的文本、复杂的图像或复杂的拼图等方式,要求用户成功解决这些挑战以…...
在线项目实习分享:股票价格形态聚类与收益分析
01前置课程 数据挖掘基础数据探索数据预处理数据挖掘算法基础Python数据挖掘编程基础Matplotlib可视化Pyecharts绘图 02师傅带练 行业联动与轮动分析 通过分析申银万国行业交易指数的联动与轮动现象,获得有意义的行业轮动关联规则,并在此基础上设计量…...
c# vb.net检测字符串是否匹配一组相似度数组input Like
VB.NET 检测字符串是否符合一个数组中的多个like条件,有没有最简单的函数? 在VB.NET中,可以使用Array.Exists方法结合String.Like方法来检测一个字符串是否符合一个数组中的多个LIKE条件。Array.Exists方法用于确定序列中的任何元素是否满足…...
DEJA_VU3D - Cesium功能集 之 113-获取圆节点(2)
前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…...
spring-boot项目启动类错误: 找不到或无法加载主类 com.**Application
问题:Springboot项目启动报错:错误: 找不到或无法加载主类 com.**Application 解决步骤: 1.File–>Project Structure 2.Modules–>选中你的项目–点击“-”移除 3.重新导入:点击“”号,选择Import Module&…...
搭建大数据开发环境【AutoDL容器】
租用AutoDL容器 注意:结束实验时记得将数据库数据转移存储 使用Docker实现本地IDEA连接AutoDL 后为ssh服务器地址用户名为前的端口号ssh密码为用户密码 安装JDK 压缩包安装 Java下载地址:Oracle Java Download(hadoop不指定特定版本java&…...
写一个简单的Java的Gui文本输入窗口,JFrame的简单使用
JFrame是指一个计算机语言-java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。 Swing的三个基本构造块:标签、按钮和文本字段;但是需要个地方安放它们,并希望用户知道如何处理它们。JFrame 类就是解决这个问题的——它是一个容器…...
Unity中URP下抓屏的 开启 和 使用
文章目录 前言一、抓屏开启1、Unity下开启抓屏2、Shader中开启抓屏 二、抓屏使用1、设置为半透明渲染队列,关闭深度写入2、申明纹理和采样器3、在片元着色器使用请添加图片描述 三、测试代码 前言 我们在这篇文章中看一下,URP下怎么开启抓屏。 一、抓屏…...
业务题day01
1-1 请说一下你项目中是如何进行项目管理和发布的 我们项目使用的是Gogs进行代码托管,Jenkins进行项目自动运维发布。 在我们的项目中,我们使用Gogs进行代码托管和版本控制,以确保团队成员可以协同开发和管理代码。 Gogs是一个轻量级的、开…...
DEJA_VU3D - Cesium功能集 之 114-雷达效果(基础效果)
前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…...
【Leetcode】2696. 删除子串后的字符串最小长度
文章目录 题目思路代码 题目 2696. 删除子串后的字符串最小长度 思路 计算通过删除字符串中的 “AB” 和 “CD” 子串后,可获得的最终字符串的最小长度。 主要思路是使用一个栈来模拟字符串的处理过程,每次遍历字符串时,如果当前字符和栈…...
利用gulp工具对常规web项目进行压缩打包
前言 对于一个常规的web项目,如下项目目录 |- imgs | - img1.png | - img2.png |- js | - user.js | - utils.js |- css | - index.css | - user.css |- html | - user.html |- index.html可以使用各种构建工具(如webpack、gulp、grunt等)来…...
面试经典题---68.文本左右对齐
68.文本左右对齐 我的解法: 两层while循环嵌套,外层循环用于处理不同行,内层while循环计算出每行应有的单词个数。 使用left和right记录一行中应有的单词下标,即当前行应包含从words[left]到words[right-1]这count个单词…...
完整的模型验证套路
读取图片 from PIL import Imageimg_path "../Yennefer_of_Vengerberg.jpg" image Image.open(img_path) print(image)转换成灰度图(可选) image image.convert(L) image.show()转换成RGB格式 image image.convert(RGB)因为png格式是四…...
内 存 取 证
1.用户密码 从内存中获取到用户admin的密码并且破解密码,以Flag{admin,password}形式提交(密码为6位); 1)查看帮助 -h ./volatility_2.6_lin64_standalone -h 2)获取内存镜像文件的信息 imageinfo ./volatility_2.6_lin64_stand…...
【PHP】价格区间字段验证,如4万-5万
参数值示例: $str1 "4万-5万"; $str2 "4万-5万元"; $str3 "5万元以内"; 以下是一个PHP示例,用于检查字符串是否满足要求: function checkString($str) {// 检查字符串中是否包含"-"或"以内…...
安徽省暨合肥市“希望工程·梦想计划”小盖茨机器人捐赠启动仪式举行
1月5日,安徽省暨合肥市“希望工程梦想计划”小盖茨机器人捐赠启动仪式在合肥市一六八玫瑰园学校东校区举行。共青团安徽省委副书记叶征,北京儒布特教育科技有限公司董事牛俊明,北京儒布特教育科技有限公司市场总监高进,安徽省青基…...
Kafka消息存储
一、层次结构 具体到某个broker上则是, 数据目录/分区名/日志相关文件集合。其中日志文件集合内包括.log文件, index索引文件和.timeindex时间戳索引文件。 二、.log 结构 .log中记录具体的消息。一般消息由header和body组成, 这点儿在Kafka消息中也同样适用。 message MES…...
【Vue3+Ts项目】硅谷甄选 — 用户管理+角色管理+菜单管理+首页
一、用户管理 1.1 接口 1.1.1 接口定义 src/api/acl/user/index.ts // 用户管理模块的接口 import request from /utils/request import type {AllRoleResponseData,SetRoleData,User,UserResponseData } from ./type enum API {// 获取全部已有用户账号信息ALLUSER_URL /…...
node连接Mysql失败
报错信息 Error: connect ETIMEDOUTat Connection._handleConnectTimeout (d:\课设\服务器端\node_modules\mysql\lib\Connection.js:409:13)at Object.onceWrapper (node:events:628:28)at Socket.emit (node:events:514:28)at Socket._onTimeout (node:net:589:8)at listOnT…...
运用AI搭建中间服务层(四)
MiddlewareService文件夹 在这个文件夹中,我们需要添加以下文件: 名人服务.cs 名人服务.cs 名人结果.cs ILandmarkService.cs 地标服务 .cs 地标结果 .cs ICelebrityService.cs – 包装多个串行的认知服务来实现名人识别的中间服务层的接口定义&…...
[C#]winform部署yolov5-onnx模型
【官方框架地址】 https://github.com/ultralytics/yolov5 【算法介绍】 Yolov5,全称为You Only Look Once version 5,是计算机视觉领域目标检测算法的一个里程碑式模型。该模型由ultralytics团队开发,并因其简洁高效的特点而备受关注。Yol…...
昆明做网站开发维护的公司/提高工作效率总结心得
背景:从csv读取数据,并赋值到对应结构体字段。 由于读取出来的数据为string,需要根据结构体字段类型逐一赋值; /// 假定要赋值的结构体类型 struct stStudent {char name[64];int age;double score;stStudent(){memset(thi…...
音乐 版权 做视频网站/个人自己免费建网站
转载自:https://blog.csdn.net/shaoxiaohu1/article/details/40272531 有这样一幅图, 我们想获取其中的连通区域,可以使用以下代码: src_img_name blue_sky_white_clound_002594.jpg; img imread(src_img_name);% get binary …...
南京网站建设推广/上海seo网站优化
Diagrams 是一个基于Python绘制云系统架构的模块,它能够通过非常简单的描述就能可视化架构,并支持以下6个云产品的图标:AWS、Azure、GCP、K8s、阿里云 和 Oracle 云基于Diagrams提供的节点,你只需要指定一个云产品(实际上选哪个都…...
自己做图片网站/北京seo学校
https://developer.tizen.org/downloads/sample-web-applications https://01.org/html5webapps/webapps 转载于:https://www.cnblogs.com/androidme/p/3250006.html...
网站投票怎么做/网络推广属于什么专业
贪心算法入门 一、什么是贪心算法 “贪心算法(greedy algorithm,又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义…...
公司网站招聘板块怎么做/如何快速推广网上国网
无法挂载,提示 unsafe state的时候,请使用 sudo nftsfix dev/sdc5 #这个参数看报错信息来确定安装chrome无法打开网页或者无法启动的时候,在命令行中启动程序,输入网址,观察报错信息搜素解决方案 转载于:https://www…...