博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java编程数据溢出问题_poi解决java导出excel海量数据内存溢出问题详解
阅读量:5106 次
发布时间:2019-06-13

本文共 2729 字,大约阅读时间需要 9 分钟。

由于项目中有导出海量数据的需求,在谷歌和百度也没有找到好的解决办法,经过仔细研究发现poi-3.8版本以上提供新的模式可以满足这个需求,写在这里希望能对有同样需求的同行们有所帮助。

以下是测试代码:

importjava.io.FileOutputStream;importorg.apache.commons.lang.exception.ExceptionUtils;importorg.apache.poi.ss.usermodel.Cell;importorg.apache.poi.ss.usermodel.Row;importorg.apache.poi.ss.usermodel.Sheet;importorg.apache.poi.ss.usermodel.Workbook;importorg.apache.poi.ss.util.CellReference;importorg.apache.poi.xssf.streaming.SXSSFWorkbook;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;public classTest {public static voidmain(String[] args) {if (args[0].equals("hssf")) {

hssfTest();

}if (args[0].equals("sxssf")) {

sxssfTest();

}

}public static voidsxssfTest() {

Workbook wb= new SXSSFWorkbook(100); //keep 100 rows in memory,//exceeding rows will be//flushed to diskSheet sh = wb.createSheet()

;int rownum = 0;try{while (true) {

Row row=sh.createRow(rownum);for (int cellnum = 0; cellnum < 10; cellnum++) {

Cell cell=row.createCell(cellnum);

String address= newCellReference(cell).formatAsString();

cell.setCellValue(address);

}

System.out.println(rownum);

rownum++;if (rownum >= 1000000)break;

}

FileOutputStream out= new FileOutputStream("c:/sxssf.xlsx");

wb.write(out);

out.close();

}catch(Exception e) {

System.out.println(ExceptionUtils.getFullStackTrace(e));

}

}public static voidhssfTest() {

XSSFWorkbook wb= newXSSFWorkbook();

Sheet sh=wb.createSheet();int rownum = 0;try{while (true) {

Row row=sh.createRow(rownum);for (int cellnum = 0; cellnum < 10; cellnum++) {

Cell cell=row.createCell(cellnum);

String address= newCellReference(cell).formatAsString();

cell.setCellValue(address);

}

System.out.println(rownum);

rownum++;if (rownum >= 1000000)break;

}

FileOutputStream out= new FileOutputStream("c:/hssf.xlsx");

wb.write(out);

out.close();

}catch(Exception e) {

System.out.println(ExceptionUtils.getFullStackTrace(e));

}

}

}

将工程打包成jar到C:,然后用命令行java -jar -Xms128m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=512M test.jar hssf 执行,在命令行窗口输出到45000之后,输出明显减慢,

很快输出如下异常:

5028850289502905029150292Exception in thread “main” java.lang.reflect.InvocationTargetExceptionat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:585)at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)Caused by: java.lang.OutOfMemoryError: Java heap space

继续用命令行java -jar -Xms128m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=512M test.jar sxssf执行,

命令行窗口输出速度一直保持不变,直到循环完了,并最终生成四十多M的excel—sxssf.xlsx

总结来说,这段代码,我看了N久才看到楼主的意思。就是说 运行hssf.java就会内存溢出,所以换了个实现方式, 运行sxssf.java就ok了。所以解决方法就是参照sxssf这个类了。

转载地址:http://lqudv.baihongyu.com/

你可能感兴趣的文章
mmap和MappedByteBuffer
查看>>
Linux的基本操作
查看>>
转-求解最大连续子数组的算法
查看>>
对数器的使用
查看>>
OracleOraDb11g_home1TNSListener服务启动后停止,某些服务在未由其他服务或程序使用时将自己主动停止...
查看>>
Redis用户添加、分页、登录、注册、加关注案例
查看>>
练习2
查看>>
【ASP.NET】演绎GridView基本操作事件
查看>>
ubuntu无法解析主机错误与解决的方法
查看>>
尚学堂Java面试题整理
查看>>
MySQL表的四种分区类型
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
STM32单片机使用注意事项
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
Loj #139
查看>>
StringBuffer是字符串缓冲区
查看>>
hihocoder1187 Divisors
查看>>
java入门
查看>>
Spring 整合 Redis
查看>>