java海量数据导出xls分页解决报内存溢出问题

Java Excel导出实战:EasyExcel核心用法与性能优化指南 在Java后端开发中,数据导出是常见的功能需求,尤其涉及Excel文件生成时,传统方案常面临内存溢出与代码冗长等挑战。其核心原理在于通过流式处理模型,将数据分批写入,有效规避大文件操作时的内存瓶颈。这一技术价值在于显著提升了开发效率与系统稳定性,使开发者能更专注于业务逻辑而非底层文件操作细节。在实际应用场景中,无论是简单的数据报表导出,还是包含复杂表头、动态样式的大数据量报表生成,都需要兼顾功能实现与性能优化。本文聚焦于EasyExcel这一工具,深入探讨其如何通过注解驱动、样式缓存等机制,结合分页查询与异 阅读详情
    /**
     * 写XLS文件
     * @param fileName 文件名(全路径)
     * @param colTitleList 标题
     * @param colPorpertyList 如果属性列 为NULL,则resultData 中的每个元素为一个LIST
     * @param resultData 数据
     * @throws Exception
     */
    public static void writeXLS(HttpServletResponse response,String fileName,List colTitleList,List colPorpertyList,List resultData) throws Exception  {
        if (resultData == null)
            resultData = new ArrayList();
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+fileName+" data count="+resultData.size());
    int maxCount = 65536;//每页数据最多65536行
    boolean bNeedTitle = true;//每页是否要加上标题一行
        if (colTitleList == null || colTitleList.size() ==0)
        bNeedTitle = false;
       
    HSSFWorkbook workBook = new HSSFWorkbook();
    int nDataPerPage = maxCount;//每页数据条数.
    if (bNeedTitle)
    nDataPerPage = maxCount-1;
    //SHEET数
    int sheetCount = resultData.size()/nDataPerPage;
    if (resultData.size()%nDataPerPage!=0)
    sheetCount++;
   
    //如果无数据,则只添加标题行
    if (sheetCount == 0){
       HSSFSheet sheet = workBook.createSheet("sheet0");
            if (bNeedTitle){
                HSSFRow row = sheet.createRow(0);
                addSheetRow(colTitleList,row);
            }
    }
    OutputStream ouputStream = null;
    int rowIndex = 0;//当前数据写到第几行的索引值
    for(int i=0;i<sheetCount;i++) {
    System.out.println("页码======"+i);
    HSSFSheet sheet = workBook.createSheet("sheet"+i);
  
    int dIndex = 0;
    //添加标题
    if (bNeedTitle){
    HSSFRow row = sheet.createRow(dIndex++);
    addSheetRow(colTitleList,row);
    }
   
    //添加数据
    while(dIndex < maxCount) {
    //System.out.println("条数"+dIndex);
    HSSFRow tempRow = sheet.createRow(dIndex++);//建立新行
    List rowDataObj = null;
    if (colPorpertyList == null)//如果没有传属性列,则resultData 中的每个元素为一个LIST
       rowDataObj = (List)resultData.get(rowIndex++);
    else rowDataObj= getRowData(colPorpertyList,resultData.get(rowIndex++));
       addSheetRow(rowDataObj,tempRow);
       
    //全部写完了
        if (rowIndex == resultData.size())break;
    }
    }
   
    ouputStream = response.getOutputStream();
//数据流输出
response.setContentType("application/vnd.ms-excel");  
response.setHeader("Content-disposition", "attachment;filename ="+fileName+".xls"); 
workBook.write(ouputStream);
ouputStream.flush();  
ouputStream.close();
//OutputStream fos = new BufferedOutputStream(new FileOutputStream(new File("D:/down/aa.xls")),1024);
//workBook.write(fos);
//fos.flush();
//fos.close();

    }



/**
     * 添加标题
     * @param colTitleList
     * @param row
     */
    private static void addSheetRow(List rowDataList,HSSFRow row){
    if (rowDataList == null || rowDataList.size() == 0)return;
Iterator tIter = rowDataList.iterator();
int index = 0;
while (tIter.hasNext()) {
HSSFCell cell = row.createCell((short)index++);
//cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(String.valueOf(tIter.next()));
}
    }


经测试 下载一百多万的数据 查询要一分半 导出要三分钟左右,不会报内存溢出  但是数据量太大 xls 文件无法打开  推荐把文件分开放入zip中。

