2017-02-22 2 views
1

Ich versuche, eine große XLSX-Datei zu lesen. Die Excel-Datei hat etwa 500K rows.I col 2.Lesen Sie riesige Excel-Datei (500K Zeilen) in Java

OPCPackage pkg; 
pkg = OPCPackage.open("File path"); 
XSSFWorkbook myWorkBook = new XSSFWorkbook(pkg); 
Sheet sheet = myWorkBook.getSheetAt(2); 
Iterator<Row> rowIterator = sheet.iterator(); 
while (rowIterator.hasNext()) 
{ 
Row row = rowIterator.next(); 
if (row_num > ROW_ESCAPE) 
{ 
    Cell cell = row.getCell(2); 
    if (!cell.getStringCellValue().toString().trim().isEmpty()) 
      { 
       System.out.println(cell.getStringCellValue().toString()); 
      } 
System.out.println("hi"+row_num); 
     } 
     row_num++; 
} 

Es werden bis Zeile druckt lesen müssen 39723 Danach wirft der unten angegebenen Ausnahme

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space 
at java.util.regex.Matcher.<init>(Matcher.java:225) 
at java.util.regex.Pattern.matcher(Pattern.java:1093) 
at org.apache.poi.xssf.usermodel.XSSFRichTextString.utfDecode(XSSFRichTextString.java:482) 
at org.apache.poi.xssf.usermodel.XSSFRichTextString.getString(XSSFRichTextString.java:297) 
at org.apache.poi.xssf.usermodel.XSSFCell.getStringCellValue(XSSFCell.java:262) 
at Main.get_titles(Main.java:484) 
at Main.analyze_Importsheet(Main.java:461) 
at Main.but_sel_imp_sheetActionPerformed(Main.java:220) 
at Main.access$000(Main.java:40) 
at Main$1.actionPerformed(Main.java:85) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6533) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
at java.awt.Component.processEvent(Component.java:6298) 
at java.awt.Container.processEvent(Container.java:2236) 
at java.awt.Component.dispatchEventImpl(Component.java:4889) 
at java.awt.Container.dispatchEventImpl(Container.java:2294) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
at java.awt.Container.dispatchEventImpl(Container.java:2280) 
at java.awt.Window.dispatchEventImpl(Window.java:2746) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
at java.awt.EventQueue.access$500(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:709) 
at java.awt.EventQueue$3.run(EventQueue.java:703) 

Main.java:484=if (! cell.getStringCellValue(). toString(). trim(). isEmpty()) Wenn ich diese Zeile entferne und nur die Zeilennummer drucke, funktioniert es gut. Ich brauche Hilfe, wie Sie den String-Wert für Spalte 2 erhalten.

Antwort

0

Erhöhung der JVM Heap-Größe wird wahrscheinlich beheben Sie Ihre OutOfMemoryError. Unter this stackoverflow post finden Sie Informationen zum Erhöhen der JVM-Heap-Größe.

+0

Ich für zu erwähnen. Ich habe bereits java -Xmx1G -jar Importsheet_Breaker.jar –

0

Der einfachste Weg (ohne Ihre Leselogik zu verändern) wäre, die Größe des Heapspeichers zu erhöhen.

Wenn das keine praktikable Option für Sie ist, verwenden Sie Stream. Eigentlich ist bereits eine praktische Bibliothek vorhanden.

https://github.com/monitorjbl/excel-streaming-reader

+0

Mein Excel-Blatt hat einige versteckte Blätter. Mit dem Strom kann ich diese Blätter nicht lesen. XSSFWorkbook altesWorkbook; OPCPackage-Paket; pkg = OPCPackage.open (myImport.get_path()); oldWorkbook = (XSSFWorkbook) WorkbookFactory.create (pkg); gestern, als der Bob Code funktionierte, aber heute überraschend aufhörte zu arbeiten und einen Heapsize-Fehler verursachte. –

Verwandte Themen