2012-07-05 39 views
10

我使用的apache-POIXSSF閱讀XLSX文件。我得到一個錯誤java.lang.OutOfMemoryError: Java heap space。後來,使用-Xmx1024m增加了堆大小,對於java類仍然有相同的錯誤重複。如何讀取大小的XLSX文件> 40MB

代碼:

String filename = "D:\\filename.xlsx"; 
FileInputStream fis = null; 
try { 
    fis = new FileInputStream(filename); 
    XSSFWorkbook workbook = new XSSFWorkbook(fis); 

在上面的代碼段,執行停止在XSSFWorkbook並拋出指定的錯誤。 有人可以建議更好的方法來讀取大型XLSX文件。

+0

你從IDE如eclipse運行它?你是如何設置記憶選項的?我認爲您的設置可能沒有正確執行。 – 2012-07-05 13:32:18

+0

是的,我使用eclipse IDE並提出了以下修改它... 1)在的eclipse.ini編輯的-Xmx256M到-Xmx-1024M 2)在IDE窗口 - > prefrences->已安裝JRE->加入 - Xms256M -Xmx1024M默認的VM參數。我認爲這可能反映在日食IDE – Avinash 2012-07-05 13:38:49

回答

14

POI可以讓你以流的方式讀取Excel文件。 API幾乎是SAX的一個包裝。確保使用帶String的構造函數以正確的方式打開OPC包。否則,您可能會立即耗盡內存。

OPCPackage pkg = OPCPackage.open(file.getPath()); 
XSSFReader reader = new XSSFReader(pkg); 

現在,讀者可以讓你得到InputStreams爲不同的部分。如果你想自己做解析(使用SAX或StAX),你可以使用這些。但它需要非常熟悉格式。

一種更容易的選擇是使用XSSFSheetXMLHandler。下面是讀取第一個表的例子:

StylesTable styles = reader.getStylesTable(); 
ReadOnlySharedStringsTable sharedStrings = new ReadOnlySharedStringsTable(pkg); 
ContentHandler handler = new XSSFSheetXMLHandler(styles, sharedStrings, mySheetContentsHandler, true); 

XMLReader parser = XMLReaderFactory.createXMLReader(); 
parser.setContentHandler(handler); 
parser.parse(new InputSource(reader.getSheetsData().next())); 

凡mySheetsContentHandler應該是自己實現XSSFSheetXMLHandler.SheetContentsHandler。這個類將被饋入行和單元格。

不過請注意,這可能是適度消耗內存,如果您的共享字符串表是巨大的(如果你沒有在你的大張的任何重複的字符串,其發生)。如果內存仍然是問題,我建議使用原始XML流(也由XSSFReader提供)。

+0

令人驚歎的答案,非常感謝! – 2015-08-11 08:14:12

+0

也許你可以幫我解決這個問題:http://stackoverflow.com/questions/31939669/how-to-interrupt-poi-streaming-reader-after-reading-the-first-line – 2015-08-11 11:01:58