Boa tarde pessoal,
Estou usando o POI 3.7 para ler um arquivo .xlsx de 24MB. este arquivo possui 23 folders e cada um possui uma média de 500 linhas e 3 colunas cada. Só o primeiro folder tem mais de 140.000 registros(linhas).
O problema é que quando instancio o WorkBook ele carrega o arquivo inteiro na memória e não somente o folder (sheet) que necessito.
O meu programa precisa ler um folder de cada vez e importar as informações para o MySql. Durante este processo ocorre o erro abaixo:
[code]Exception occurred during event dispatching:
java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferInt.(DataBufferInt.java:41)
at java.awt.image.Raster.createPackedRaster(Raster.java:458)
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1015)
at sun.awt.image.SunVolatileImage.getBackupImage(SunVolatileImage.java:225)
at sun.awt.image.VolatileSurfaceManager.getBackupSurface(VolatileSurfaceManager.java:252)
at sun.awt.image.VolatileSurfaceManager.initialize(VolatileSurfaceManager.java:108)
at sun.awt.image.SunVolatileImage.(SunVolatileImage.java:72)
at sun.awt.image.SunVolatileImage.(SunVolatileImage.java:101) at sun.awt.image.SunVolatileImage.(SunVolatileImage.java:101)
at java.awt.GraphicsConfiguration.createCompatibleVolatileImage(GraphicsConfiguration.java:284)
at java.awt.GraphicsConfiguration.createCompatibleVolatileImage(GraphicsConfiguration.java:218)
at com.sun.java.swing.plaf.nimbus.AbstractRegionPainter.getImage(AbstractRegionPainter.java:663)
at com.sun.java.swing.plaf.nimbus.AbstractRegionPainter.paintWithFixedSizeCaching(AbstractRegionPainter.java:626)
at com.sun.java.swing.plaf.nimbus.AbstractRegionPainter.paint(AbstractRegionPainter.java:139)
at com.sun.java.swing.plaf.nimbus.AbstractRegionPainter.paint(AbstractRegionPainter.java:25)
at com.sun.java.swing.plaf.nimbus.SynthPainterImpl.paint(SynthPainterImpl.java:47)
at com.sun.java.swing.plaf.nimbus.SynthPainterImpl.paintBackground(SynthPainterImpl.java:87)
at com.sun.java.swing.plaf.nimbus.SynthPainterImpl.paintBackground(SynthPainterImpl.java:125)
at com.sun.java.swing.plaf.nimbus.SynthPainterImpl.paintProgressBarBackground(SynthPainterImpl.java:1066)
at javax.swing.plaf.synth.SynthProgressBarUI.update(SynthProgressBarUI.java:155)
at javax.swing.JComponent.paintComponent(JComponent.java:752)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
Exception in thread “Thread: Importação TIPI” java.lang.OutOfMemoryError: Java heap space
at org.apache.xmlbeans.impl.store.Cur.createElementXobj(Cur.java:257)
at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.startElement(Cur.java:2992)
at org.apache.xmlbeans.impl.store.Locale$SaxHandler.startElement(Locale.java:3198)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.reportStartTag(Piccolo.java:1082)
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseAttributesNS(PiccoloLexer.java:1822)
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseOpenTagNS(PiccoloLexer.java:1521)
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseTagNS(PiccoloLexer.java:1362)
at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yylex(PiccoloLexer.java:4678)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yylex(Piccolo.java:1290)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yyparse(Piccolo.java:1400)
at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:714)
at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3439)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1270)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1257)
at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
at org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument$Factory.parse(Unknown Source)
at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:142)
at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:134)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:235)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:190)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:182)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:63)
at util.ImportTIPI.run(ImportTIPI.java:42)
at java.lang.Thread.run(Thread.java:662)
CONSTRUÍDO COM SUCESSO (tempo total: 1 minuto 36 segundos)[/code]
[code]
package util;
import gui.util.acomp.MsgAcomp;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellReference;
public class ImportTIPI extends Observable implements Runnable{
private File arquivoTIPI;
@Override
public void run() {
notifyObservers(new MsgAcomp(MsgAcomp.INIT_PROC, "Importando arquivo TIPI...TESTE", 0, true)); setChanged();
InputStream inp;
int count = 0;
try {
inp = new FileInputStream(arquivoTIPI);
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet1 = wb.getSheetAt(0);
notifyObservers(new MsgAcomp(MsgAcomp.SIZE_PROC, "Importando " + sheet1.getSheetName(), sheet1.getLastRowNum(), false)); setChanged();
for (Row row : sheet1) {
notifyObservers(new MsgAcomp(MsgAcomp.RUNNING_PROC, "Importação:" + count, ++count, false)); setChanged();
for (Cell cell : row) {
// CellReference cellRef = new CellReference(row.getRowNum(), cell.getCellNum());
// System.out.print(cellRef.formatAsString());
// System.out.print(" - ");
switch(cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
System.out.println(cell.getRichStringCellValue().getString());
break;
case Cell.CELL_TYPE_NUMERIC:
if(DateUtil.isCellDateFormatted(cell)) {
System.out.println(cell.getDateCellValue());
} else {
System.out.println(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_BOOLEAN:
System.out.println(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
System.out.println(cell.getCellFormula());
break;
default:
System.out.println();
}
}
}
} catch (IOException ex) {
Logger.getLogger(ImportTIPI.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidFormatException ex) {
Logger.getLogger(ImportTIPI.class.getName()).log(Level.SEVERE, null, ex);
}
notifyObservers(new MsgAcomp(MsgAcomp.END_PROC, "Fim da Importação!", 0, false)); setChanged();
}
public ImportTIPI(JDialog acomp, File pArqTIpi) {
this.arquivoTIPI = pArqTIpi;
addObserver((Observer) acomp);
}
}[/code]