将业务数据导出到Excel表中,导出任务数据量较大时,导出的项目就会内存溢出,本文通过Java操作Poi的SXSSFWorkbook类进行导出,解决内存溢出问题。

1.采用Poi中的SXSSFWorkbook

在实现excel导出时,在数据量过大的情况下,总是容易发生内存溢出的情况。可以使用POI提供的 SXSSFWorkbook 类来避免内存溢出。

2.maven中引入Poi

     <!-- poi start --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><!-- poi end -->
复制代码

3.测试过程

先使用普通的写法测试(XSSFWorkbook),编写writeNormalExcelTest测试方法,写入的行数太多时,会报内存溢出(在设置-server -Xmx64m -Xms64m -Xmn32m的情况下)。

接着编写SXSSFWorkbook操作excel的测试,测试方法writeHugeExcelTest(同样在设置-server -Xmx64m -Xms64m -Xmn32m的情况下),结果证明无内存溢出,能完好的导出1000000行测试数据,整个Java类代码如下:

4.单元测试Java代码

package cn.gzsendi.exceltest;import java.io.FileOutputStream;
import java.io.IOException;import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;public class HugeExcelExportTest {private int totalRowNumber = 1000000; //写入的excel数据行数private int totalCellNumber = 40; //excel每行共40列//普通的写入excel的方法,会消耗内存,写入的行数太大时,会报内存溢出@Testpublic void writeNormalExcelTest(){Workbook wb = null;FileOutputStream out = null;try {long startTime = System.currentTimeMillis();wb = new XSSFWorkbook();Sheet sheet = wb.createSheet("Sheet 1");//定义Row和Cell变量, Rows从0开始.Row row;Cell cell;for (int rowNumber = 0; rowNumber < totalRowNumber; rowNumber++) {row = sheet.createRow(rowNumber);for (int cellNumber = 0; cellNumber < totalCellNumber; cellNumber++) {cell = row.createCell(cellNumber);cell.setCellValue(Math.random()); //写入一个随机数}//打印测试,if(rowNumber % 10000 ==0) {System.out.println(rowNumber);}}//Write excel to a fileout = new FileOutputStream("d:\\temp\\normalExcel_" + totalRowNumber + ".xlsx");wb.write(out);long endTime = System.currentTimeMillis();System.out.println("process " + totalRowNumber + " spent time:" + (endTime - startTime) + " ms.");} catch (Exception e) {e.printStackTrace();} finally {try {if(out != null) out.close();} catch (IOException e) {e.printStackTrace();}try {if(wb != null) wb.close();} catch (IOException e) {e.printStackTrace();}}}//结合临时文件压缩等写入excel,默认超过100行就写到临时文件,不会报内存溢出@Testpublic void writeHugeExcelTest(){SXSSFWorkbook wb = null;FileOutputStream out = null;try {long startTime = System.currentTimeMillis();wb = new SXSSFWorkbook();//默认100行,超100行将写入临时文件wb.setCompressTempFiles(false); //是否压缩临时文件,否则写入速度更快,但更占磁盘,但程序最后是会将临时文件删掉的Sheet sheet = wb.createSheet("Sheet 1");//定义Row和Cell变量, Rows从0开始.Row row;Cell cell;for (int rowNumber = 0; rowNumber < totalRowNumber; rowNumber++) {row = sheet.createRow(rowNumber);for (int cellNumber = 0; cellNumber < totalCellNumber; cellNumber++) {cell = row.createCell(cellNumber);cell.setCellValue(Math.random()); //写入一个随机数}//打印测试,if(rowNumber % 10000 ==0) {System.out.println(rowNumber);}}//Write excel to a fileout = new FileOutputStream("d:\\temp\\hugeExcel_" + totalRowNumber + ".xlsx");wb.write(out);long endTime = System.currentTimeMillis();System.out.println("process " + totalRowNumber + " spent time:" + (endTime - startTime) + " ms.");} catch (Exception ex) {ex.printStackTrace();} finally {if (wb != null) {wb.dispose();// 删除临时文件,很重要,否则磁盘可能会被写满}try {if(out != null) out.close();} catch (IOException e) {e.printStackTrace();}try {if(wb != null) wb.close();} catch (IOException e) {e.printStackTrace();}}}}复制代码

5.结论

导出excel数据量大时,采用SXSSFWorkbook进行操作,数据达到一定数据将写数据到临时文件,不会一直占用内存,因此不会报内存溢出

Java导出超大Excel文件,防止内存溢出相关推荐

  1. POI3.8解决导出大数据量excel文件时内存溢出的问题

    POI3.8解决导出大数据量excel文件时内存溢出的问题 参考文章: (1)POI3.8解决导出大数据量excel文件时内存溢出的问题 (2)https://www.cnblogs.com/feng ...

  2. java导出 elsx 文件,如何获取java导出的excel文件,发送请求导出excle文件

    如何获取java导出的excel文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 request.setCharacterEncoding("utf-8"); ...

  3. java导出为excel文件_java导出数据到excel文件

    有的时候,将一些有用的数据导出到excel是很有必要的.比如说,我现在在做一个学校的在线教学平台,有一个需求是:将学生成绩导出到excel文件中去. 那怎样实现用java导出数据到excel文件呢?? ...

  4. oracle 生成 json文件,oracle - PLSQL导入JSON并导出为JSON文件 - 堆栈内存溢出

    用于处理json的设置: create table json_from_file (id number, data clob, constraint chk_data_is_json check (d ...

  5. java写入excel文件内存不足,java 导出 excel 最佳实践,java 大文件 excel 避免OOM(内存溢出) excel 工具框架...

    产品需求 产品经理需要导出一个页面的所有的信息到 EXCEL 文件. 需求分析 对于 excel 导出,是一个很常见的需求. 最常见的解决方案就是使用 poi 直接同步导出一个 excel 文件. 客 ...

  6. Laravel 教程:使用Fast Excel解决导出超大 XLSX 文件(千万级)带来的内存问题

    TL;DR: 本文介绍 Laravel 的 FastExcel 组件,文中会对 PHP generators 速览,并给出如何在节约内存的同时结合两者从数据集生成 Excel 文件. 关于 FastE ...

  7. java中 Excel文件解析及超大Excel文件读写

    本文主要对Excel中数据的解析和生成进行总结 前言 在应用程序的开发过程中,我们经常要用到Excel进行数据的导入或导出.所以,在通过Java语言实现此类需求时,通常会对Excel文件进行解析或生成 ...

  8. java 从excel中读取数据_在Java中读取Excel文件的内容和导出数据到Excel文件中

    转自www.chianjavaworld.net 原作者:SonyMusic 读:rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr 在Java ...

  9. 使用java在后台将数据导出为excel文件

    本文主要讲的是怎么使用java将数据导出为Excel文件,xls格式的. 例如:我从前台查询到的数据,要把数据进行导出为excl格式的文件.需要将前台的查询条件(数据)传递到后台,后台拿到数据,写sq ...

最新文章

  1. Codeforces 题解 CF863A 【Quasi-palindrome】
  2. Poj 1556 The Doors 计算几何+最短路
  3. js给标签添加属性和值_jquery节点属性
  4. 人在斯坦福,刚上CS224n
  5. NOI数学之提高级:初等数论
  6. 阿里云96页报告详解《云上转型》(10个案例、10大趋势/完整版PPT)
  7. 38 MM配置-采购-采购订单-采购订单审批-定义采购订单审批过程
  8. 开源一款超实用的 Dubbo 测试工具,已用半年,感觉很有feel~
  9. 外部类、内部类、局部内部类、匿名类(Java)
  10. C++ 优先级队列(priority_queue)
  11. 正向代理和反向代理详解(纯小白必看 最好懂的白话文教程)
  12. python提取国家名称缩写_如何从python中的国家缩写中获取国家名称,并混合使用alpha_2和alpha_3 ccodes...
  13. oracle中查看实例,oracle查看数据库实例,查看数据库实例名
  14. 杭州电子科技大学计算机学硕复试,2019杭州电子科技大学计算机软件考研复试手册.docx...
  15. CLM陆面过程模式实践技术
  16. Thinkphp 5.0 仿百度糯米开发多商家电商平台
  17. android最新直播框架,NDK--Android Studio中直播推流框架的搭建
  18. Gym101635C Macarons
  19. 如何进行Web服务的性能测试
  20. 报错解决 | 重装VS2017报错140.Tools.HostX64.TargetARM.Msi.Reso

热门文章

  1. 母亲大人辛苦了(snowfall.jquery实现爱心掉落)
  2. 面试吹牛B,入职就倒霉了
  3. 算法笔记.胡凡 第11章 动态规划专题
  4. 《JS学习》Object对象
  5. mysql判断题题库_MySQL数据库考试试题及答案
  6. 服务器系统和操作系统的区别
  7. java读取xslx内容,内容转换成docx和pdf,包括图片
  8. 来把三子棋吗?创建属于你的三子棋。
  9. java保存时间到数据库_java new date 保存到数据库时间不对
  10. 宽带和流量是分开的吗_带宽与宽带的区别。