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

优化大量数据导出到Excel的内存消耗(二):如果数据超出Excel单表上限,则进行分表

优化前:优化大量数据导出到Excel的内存消耗_大文件异步导出 内存占用高-CSDN博客

写Excel文件报错:Invalid row number (1048576) outside allowable range (0..1048575)

写入Excel时遇到`IllegalArgumentException`,原因是超出允许的最大行数。文章提供了解决方案,即使用多个sheet并将数据分批写入以避免此问题。

数据导出优化:如果数据超出Excel单表上限,Excel单表最多可以存储1048576条数据(1024的平方,2的20次方),如果数据超出Excel单表上限,则进行分表。

 public void writeExcel(OutputStream os, String sheetName, Map<String, String> header, List<Map<String, Object>> datas) {logger.info("导入数据到excel==========> 开始");long startTime = System.currentTimeMillis();  // 记录开始时间int rowAccessWindowSize = 100;  // 设置适当的行访问窗口大小SXSSFWorkbook wb = new SXSSFWorkbook(rowAccessWindowSize);wb.setCompressTempFiles(true);  // 启用临时文件压缩以提高性能int sheetIndex = 0; // 新增变量,用于追踪当前的sheet索引int maxRowsPerSheet = 1048576; // 单个sheet的最大行数int totalRecords = ObjectKit.isNotEmpty(datas) ? datas.size() : 0;  // 总共导出记录数logger.info("即将导出记录总数: " + totalRecords);Map<String, CellStyle> cellStyles = initStyles(wb); // 优化:样式创建移到循环外部while (!datas.isEmpty()) {String currentSheetName = sheetName + "_" + sheetIndex;Sheet sheet = wb.createSheet(currentSheetName);int rowNum = 0;Row row = sheet.createRow(rowNum);
//            Map<String, CellStyle> cellStyles = initStyles(wb);int cellNum = 0;// 写入表头for (Map.Entry<String, String> entry : header.entrySet()) {String fieldDesc = entry.getValue();Cell cell = row.createCell(cellNum);cell.setCellValue(fieldDesc);logger.info("导入数据到excel==========> 表头" + entry.getKey());cellNum++;}// 计算本次循环需要处理的数据量int recordsToProcess = Math.min(maxRowsPerSheet - 1, datas.size()); // 减去1是因为第一行是表头for (int i = 0; i < recordsToProcess; i++) {Map<String, Object> map = datas.remove(0); // 从列表头部移除已处理的数据rowNum++;row = sheet.createRow(rowNum);cellNum = 0;for (Map.Entry<String, String> entry : header.entrySet()) {String fieldName = entry.getKey();Object data = map.get(fieldName.toUpperCase());String dataString = null == data ? "" : data.toString();if (data instanceof BigDecimal) {Cell cell = row.createCell(cellNum);cell.setCellValue(((BigDecimal) data).toPlainString());cell.setCellStyle(cellStyles.get("Number"));} else {if (data instanceof Date || data instanceof Timestamp) {if (data.toString().contains(".")) {dataString = null == data ? "" : data.toString().substring(0, data.toString().indexOf("."));} else {dataString = null == data ? "" : data.toString();}}row.createCell(cellNum).setCellValue(null == data ? "" : dataString);}cellNum++;}// 当前已导出记录数及进度if(rowNum % 10000 == 0){logger.info("当前sheet已导出记录数: " + rowNum + ", 进度: " + ((float) rowNum / recordsToProcess) * 100 + "%");}}sheetIndex++; // 切换到下一个sheet}logger.info("导入数据到excel==========> 结束");long endTime = System.currentTimeMillis();  // 记录结束时间long elapsedTime = endTime - startTime;  // 计算耗时时间logger.info("总共导出记录数: " + totalRecords);long elapsedTimeInSeconds = elapsedTime / 1000;  // 将毫秒转换为秒logger.info("耗时时间: " + elapsedTimeInSeconds + " 秒 " );try {wb.write(os);} catch (IOException e) {throw new ImpException(ImpError.APP_ERR_20_04_10, e);} finally {try {if (null != wb) {wb.close();}} catch (IOException e) {logger.error(e.getMessage(), e);}}}

这一优化措施确保了当数据量超过Excel单表上限时,数据能够被有效地分散到多个工作表中,从而支持更大规模的数据导出。
目前测试了导出三百万数据正常则进行分表。

相关文章:

优化大量数据导出到Excel的内存消耗(二):如果数据超出Excel单表上限,则进行分表

优化前&#xff1a;优化大量数据导出到Excel的内存消耗_大文件异步导出 内存占用高-CSDN博客 写Excel文件报错&#xff1a;Invalid row number (1048576) outside allowable range (0..1048575) 写入Excel时遇到IllegalArgumentException&#xff0c;原因是超出允许的最大行数…...

rustrover打开会报Error: Invalid toolchain

如果 cargo --version 正常输出&#xff0c;但在使用 RustRover 时出现“Invalid toolchain”错误&#xff0c;可能是由于 RustRover 工具链配置有问题或路径指向错误。 解决步骤&#xff1a; 1. 检查 RustRover 的工具链配置 打开 RustRover&#xff0c;进入 Preferences 或…...

docker-compose 安装canal

创建 Canal 配置文件 /conf/canal.properties mkdir -p conf/ touch /conf/canal.properties # canal.properties# tcp bind ip canal.ip 0.0.0.0 canal.port 11111 canal.metrics.pull.port 11112# zookeeper 集群配置 canal.zkServers canal.zookeeper.sessionTimeout…...

Unity动画模块 之 3D Rig页签

​本文仅作笔记学习和分享&#xff0c;不用做任何商业用途本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​​ 1.Rig页签 Rig 选项卡 - Unity 手册&#xff0c;rig是设置骨骼与替身系统的&#xff0c;工作流程如下 Avatar是什么…...

【蓝桥杯冲刺省一,省一看这些就够了-Java版本】蓝桥杯日期问题相关模板以及练习题

蓝桥杯历年省赛真题 点击链接免费加入题单 日期问题 java.time Java 中用于处理日期和时间的主要类位于 java.time 包中。以下是一些常用的类和其功能的简要介绍&#xff1a; LocalDate&#xff1a;表示日期。它提供了获取年、月、日以及日期之间比较的方法。 LocalDate to…...

【经典算法】BFS_FloodFill算法

目录 1&#xff0c; 算法介绍2&#xff0c;算法原理和代码实现(含题目链接)733.图像渲染200.岛屿的数量695.岛屿的最大面积130.被围绕的区域 3&#xff0c; 算法总结 1&#xff0c; 算法介绍 FloodFill(洪水灌溉) 算法介绍&#xff1a; 假设一个 4 * 4 的方格代表一块土地&am…...

RocketMQ之Topic主题详解

Topic概念定义 主题&#xff1a;RocketMQ中消息传输和存储的顶层容器&#xff0c;用于标识同类业务中逻辑的消息&#xff0c;可理解为消息的分类&#xff0c;主题消息的分类取决于业务&#xff0c;要发送的业务消息最好单独是一个Topic主题&#xff0c;以保证互相不被干扰Topi…...

实战OpenCV之图像显示

基础入门 OpenCV提供的功能非常多&#xff0c;图像显示是最基础也是最直观的一部分。它让我们能够直观地看到算法处理后的效果&#xff0c;对于调试和验证都至关重要。在OpenCV中&#xff0c;图像显示主要依赖于以下四个关键的数据结构和函数。 1、Mat类。这是OpenCV中最基本的…...

I2C的10-bit地址空间

10-bit地址空间&#xff1a; I2C支持 10-bit的设备地址&#xff0c;此时的时序如下图所示&#xff1a; 在 10-bit地址的 I2C系统中&#xff0c;需要两个帧来传输 slave的地址。第一个帧的前 5个 bit固定为 b11110&#xff0c;后接 slave地址的高 2位&#xff0c;第 8位仍然是 …...

TinyWebserver的复现与改进(6):定时器处理非活动连接

如果客户端长时间没有动作&#xff0c;会占用了许多连接资源&#xff0c;严重影响服务器的性能。因此需要通过实现一个服务器定时器&#xff0c;处理这种非活跃连接&#xff0c;释放连接资源。 定时器处理流程 SIGALARM触发&#xff1a;整个流程开始于一个 SIGALARM 信号&…...

ThinkPHP5 5.0.23 远程代码执行漏洞

目录 1、启动环境 2、漏洞利用 3、更改传参方式 4、修改参数 5、发送数据 1、启动环境 docker-compose up -d 2、访问靶机ip端口号8080 2、漏洞利用 使用burpsuite抓包软件抓包 3、更改传参方式 将 GET传参改为POST传参 4、修改参数 url参数 /index.php?scaptcha post参…...

C++鼠标键盘操作自动化

C鼠标键盘操作自动化 #pragma once #include <Windows.h> enum KEYS{A 65,W87,S83,D68,SHIFTVK_LSHIFT,ALT18,Tilde 126,//~TABVK_TAB,B66,SPACEVK_SPACE,ESCVK_ESCAPE,Q81 }; enum MOUSE {ML,MW,MR//左&#xff0c;中&#xff0c;右 }; class simulator//模拟器 { pu…...

多个主流Python GUI库全面解析,助你用Python轻松构建精美界面

Python 作为一门易学易用的编程语言&#xff0c;在各个领域都拥有广泛的应用。而 GUI (Graphical User Interface) 编程更是让 Python 变得更加灵活&#xff0c;可以帮助我们创建各种各样的桌面应用&#xff0c;为用户提供直观的交互体验。本文将介绍几个Python GUI 编程中常用…...

Kotlin学习-01创建kotlin学习

安装idea https://www.jetbrains.com/zh-cn/ 创建项目 选择kotlin 修改Main.kt fun main() {print("Hello World!") }运行...

Java、python、php版的企业单位考勤打卡管理系统的设计与实现(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…...

在IntelliJ IDEA中使用Git推送项目

去gitee网站注册用户 gitee网站地址:https://gitee.com/ github网站地址:https://github.com/ 一、创建仓库 以下以gitee为例进行介绍&#xff0c;github操作雷同。 1、创建仓库 点击页面右上方的"“并选择"创建仓库” 2、设置仓库相关信息 首先输入仓库名&…...

CNN代码实战

CNN的原理 从 DNN 到 CNN &#xff08;1&#xff09;卷积层与汇聚 ⚫ 深度神经网络 DNN 中&#xff0c;相邻层的所有神经元之间都有连接&#xff0c;这叫全连接&#xff1b;卷积神经网络 CNN 中&#xff0c;新增了卷积层&#xff08;Convolution&#xff09;与汇聚&#xff08…...

迁移学习代码复现

一、前言 说来可能令人难以置信,迁移学习技术在实践中是非常简单的,我们仅需要保留训练好的神经网络整体或者部分网络,再在使用迁移学习的情况下把保留的模型重新加载到内存中,就完成了迁移的过程。之后,我们就可以像训练普通神经网络那样训练迁移过来的神经网络了。 我们…...

Elasticsearch(ES)常用命令

常用运维命令 一、基本命令1.1、查看集群的健康状态1.2、查看节点信息1.3、查看索引列表1.4、创建索引1.5、删除索引1.6、关闭索引1.7、打开索引1.8、查看集群资源使用情况&#xff08;各个节点的状态&#xff0c;包括磁盘&#xff0c;heap&#xff0c;ram的使用情况&#xff0…...

C/C++ 不定参函数

C语言不定参函数 函数用法总结 Va_list 作用&#xff1a;类型定义&#xff0c;生命一个变量&#xff0c;该变量被用来访问传递给不定参函数的可变参数列表用法&#xff1a;供后续函数进调用&#xff0c;通过该变量访问参数列表 typedefchar* va_list; va_start 作用&#xff…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...