2017-02-22 23 views
1

Я пытаюсь прочитать большой файл XLSX. Файл Excel имеет около 500K rows.I нужно читать Col 2.Прочитайте Огромный файл Excel (строки 500K) в 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++; 
} 

Он печатает до строки 39723 После того, что он бросает НИЖЕ за исключением

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()) Если я удалю эту строку и просто напечатаю номер строки, она отлично работает. Мне нужна помощь, как получить строковое значение для col 2.

ответ

0

Увеличение размера кучи JVM, скорее всего, исправит ваш OutOfMemoryError. См. this stackoverflow post, как увеличить размер кучи JVM.

+0

Я хотел бы упомянуть. Я уже использовал java -Xmx1G -jar Importsheet_Breaker.jar –

0

Самый простой способ (без изменения вашей логики чтения) - увеличить размер кучи.

Если это не подходит для вас, используйте поток. На самом деле, есть уже доступная библиотека.

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

+0

В моем листе Excel есть несколько скрытых листов. С потоком я не могу прочитать эти листы. XSSFWorkbook oldWorkbook; OPCPackage pkg; pkg = OPCPackage.open (myImport.get_path()); старыйWorkbook = (XSSFWorkbook) WorkbookFactory.create (pkg); вчера yhe bobe code работал, но на удивление сегодня перестала работать и выбросила ошибку. –