2017-04-20 486 views
1

我正在使用Java Apache POI库并处理巨大的Excel表。大约10 mb的数据有很多行和列。一个excel文件中也有8-10张不同的纸张。数据不是富文本格式,而是充满内部函数和公式,例如。 = SUM(A2:A4)等等,我对此没有任何顾虑。错误:XSSFWorkbook中超出了GC开销限制

此图片仅用于图解目的。在实际的数据功能的方式不同的和非常复杂的:

enter image description here

的数据包括字符串,数字和布尔值。我关心的只是将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我试图分配更多的内存,但它仍然不工作了。下面是我试图分配更多内存的快照。

enter image description here enter image description here

如果我做错事的内存分配,让我知道。我会做必要的改变。

新的编辑

通过在Eclipse加入-Xmx8192m我跑的配置在下面centic评论中提及我已经解决了我的问题。我现在正在通过使用SXSSFWorkbook寻找其他解决内存问题的方法,正如下面的答案中所讨论的那样。

+0

可能重复[GC溢出限制超过Apache POI](http://stackoverflow.com/questions/33368612/gc-overhead-limit-exceeded-with-apache-poi) – huellif

+0

@huellif我试着分配更多的内存,但它不起作用。我也编辑了我的问题。 – Dhruvify

+2

您显示的内存设置适用于Eclipse IDE和Java Webstart,您是如何启动应用程序的?如果在Eclipse中作为应用程序或单元测试,那么您需要调整运行配置中的内存设置,而不是在您自己的代码运行时实际应用它们。 – centic

回答

1

发表评论:

的您显示的内存设置适用于Eclipse IDE和Java Webstart,您是如何启动应用程序的?如果在Eclipse中作为应用程序或单元测试,那么您需要调整运行配置中的内存设置,而不是在您自己的代码运行时实际应用它们。

+0

这已经解决了我的问题。我在eclipse中为我的运行配置添加了-Xmx8192m'。谢谢。 – Dhruvify

0

您是否曾尝试以SXSSF工作簿而不是XSSF工作簿打开文件?

fis = new FileInputStream(path); 
opc = OPCPackage.open(fis); 
XSSFWorkbook workbook = new XSSFWorkbook(opc); 
SXSSFWorkbook wb = new SXSSFWorkbook(workbook); 

请参阅https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html。采取directy从他们的JavaDoc:“这让写的非常大的文件,而在任何一个时间运行内存,因为只有行的配置部分保存在内存”作为答案

+0

是的,我尝试了这一点,但是我的代码在'XSSFWorkbook工作簿=新的XSSFWorkbook(opc);'代码后引发GC限制超出异常。我只是不明白为什么它是这样的。当我从Excel文件中删除公式时,我没有任何问题。我有大量的数据。 – Dhruvify

+0

嗯。这是否工作? FileInputStream fis = new FileInputStream(excelFile); \t \t Workbook workBook = new SXSSFWorkbook(200); \t \t workBook = WorkbookFactory.create(fis); – tomgeraghty3

+0

我现在试过了,并且在'workBook = WorkbookFactory.create(fis);'后得到同样的错误;' – Dhruvify

相关问题