[RESOLVIDO]exportação excel muito lenta

10 respostas
D

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

10 Respostas

nel

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

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.

D

meu codigo é basicamente isso.

private HSSFSheet montaTableXLS(HSSFSheet sheet, List<RelatorioPergunta> listRelatorioVisitaQuestao, List<String> 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;
	}
nel

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.

D

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

private HSSFSheet montaTableXLS(HSSFSheet sheet, List<RelatorioPergunta> listRelatorioVisitaQuestao, List<String> 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;
	}

porem ainda continua lento.. sinceramente nao tenho ideia

nel

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?

D

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

D

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

nel

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.

D

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)

nel

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

Criado 24 de maio de 2012
Ultima resposta 29 de mai. de 2012
Respostas 10
Participantes 2