别再手动复制粘贴了!用Java+Spire.XLS 15.6.3搞定Excel模板批量填充(附源码) 本文详细介绍了如何利用Java和Spire.XLS 15.6.3实现Excel模板的自动化批量填充,大幅提升数据处理效率。通过实战案例和代码示例,展示了从环境配置到高级数据绑定的全流程,帮助开发者告别低效的手工操作,适用于金融、电商等行业的报表生成场景。 阅读详情

相关推荐

EasyExcel实战:从原理到百万级数据导入导出优化

在Java后端开发中,Excel数据处理是高频且关键的技术需求,尤其在数据交换与报表生成场景。传统基于Apache POI的方案常因全量内存模型导致处理大文件时内存溢出(OOM)风险。EasyExcel作为阿里巴巴开源工具,其核心原理采用SAX事件驱动模型进行流式解析,实现了内存的高效利用。通过注解驱动与监听器模式,它将繁琐的API调用封装简化,使开发者能聚焦业务逻辑。该技术在处理复杂表头、动态列及百万级数据导入导出时展现出显著价值,广泛应用于管理后台、数据报表及批量操作等场景,是解决Java中Excel读

weixin_30945039的博客 377

java使用easyexcel 一分钟 百万级数据快速分片导出 excel

由于 POI在处理大型文档时可能会占用大量内存,尤其是对于Excel文件。在处理特别大的数据集(如数万行Excel)时,性能可能会受到影响。有可能会出现内存溢出的情况。所以一般在处理百万计数据时,推荐使用easyexcel。首先准备数据:此处使用的mysql数据库,我们直接给表中插入四百万条数据。此处查询数据:四百多万条,大小将近100mb.数据的导出用时如下:我的电脑配置如下:本来还想将分片写入部分的代码,搞成多线形式同时写入,最后没有成功。原因是:easyexcel不支持多线程的同时写入。

w_l666的博客 2204

Java POI导出Excel避坑指南:为什么WPS能打开而Office打不开?

本文深入解析Java POI导出Excel时WPS能打开而Office打不开的兼容性问题,重点对比HSSFWorkbook、XSSFWorkbook和SXSSFWorkbook的差异与应用场景,提供实战解决方案和避坑指南,帮助开发者正确处理Excel文件格式与扩展名匹配问题。

hadoop5ranger的博客 517

java 导出内存溢出_java导出excel(解决导出几万条数据内存溢出的问题)

import java.io.BufferedOutputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class Tes...

weixin_39612677的博客 571

Java Excel报表导出利器JXLS:模板化声明式编程实战指南

在Java后端开发中,Excel报表导出是一项常见且复杂的需求,传统基于Apache POI的硬编码方式不仅代码冗长,维护成本也高。声明式编程思想通过将样式与数据逻辑分离,提供了更优雅的解决方案。JXLS正是基于这一理念构建的模板引擎,它允许开发者在Excel中预先设计模板,通过简单的标记定义数据填充规则,后端仅需提供数据模型即可生成格式规范的报表。这种模式大幅提升了开发效率,降低了因需求变动带来的维护成本。从技术实现看,JXLS底层依赖JEXL表达式语言和Apache POI,支持循环、条件判断、公式处理

weixin_34185320的博客 367

POI导出Excel万级数据分页实现 解决内存溢出问题

一个POI导出Excel万级数据分页实现 解决内存溢出问题 完整的 project demo 有数据库dmp文件

解决java poi海量数据导出内存溢出问题

摘要: 解决java poi海量数据导出导致内存溢出的问题 找了很多天的解决方法,一直被分页查询绕进去了,其实数据都能查出来的,真正卡的地方是ExcelExportUtil类下调错了方法。     最开始调用的方法是(标记的地方):  workbook = new HSSFWorkbook();和 workbook = new XSSFWorkbook(); 这两个方法就是导出Excel...

u010486495的专栏 2815

SAP 货币类型和公司代码的货币设置

货币类型分为公司代码和集团货币,一般FI 10类型和集团货币 30,事务代码是8KEM; 设置货币类型的事务代码是OB22 在S/4 1809版本里编辑功能统合到事务代码FINSC_LEDGER 中了,这里集中了分类账和公司代码的设置; 设置多账簿的币种(会出现在BSEG和FAGLFLEXA表中) 汇率维护在TCURR表中,可通过BAPI_EXCHANGERATE_GETDETAIL函数获取。 CO货币的事务代码是成本控制范围货币:OKKP ,一般设置为货币码20和30; 另外, SCC4设置集团货币,

