2012-07-05 17 views
10

XSSFapache-POIを使用してXLSXファイルを読み取ります。私はエラーjava.lang.OutOfMemoryError: Java heap spaceを受け取りました。後で、同じエラーが繰り返されるJavaクラスのために-Xmx1024mを使用してヒープサイズを増加しました。サイズが40MBを超えるXLSXファイルの読み方

コード:上記のコードセグメントで

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

、実行はXSSFWorkbookで停止し、指定されたエラーをスロー。 誰かが大きなXLSXファイルを読むより良い方法を提案することができます。

+0

EclipseからEclipseを実行していますか?どのようにメモリオプションを設定しましたか?あなたの設定が適切に行われなかったと思います。 –

+0

はい、Eclipse IDEを使用していて、次のように変更しました... 1)eclipse.iniで-Xmx256Mを-Xmx-1024Mに編集しました。2)IDEウィンドウ - > prefrences-> Installed JRE-> Xms256M -Xmx1024MのデフォルトVM引数。私はそれが日食に反映されている可能性がありますIDE – Avinash

答えて

14

POIを使用すると、ストリーミング形式でExcelファイルを読むことができます。 APIはSAXのラッパーです。 Stringを受け取るコンストラクタを使用して、正しい方法でOPCパッケージを開いてください。そうしないと、すぐにメモリ不足になる可能性があります。

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

さて、読者はあなたが異なる部分についてInputStreamsを取得できるようになります。自分自身でXML解析(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

驚くべき答え、ありがとう! –

+0

この問題を解決するのに役立つかもしれません:http://stackoverflow.com/questions/31939669/how-to-interrupt-poi-streaming-reader-after-reading-the-first-line –

関連する問題