2012-08-16 52 views
2

我试图从Web应用程序写出结果集(100,000行,45列)以使用JExcel 2.6.9 。JExcel(jxl):将大记录集写入excel工作表失败(OutOfMemoryError:Java堆空间)

Caused by: 
java.lang.OutOfMemoryError - Java heap space 
at jxl.write.biff.WritableSheetImpl.getRowRecord(WritableSheetImpl.java:1179) 

我已尝试以下步骤:与

进程失败

 WorkbookSettings ws = new WorkbookSettings(); 
     ws.setLocale(new Locale("en", "EN")); 
     ws.setUseTemporaryFileDuringWrite(true); 

     WritableWorkbook workbook = Workbook.createWorkbook(new File("tempExcel.xls"),ws); 

所以基本上在一个while循环,从数据库中ResultSet迭代,然后

s.addCell(new Label(colIndex, rowIndex, value, format));是为每一行完成的。

我并不放弃如何获得通过这个问题。在运行此应用程序的env中存在内存限制,因此仅仅为JVM分配更多RAM不是一种选择,除非完全没有其他方式。我将不胜感激这方面的任何反馈。由于

+0

我也有这个相同的问题。谷歌搜索后,我碰到了这个链接:http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api它很容易处理大量的数据。对于我的测试程序,我使用了100,000行和50列。它写入一个xls文件没有任何错误。我遇到的唯一问题是生成的excel文件的大小。它超过100 MB!除此之外,它的完美! – Joyson 2012-12-11 04:47:14

回答

2

你不能把X磅的东西变成Ÿ大小的包,如果X> Y。

这450万点的值。如果它们中的很多是字符串,平均大小为1K字节,那么您将拥有〜4.5GB的数据。

如果你已经把所有的东西都记在记忆里,那你就麻烦了。解决方案是将它分块成小块,提交它们,然后创建下一个块。

我不知道是否有任何Web客户端需要一次这么多的数据。另一种解决方案是更好的过滤来限制ResultSet的大小。

+1

我同意你的意见。我正努力将它分成更小块,提交并创建下一个块。例如,如果一定数量的数据以区块形式读取并提交,JExcel仍然需要将工作表读入内存以添加剩余的行,并且会再次出现内存错误。我无法限制ResultSet,因为它用于报告目的(业务需求)。有没有关于如何使用JExcel完成这个任务的例子(大块阅读,提交,继续)...? – ke3pup 2012-08-16 02:09:52

+1

@duffymo是的,这是很好的通用目的答案,但是你没有看到techventure提到他使用磁盘来缓冲文件内容,我确信它有足够的可用空间。 – 2012-10-21 17:10:59

相关问题