Estou desenvolvendo um sistema de controle de estatísticas em planilhas XLS e ultimamente tenho trabalhado com a API POI para manipulação das mesmas. Só que minhas classes para armazenamento de informações nestas planilhas estão imensas, tornando algo extenso, complexo e demorado.
Por motivos de performance de sistema, gostaria de saber se tem alguma forma de instanciar objetos dentro de um laço de repetição como o FOR. Caso não dê para usar este método, gostaria que me indicassem formas aleatórias de solucionar este meu problema.
public void go() {
MyClass my = null;
for (...) {
my = new MyClass();
my.setId(1);
my.setOutro("pol");
}
}
Seria isso?
Conterrâneo romarcio!
Vejo que sua experiência com o Java vai muito além da minha, mas aí vai a dúvida…
Se ele fizer como você disse ele não vai perder o valor do último MyClass a cada loop?
Posso estar equivocado mas eu guardaria os dados em um List ou alguma outra Collection(A não ser que ele ocupasse o objeto e descartasse mesmo)…
É mais ou menos isso romarcio
É que na verdade eu criaria o nome do objeto instanciado com base em dois FOR por exemplo:
for(int lin = 1;lin <= 10;lin++)
for(int col = 1;col <= 10;col++){
ClasseObjeto celula+""+col+"_"+lin = new ClasseObjeto();
}
Desse modo, ele instanciaria objetos celula1_1, celula1_2, celula1_3…celulaN_N
[quote=fernandosavio]Conterrâneo romarcio!
Vejo que sua experiência com o Java vai muito além da minha, mas aí vai a dúvida…
Se ele fizer como você disse ele não vai perder o valor do último MyClass a cada loop?
Posso estar equivocado mas eu guardaria os dados em um List ou alguma outra Collection(A não ser que ele ocupasse o objeto e descartasse mesmo)…[/quote]
Você esta certo. Poderia ser criada uma lista para guarda cada objeto criado dentro do for.
Eu só fiz o exemplo de como criar a instancia dentro do for, o que ele vai fazer com cada uma delas, dai é com ele.
Se ele cria os objetos dentro de um for acredito que seria um problema depois para manipulá-las. Só se utilizasse a orientação do nosso amigo fernandosavio em armazenar eles dentro de um Collection ou List. Mas como seria a implementação de List ou Collection neste contexto.
Isso que você quer fazer de concatenar para criar o nome da variável não é possível. O compilador não vai aceitar.
Criar um lista para guarda cada objeto criado seria uma solução sim.
public void go() {
List<MyClass> list = new ArrayList<MyClass>();
MyClass my = null;
for (...) {
my = new MyClass();
my.setId(1);
my.setOutro("pol");
list.add(my);
}
}
Mas romarcio como eu iria utilizar estes objetos da List depois por exemplo para setar um valor em uma célula de uma planilha XLS
Veja como estou fazendo.
[code]package testes;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.*;
public class GerarXLS {
public static void main(String[] args) throws Exception {
FileInputStream inp = null;
FileOutputStream fileOut = null;
HSSFWorkbook workbook;
HSSFSheet sheet;
String file = "arquivos/Template.xls";
try {
//Chamando o arquivo xls de modelo
inp = new FileInputStream(file);
//Inicializando a planilha
workbook = new HSSFWorkbook(inp);
//Selecionando a aba que irá manipular arquivos
sheet = workbook.getSheetAt(0);
//Pega os dados de uma determinada linha para manipulação, iniciando em 0.
HSSFRow row4 = sheet.getRow(3);
//Pega os dados de uma determinada linha, sendo que a primeiro célula de uma linha é 0.
HSSFCell cel4_1 = row4.getCell(1);
HSSFCell cel4_2 = row4.getCell(2);
HSSFCell cel4_3 = row4.getCell(3);
HSSFCell cel4_4 = row4.getCell(4);
HSSFCell cel4_5 = row4.getCell(5);
HSSFCell cel4_6 = row4.getCell(6);
//Inserindo dados nas células de uma determinada linha
cel4_1.setCellValue(2);
cel4_2.setCellValue(4);
cel4_3.setCellValue(1);
cel4_4.setCellValue(3);
cel4_5.setCellValue(6);
cel4_6.setCellValue(2);
//Gerando um novo arquivo xls com as alterações
fileOut = new FileOutputStream("arquivos/alterado.xls");
// Gerando o arquivo de saída
workbook.write(fileOut);
} catch (Exception e) {
e.printStackTrace();
} finally {
inp.close();
fileOut.close();
}
}
}[/code]
Como pode ver a criação de células é algo redundante. Sem contar que neste código apenas consta 6 células, imagine uma planilha XLS com uma estrutura de 600 células, 50 linhas e 30 colunas todas sendo instanciadas nesta classe :?
Isso seria um trabalho e tanto para fazer. Sem contar o desempenho que possivelmente seria afetado
Espero que possa ser solucionado este problema. Mas voltando ao List como seria feito a manipulação de um objeto dentro de uma List?
Agradeço, desde já a todos por sugestões.
Eu nunca trabalhei com essa API ou com qualquer outro API para manipular planilhas no Excel, mas talvez tenha alguma outra que a manipulação seja mais fácil e não precise criar uma variável para cada célula.
Não sei se com lista vai dar para resolver.
mas o for seria assim:
for(MyClass my : list) {
my.//aqui você acessa qualquer método get ou set do objeto atual.
}
Vou tentar aqui cara.
Por enquanto vou ver se dá para continuar nesta API usando List. Qualquer coisa, eu irei pesquisar por outras APIs mesmo.
Mas agradeço pelo apoio ae vlw
Abraços, Danilo.
Se entendi bem, você poderia usar uma matriz. (lista de listas)
public static void main(String[] args){
int tamLinha = 10;
int qtdLinhas = 10;
List<List><String>> linhas = new ArrayList<List><String>>();
List<String> linha;
for (int lin = 0; lin < qtdLinhas; lin++){
//popula uma linha
linha = new ArrayList<String>();
for (int col = 0; col < tamLinha; col++){
linha.add(new String(lin +", " + col));
}
linhas.add(linha);
}
//Dessa forma pode-se referenciar cada celula pela coordenada da matrix (Y, X)
//Imprime linha 6, coluna 3
System.out.println(linhas.get(5).get(2));
//imprimir todos os elementos
for (List<String> lin : linhas) {
for (String string : lin) {
System.out.print(string + " | ");
}
System.out.println();
}
}