Excel com mais de 300 mil linhas

9 respostas
programaçãoexceljava
F

Boa tarde, estou com um problema com o Excel.

A planilha tem mais de 300 mil linhas e quando rodo o aplicativo com 30 mil linhas não tenho nenhum problema.

Erro com 300 mil linhas

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Estou usando o POI e pesquisando encontrei sobre SXSSF, mas não consegui reproduzir abrindo uma planilha.

FileInputStream fi = new FileInputStream(new File(getPath())); XSSFWorkbook wb = new XSSFWorkbook(fi); O erro acontece bem nessa linha.

9 Respostas

P

vc pode tentar colocar mais memoria disponivel a maquina virtual java

opcoes

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

exemplo

java -Xmx256m ... seuprograma
F

Já aumentei para usar 1024 e mesmo assim continua o problema.

P

exporta o excel pra csv se puder

R

Leia e processe 1000 linhas por vez.

F

Como posso fazer isso?

P

verifique na documentação se isso é possivel.

edit:

https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFWorkbook.html#XSSFWorkbook(java.io.File)

public XSSFWorkbook(java.io.File file)
             throws java.io.IOException,
                    InvalidFormatException
Constructs a XSSFWorkbook object from a given file.
Once you have finished working with the Workbook, you should close the package by calling POIXMLDocument.close(), to avoid leaving file handles open.

Opening a XSSFWorkbook from a file has a lower memory footprint than opening from an InputStream

Parameters:
file - the file to open
Throws:
java.io.IOException
InvalidFormatException

nao use inputstream, passe o file ou path direto que usa menos memoria

F

Coloquei o código assim:

File fi = new File("E:\\20102016.xlsx");
XSSFWorkbook wb = new XSSFWorkbook(fi);
XSSFSheet s = wb.getSheetAt(0);
for (Row rowFor : s) {
	if (rowFor.getRowNum() != 0) {
		System.out.println(rowFor.getCell(0).getStringCellValue());
		linha++;
		System.out.println(linha);
	}
}

Continua retornando o mesmo erro:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

P

onde ocorre este erro? vc sabe se é no for ou no getSheetAt(0) ?

cara tenta usar este cara:

https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html#SXSSFWorkbook(org.apache.poi.xssf.usermodel.XSSFWorkbook)

diz a documentação que consegue lidar com streaming/ grandes planilhas. aparentemente se vc cria o XSSFWorkbook vc pode passar para o contrutor desse outro pacote e navegar. dizem.

F

O erro acontece aqui:
XSSFWorkbook wb = new XSSFWorkbook(fi);

Sobre o SXSSF, verifiquei que ele é apenas para escrita, não funciona para leitura.

Criado 26 de outubro de 2016
Ultima resposta 27 de out. de 2016
Respostas 9
Participantes 3