我正在使用Java Apache POI库并处理巨大的Excel表。大约10 mb的数据有很多行和列。一个excel文件中也有8-10张不同的纸张。数据不是富文本格式,而是充满内部函数和公式,例如。 = SUM(A2:A4)
等等,我对此没有任何顾虑。错误:XSSFWorkbook中超出了GC开销限制
此图片仅用于图解目的。在实际的数据功能的方式不同的和非常复杂的:
的数据包括字符串,数字和布尔值。我关心的只是将XSSF读取值作为普通文本排除在Excel中应用的所有公式或函数。这么说来,在上图中我只是想读行值和列i.e. 10,20,30 etc, Numbers, Total
问题
如果我格式的Excel表,并删除所有公式和函数以及简单的富文本格式保存数据,我代码运行。但是,当我不修改Excel文件并保持上述格式所示的数据时,我会遇到GC开销超限错误。
我想
我只是想阅读完整的公式和函数,就像他们的Excel文件的内容。我的算法在我删除所有公式并将工作表中的文本保存为正常的富文本格式时起作用。
我试过
正如在其他在线资源中提到和计算器,我想下面的代码给出第一个办法:
fis = new FileInputStream(path);
opc = OPCPackage.open(fis);
XSSFWorkbook workbook = new XSSFWorkbook(opc);
而不是简单地使用FileInputStream
输入我第一次通过它通过OPCPackage。仍然显示相同的错误和代码将不会执行XSSFWorkbook workbook
然后,我用第二种方法与XSSFReader
。下面是代码:
xssfReader = new XSSFReader(opc);
SharedStringsTable sst = xssfReader.getSharedStringsTable();
XSSFReader.SheetIterator itr = (XSSFReader.SheetIterator)xssfReader.getSheetsData();
while(itr.hasNext()) {
InputStream sheetStream = itr.next();
if(itr.getSheetName().equals(sheetName)) {
// no idea how to extract sheet like I would do in XSSFWorkbook
// I only get Sheet name of desired sheet
} // while ends here
没什么至今对我的作品,如果我用XSSFWorkbook
,它会抛出GC开销超过限制的错误。所以目前我手动删除所有的公式和函数,然后算法工作,但它没有有效的方法来处理这个问题。任何帮助或建议表示赞赏。
编辑:
正如指出的链接here我试图分配更多的内存,但它仍然不工作了。下面是我试图分配更多内存的快照。
如果我做错事的内存分配,让我知道。我会做必要的改变。
新的编辑
通过在Eclipse加入-Xmx8192m
我跑的配置在下面centic评论中提及我已经解决了我的问题。我现在正在通过使用SXSSFWorkbook
寻找其他解决内存问题的方法,正如下面的答案中所讨论的那样。
可能重复[GC溢出限制超过Apache POI](http://stackoverflow.com/questions/33368612/gc-overhead-limit-exceeded-with-apache-poi) – huellif
@huellif我试着分配更多的内存,但它不起作用。我也编辑了我的问题。 – Dhruvify
您显示的内存设置适用于Eclipse IDE和Java Webstart,您是如何启动应用程序的?如果在Eclipse中作为应用程序或单元测试,那么您需要调整运行配置中的内存设置,而不是在您自己的代码运行时实际应用它们。 – centic