[RESOLVIDO]exportação excel muito lenta

boa tarde …

estou com um problema para exportação em xls, esta muito lenta,

é um relatorio de 9 colunas e em torno de 900 linhas o teste que fiz…
está demorando em torno de 10 minutos.

estou usando POI do Apache para gerar o XLS… alguem saberia me dizer o pq?

estou usando um for para poder preencher as celular… puis um sysout
para mostrar com esta o processo… as primeiras posição do arraylist que roda no FOR
vai rapido mas quando chega nos 300/400 fica muito lento o processo

[quote=DaitonJr]boa tarde …

estou com um problema para exportação em xls, esta muito lenta,

é um relatorio de 9 colunas e em torno de 900 linhas o teste que fiz…
está demorando em torno de 10 minutos.

estou usando POI do Apache para gerar o XLS… alguem saberia me dizer o pq?

estou usando um for para poder preencher as celular… puis um sysout
para mostrar com esta o processo… as primeiras posição do arraylist que roda no FOR
vai rapido mas quando chega nos 300/400 fica muito lento o processo[/quote]

Só o fato de remover o System.out já é um começo interessante. De resto, o ideal seria postar o seu código para analisarmos.
Mas quando se depende de uma API, não há muito como fugir, já que a implementação é dela. No máximo, buscar a melhor forma de usufruir de suas funcionalidades.

meu codigo é basicamente isso.

[code]
private HSSFSheet montaTableXLS(HSSFSheet sheet, List listRelatorioVisitaQuestao, List selectedColunas) {
System.out.println(“ENTROU NA CRIAÇAO TA TABELA”);
String colunas[] = {“F”,“F”,“F”,“F”,“F”,“F”,“F”,“F”,“F”};

	HSSFRow tituloTabela = sheet.createRow(2);
	int contadorCelula = 0;
                          //CRIAR TITULO DA TABELA
	for (int y=0; y<selectedColunas.size(); y++){
		System.out.println("FAZENDO BARRA DE TITULO DA TABELA: NA COLUNA " + y );
		if (selectedColunas.get(y).equals("0")) {
			tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("PONTO DE VENDA"));
			colunas[Integer.valueOf(selectedColunas.get(y))]="T";   
			contadorCelula ++;
		}
		if (selectedColunas.get(y).equals("1")) {
			tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("CIDADE"));
			colunas[Integer.valueOf(selectedColunas.get(y))]="T";
			contadorCelula ++;
		}
		if (selectedColunas.get(y).equals("2")) {
			tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("UF"));
			colunas[Integer.valueOf(selectedColunas.get(y))]="T";
			contadorCelula ++;
		}
		if (selectedColunas.get(y).equals("3")) {
			tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("DATA"));
			colunas[Integer.valueOf(selectedColunas.get(y))]="T";
			contadorCelula ++;
		}
		if (selectedColunas.get(y).equals("4")) {
			tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("GRUPO FAMÍLIA"));
			colunas[Integer.valueOf(selectedColunas.get(y))]="T";
			contadorCelula ++;
		}
		if (selectedColunas.get(y).equals("5")) {
			tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("PERGUNTA"));
			colunas[Integer.valueOf(selectedColunas.get(y))]="T";
			contadorCelula ++;
		}
		if (selectedColunas.get(y).equals("6")) {
			tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("RESPOSTA"));
			colunas[Integer.valueOf(selectedColunas.get(y))]="T";
			contadorCelula ++;
		}
		if (selectedColunas.get(y).equals("7")) {
			tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("OBSERVAÇÃO"));
			colunas[Integer.valueOf(selectedColunas.get(y))]="T";
			contadorCelula ++;
		}
		if (selectedColunas.get(y).equals("8")) {
			tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("PROMOTOR"));
			colunas[Integer.valueOf(selectedColunas.get(y))]="T";
			contadorCelula ++;
		}
	}
	
	int numLinha = 3;
	contadorCelula = 0;
                          //PREENCHIMENTO DA TABELA
	for (int i = 0; i < listRelatorioVisitaQuestao.size(); i++) {
		System.out.println("PREENCHENDO VALORES DA GRID: "+ i + " DE: " + listRelatorioVisitaQuestao.size());
		RelatorioPergunta relatorioPergunta = listRelatorioVisitaQuestao.get(i);
		HSSFRow linhaTabela = sheet.createRow(numLinha++);

		if (colunas[0] == "T"){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getVisita().getDestinatario().getRazao_social()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[1] == "T"){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getVisita().getDestinatario().getCidade().getNome()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[2] == "T"){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getVisita().getDestinatario().getCidade().getUf()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[3] == "T"){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(formatadorHora.format(relatorioPergunta.getVisitaQuestao().getData())));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[4] == "T"){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getQuestionario().getDescricao()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[5] == "T"){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getQuestao().getDescricao()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[6] == "T"){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getResposta()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[7] == "T"){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getObservacao()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[8] == "T"){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getVisita().getPromotor().getNome()));
			sheet.autoSizeColumn((short) contadorCelula);
		}
		contadorCelula = 0;
	}
	
	return sheet;
}[/code]

Vou dar uma refatorada no seu primeiro laço de repetição, veja se já melhora:

 for (String column : selectedColunas){  
            Integer value = Integer.parseInt(column);
            switch (value) {
			case 0:
				  tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("PONTO DE VENDA"));  
	              colunas[Integer.valueOf(selectedColunas.get(y))]="T";     
	              contadorCelula ++;
				break;
			case 1:
				 tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("CIDADE"));  
	             colunas[Integer.valueOf(selectedColunas.get(y))]="T";  
	             contadorCelula ++; 
				break;
			}
        }

