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
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.
[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 !
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
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)