RichardYang2020的博客 1万+

分页导出,防止内存溢出

分页导出,防止内存溢出 1.定义模板方法类 /** * 分页导出模板 * * T 为查询参数 需要有 PageNo 和 PageSize * R 为查询结果,导出的对象 */ public abstract class PagingExportTemplate<T extends BasicQueryEntity,R> { private static final Logger log = LoggerFactory.getLogger(PagingExportTempl

qq_41738264的博客 434

Jenkins测试详细使用教程(二):jenkins两种主要构建方法

Jenkins有两种定义构建作业的主要方法:(自由风格项目)和Pipeline(流水线项目)。

m0_62825058的博客 2435

FOFA奇技淫巧:从搜索语法到实战场景的深度挖掘

本文深入探讨了FOFA搜索语法在网络空间测绘中的高效应用,从基础语法到实战场景的深度挖掘。通过渗透测试、威胁狩猎、资产发现等实际案例,展示了如何利用FOFA精准定位目标系统、识别蜜罐、追踪威胁,并提供了合规使用指南和性能优化技巧,助力安全工作者提升效率。

weixin_32428571的博客 237

Java导出Excel百万条数据表格数据实现分页easyexcel方法和Apach POI方法

百万条数据导出excel 分页写入

beiback的博客 5163

HMC7044芯片模拟SPI配置

摘要: HMC7044是一款高性能双环路整数N分频抖动衰减器,支持SPI接口配置,适用于高速数据转换器时钟系统。该芯片采用双PLL级联架构,具有14路可配置输出,可满足GSM/LTE基站设计需求。SPI接口采用3线模式(SLEN/SCLK/SDATA),支持24位寄存器读写(13位地址+8位数据)。驱动实现基于Zynq EMIO模拟SPI,提供初始化、数据传输及寄存器配置功能,支持三线制工作模式和多种时钟参数设置。

toonyhe的博客 1096

Java导出大批量数据(文件格式篇xls,xlsx,csv)

java导出我准备分为三篇文章介绍文件格式篇xls,xlsx,csv,分批查询导出篇,异步多线程导出篇一起来看看吧Java导出excel文件 我分为了xls,xlsx,csv三个文件格式首先介绍下三种文件格式的优劣导出少量数据 需要表头样式的 采用xlsx文件导出导出大量数据 无表头样式要求 采用csv文件导出。.........

夜の雨的博客 1万+

FT601Q芯片深度解析:从USB3.0引脚定义到FPGA FIFO协议实战选型

本文深入解析FT601Q芯片在USB3.0接口设计与FPGA协议栈开发中的应用,详细介绍了USB3.0引脚定义、FT601Q芯片架构、245同步FIFO模式及硬件设计要点,帮助工程师实现高速数据传输系统。

weixin_30607659的博客 447

SAP自动化-ME51N批量创建采购申请

2、需要管理员授权RZ11脚本录制回放功能。1、仅限于正对SAP日常工作的批量处理。3、数据模板按实际需求更新。物料编码,工厂,数量。

小九啥也不会 530

Apache Fesod:突破Excel处理瓶颈的Java高效解决方案

Apache Fesod作为easyexcel作者最新升级版本,是一款专为解决大文件内存溢出问题而设计的Java处理Excel工具。其快速、简洁的特点让开发者在处理超大型Excel文件时无需担心内存问题,通过智能内存管理策略将永久内存使用控制在30MB左右,为Java开发者提供了前所未有的Excel数据处理体验。 ## 🎯 为什么Apache Fesod成为Excel处理的首选工具? 在处理

gitblog_01173的博客 1114

Win7/10/11文件拖拽导致资源管理器闪退问题

最近老是遇到把文件从资源管理器拖动到微信或者浏览器时,资源管理器直接闪退的问题,一开始在公司遇到了还以为是电脑配置太低,直到被封闭在家办公,发现自己的高级电脑也有这个问题,那就来了解了解问题是出在什么地方把。

Nicer_feng's blog 1万+

EasyExcel实战:告别OOM,掌握Java高效Excel导入导出核心技巧

在Java后端开发中,处理Excel文件是常见的需求,但传统方式如Apache POI在处理大数据量时,常因DOM解析模型导致内存溢出(OOM)和性能瓶颈。其原理是将整个文件加载到内存,形成对象树,这在大数据场景下会引发内存爆炸和频繁的Full GC。为了解决这些问题,基于SAX事件模型的流式读写技术应运而生,它通过逐行解析和写入XML,将内存占用从与文件大小成正比降至与处理行宽成正比,从而在保证性能的同时显著降低内存压力。这项技术的核心价值在于能够高效、稳定地处理海量数据,适用于财务对账、报表生成、数据迁

weixin_33894640的博客 458

执行任务赚积分

接下来N行,每行两个空格分隔的整数(SLA和V),SLA表示任务的最晚处理时间,V表 示任务对应的积分。每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。第2个时间单位内,处理任务4,获得5个积分。输入描述:第一行为一个数N,表示有N个任务,1

面试高手的博客 4695

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java终极指南:如何用Apache Fesod轻松处理百万级Excel数据

Apache Fesod是一款高性能、内存高效的Java电子表格处理库,专门为处理大规模Excel数据而设计。作为easyexcel作者的最新升级版本,Fesod解决了传统Excel处理工具在面对大文件时常见的内存溢出问题,让开发者能够轻松处理百万级甚至千万级的数据量。 ## 📊 为什么需要Apache Fesod? 在传统Java Excel处理中,POI等库需要将整个Excel文件加载到

gitblog_00435的博客 471

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java使用Apache POI实现Excel导入导出:从基础读写到性能优化

在Java后端开发中,数据导入导出是高频且核心的需求,尤其涉及报表生成、批量数据处理等场景。Apache POI作为Java处理Microsoft Office格式文档的事实标准库,其核心原理是通过一套面向对象的模型(Workbook、Sheet、Row、Cell)映射Excel文件结构,实现对.xls和.xlsx文件的读写操作。这一技术价值在于将繁琐的手工操作自动化,极大提升了数据交换与处理的效率。其典型应用场景包括用户数据批量导入、销售报表生成、财务对账等。本文聚焦于POI的实战运用,详细解析了在IDE

weixin_34121304的博客 370

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

AzerothCore服务端跑通全流程:4步启动 authserver + worldserver

照着做完,你会得到一个可用的 AzerothCore 服务端(authserver + worldserver 两个进程),可以直接被魔兽世界 3.3.5 客户端连接。AzerothCore 是一套完整的开源 MMO 服务端方案,核心流程只有 4 步,视硬件约 1~2 小时。 ## 准备环境清单 | 项目 | 要求 | 说明 | |---|---|---| | 系统 | Ubuntu 24.0

gitblog_00582的博客 270

Java Excel处理实战:EasyExcel核心原理、应用与性能优化指南

在Java后端开发中,Excel文件的读写是常见的数据交换需求,其核心挑战在于处理海量数据时的内存溢出(OOM)与性能瓶颈。传统基于POI的DOM解析模式需要将整个文档加载至内存,极易引发资源耗尽。为解决此问题,事件驱动的SAX解析模型应运而生,它通过逐行解析与监听器机制,实现了流式处理,大幅降低了内存占用。这一技术价值在于为大规模数据导入导出提供了稳定、高效的底层支持,广泛应用于报表生成、数据迁移及批量操作等场景。阿里巴巴开源的EasyExcel正是基于此原理构建的Java工具库,它通过注解驱动映射与监听

weixin_33860528的博客 389

如何快速掌握大数据处理:面向开发者的Excel流式读取完整解决方案

Excel Streaming Reader是一个基于Apache POI的高效流式Excel读取器,专门为解决大型Excel文件处理时的内存溢出问题而生。这个开源项目通过创新的流式处理技术,让开发者能够在处理数百万行数据的Excel文件时保持稳定的内存使用,是服务器环境和大数据处理场景的理想选择。🚀 ## 📊 为什么需要Excel流式读取器? 如果你曾经使用Apache POI处理大型E

gitblog_01425的博客 1088
上一篇: tomcat 超时最简单的处理方式
下一篇: 海量数据导出解决内存溢出问题csv txt格式
zy_crazy_code
博客等级 码龄12年 290粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值