Aqui eu fiz o case 0 e 1, faça até o 7, pois é essa sua necessidade. Veja, quando se coloca apenas if, ele sai procurando em todos os if´s, mas o valor não pode ser 0 e 1 ao mesmo tempo, concorda ? O mínimo ali, é por um continue caso ele entre em algum if, para pular para a próxima iteração. Veja se essa minha modificação já lhe traz melhores resultados e aplique algo assim no seu segundo laço.

Não faça ‘==’ para Strings !!! Use o equals colega. E no teu segundo laço, tu verifica se é “T” para todos, mas vi no seu primeiro laço de repetição que tu atribuiu “T” a todas as colunas, está bem sem sentido as coisas por ai !

Por fim, poste o código modificado.

desculpa a demora no post de resposta mas estava meio ocupado, fiz as modificaçoes olha como ficou

[code]private HSSFSheet montaTableXLS(HSSFSheet sheet, List listRelatorioVisitaQuestao, List selectedColunas) {
//System.out.println(“ENTROU NA CRIAÇAO TA TABELA”);
String colunas[] = {“F”,“F”,“F”,“F”,“F”,“F”,“F”,“F”,“F”};

	HSSFRow tituloTabela = sheet.createRow(2);
	int contadorCelula = 0;
	
	
	for (String column : selectedColunas){     
         Integer value = Integer.parseInt(column);   
         switch (value) {   
         	case 0:   
           		tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("PONTO DE VENDA"));     
           		colunas[value]="T";     
           		contadorCelula ++;   
           		break;   
           	case 1:   
           		tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("CIDADE"));     
           		colunas[value]="T";     
           		contadorCelula ++;   
           		break;
        	case 2:   
           		tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("UF"));     
           		colunas[value]="T";  
           		contadorCelula ++;   
           		break; 
        	case 3:   
           		tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("DATA"));     
           		colunas[value]="T";  
           		contadorCelula ++;   
           		break; 
        	case 4:   
           		tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("GRUPO FAMÍLIA"));     
           		colunas[value]="T";     
           		contadorCelula ++;   
           		break; 
        	case 5:   
           		tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("PERGUNTA"));     
           		colunas[value]="T";   
           		contadorCelula ++;   
           		break;
        	case 6:   
           		tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("RESPOSTA"));     
           		colunas[value]="T";  
           		contadorCelula ++;   
           		break;
        	case 7:   
           		tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("OBSERVAÇÃO"));     
           		colunas[value]="T";     
           		contadorCelula ++;   
           		break;
        	case 8:   
           		tituloTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString("PROMOTOR"));     
           		colunas[value]="T";  
           		contadorCelula ++;   
           		break; 
           }   
      }  


	int numLinha = 3;
	contadorCelula = 0;
	for (int i = 0; i < listRelatorioVisitaQuestao.size(); i++) {
		//System.out.println("PREENCHENDO VALORES DA GRID: "+ i + " DE: " + listRelatorioVisitaQuestao.size());
		RelatorioPergunta relatorioPergunta = listRelatorioVisitaQuestao.get(i);
		HSSFRow linhaTabela = sheet.createRow(numLinha++);

		if (colunas[0].equals("T")){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getVisita().getDestinatario().getRazao_social()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[1].equals("T")){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getVisita().getDestinatario().getCidade().getNome()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[2].equals("T")){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getVisita().getDestinatario().getCidade().getUf()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[3].equals("T")){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(formatadorHora.format(relatorioPergunta.getVisitaQuestao().getData())));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[4].equals("T")){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getQuestionario().getDescricao()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[5].equals("T")){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getQuestao().getDescricao()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[6].equals("T")){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getResposta()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[7].equals("T")){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getObservacao()));
			sheet.autoSizeColumn((short) contadorCelula);
			contadorCelula ++;
		}
		
		if (colunas[8].equals("T")){
			linhaTabela.createCell(contadorCelula).setCellValue(new HSSFRichTextString(relatorioPergunta.getVisitaQuestao().getVisita().getPromotor().getNome()));
			sheet.autoSizeColumn((short) contadorCelula);
		}
		contadorCelula = 0;
	}
	
	return sheet;
}[/code]

porem ainda continua lento… sinceramente nao tenho ideia

Muito lento quanto ? E duas observações bem básicas:

1 - No primeiro laço, todas as colunas recebem “T”

2 - No segundo laço, você faz um if para cada posição da coluna executando um equals(“T”)

A segunda observação tem relação com a primeira, bom, se todas as colunas recebem T, obviamente, TODOS os teus IF´s serão verdadeiras, não acha?

achei a soluçao: retirei os autosize das coluna e ficou em 1 segundo para gerar 3500 linhas

2 curtidas

Essa questao do ‘T’ é pq as colunas sao dinamicas, nem sempre no primeiro laço ele poe todas ‘T’, elas depende dos checkBox da tela em cada colula,

ex: se tiver so as tres primeiras coluna marcadas pra exportar ele seta T so nos tres primeiros F, ai quando vou preencher as celulas eu verifico quais colunas estão com T que é as que vao aparecer no XLS, não sei se foi o melhor jeito, pq pesquisei bastante e não achei nda que me facilitasse esse serviço…

obrigado aí pela força e pelas dicas de melhoria no código

Excelente. Por isso é fundamental ler a API quando a desconhece (até quando conhece). Provavelmente, todo o trabalho da API para “remontar” o tamanho de cada coluna gerou todo esse tempo de processamento.

poise, tb achei isso, e te conto outra eu até ja estava fazendo exemplo com jasper usando ireport, só que não tava ficando como eu queria. mas deu tudo certo, achei essa api bem poderosa que estou usando (POI apache)

Sem dúvidas, por isso é importante ler sobre ela. Nem sempre temos tempo, mas é o ideal.