Depois de uma longa parada por causa dos projetos do doutorado segue a segunda parte do tutorial de uso do JExcel .
Para importar dados de uma planilha primeiro vamos declarar todos os imports necessários para a aplicação funcionar, basta colocar os imports listados abaixo.
O io.File é necessário pois iremos fazer uma operação de abertura de arquivo, nesse exemplo utilizei o JFileChooser que é um componente swing de dialogo de abertura de arquivo, com isso posso escolher o arquivo excel que quero abrir. Finalmente o jxl.* é utilizado para importar a biblioteca do JExcel.
Para cumprir os propósitos desse tutorial criei uma classe chamada Leitor, essa classe(como o próprio nome sugere) teria a função de ler os dados das planilhas. Dentro dessa classe declarei dois objetos definidos na API que são uma Workbook e uma Sheet, o Workbook tem os metodos para abertura do arquivo no formato excel ja o objeto sheet serve para indicar de qual planilha dentro do arquivo excel você deseja importar os dados.
Dentro da classe Leitor criei um método iniciar que chama a caixa de dialogo de abertura de arquivo (JFileChooser), essa caixa retorna o nome do arquivo a ser aberto o que permite abrir a planilha excel por meio do objeto Workbook chamando seu método getWorkbook , caso eu não usasse o JFileChooser bastaria passar ao método o nome do arquivo a ser aberto, mas isso levaria o programa a sempre abri o mesmo arquivo todo o tempo. Como a operação de abertura de arquivo pode gerar uma exceção os métodos precisam ficar dentro de um bloco try/catch, veja o código abaixo.
Depois de aberto o arquivo precisamos informar qual planilha queremos ler os dados , para isso criamos o método setSheets , que aceita um numero inteiro como argumento, esse numero corresponde a planilha a ser aberta , a primeira planilha inicia com o numero 0, depois 1, 2 e assim sucessivamente, você poderia também criar um método para retornar o nome de cada uma das planilhas, mas para facilitar o tutorial usamos a notação numérica mesmo. No método setSheets utilizamos o método getSheet do objeto Sheet anteriormente declarado, isso permite utilizando a referencia ao objeto Sheet, no exemplo "st", o programa tenha acesso aos dados contidos na planilha.
O próximo passo é capturar as informações na planilha célula por célula, para fazer isso criamos o método lerArquivo que retorna uma matriz do tipo object genérico , fazemos isso por que a planilha pode conter tanto Strings quanto números , posteriormente trataremos cada um desses dados de acordo com o seu tipo mas para capturar-los precisamos armazena-los em uma matriz polimorfa do tipo Object que aceita qualquer tipo de dados (lembra de polimorfismo ???).
Como o código é extenso vamos comentar linha por linha:
Na declaração do método o "Object [ ][ ]" indica que o método retorna uma matriz de objetos genéricos. Pode ser qualquer coisa, números,textos,datas,etc. Aqui você vê o polimorfismo em ação , e por que precisamos dele?? por que a planilha pode misturar diversos tipos de dados de uma vez só.
Na linha 3, na declaração Cell c, criamos uma referencia para um objeto do tipo Cell, para quem estudou excel sabe que em uma planilha existe a celula que é a unidade básica do excel na intercessão de uma linha com uma coluna temos a célula, precisamos de um objeto célula para tratar os dados contidos na mesma.
Na linha 5 e 6 usamos o método getRows e getColumns para retornar o número de linhas e o número de colunas da planilha que contém informações. Aqui você precisa lembra da disciplina de algoritmos e programação quando o seu professor lhe ensinava a percorrer as linhas e colunas de
uma matriz, precisávamos descobrir as dimensões da matriz para poder percorrer cada endereço da mesma , aqui o principio é o mesmo, quando usamos esses dois métodos descobrimos o tamanho das linhas e colunas que contém informação dentro da planilha , dessa maneira não precisamos percorrer todos os endereços da mesma.
Nas linhas 8,9 e 10 criamos uma matriz genérica de objetos e os laços for alinhados servem para varrer cada endereço da planilha (igual a varredura de uma matriz de números). Os dois laços vão informar linha e coluna que estarão lendo a cada momento iniciando no endereço 0 0 ( linha 0, coluna 0 ) e indo até o ultimo endereço possível indicado por numlinha e numcoluna (numero de linhas numero de colunas :-) ).
Em cada endereço fornecido pelo laço de controle capturamos o conteúdo da célula atual com o comando descrito na linha 12 , "c=st.getCell(coluna,linha)". Depois de capturado o conteúdo, testamos o mesmo usando uma serie de if's:
caso seja numero armazenamos o mesmo como um double( linha 14 a 18)
caso seja texto armazenamos o mesmo como uma string ( linha 23 a 27)
caso seja um conteúdo vazio não fazemos nada(linha 19 a 22)
Existem outros tipos de dados mas para manter a praticidade do tutorial só usamos texto e números.
Finalmente depois que o laço termina retornamos a matriz de resultados (linha 32).
Para importar dados de uma planilha primeiro vamos declarar todos os imports necessários para a aplicação funcionar, basta colocar os imports listados abaixo.
import java.io.File; import javax.swing.JFileChooser; import jxl.*;
O io.File é necessário pois iremos fazer uma operação de abertura de arquivo, nesse exemplo utilizei o JFileChooser que é um componente swing de dialogo de abertura de arquivo, com isso posso escolher o arquivo excel que quero abrir. Finalmente o jxl.* é utilizado para importar a biblioteca do JExcel.
Para cumprir os propósitos desse tutorial criei uma classe chamada Leitor, essa classe(como o próprio nome sugere) teria a função de ler os dados das planilhas. Dentro dessa classe declarei dois objetos definidos na API que são uma Workbook e uma Sheet, o Workbook tem os metodos para abertura do arquivo no formato excel ja o objeto sheet serve para indicar de qual planilha dentro do arquivo excel você deseja importar os dados.
public class Leitor { private Workbook wb; private Sheet st;
Dentro da classe Leitor criei um método iniciar que chama a caixa de dialogo de abertura de arquivo (JFileChooser), essa caixa retorna o nome do arquivo a ser aberto o que permite abrir a planilha excel por meio do objeto Workbook chamando seu método getWorkbook , caso eu não usasse o JFileChooser bastaria passar ao método o nome do arquivo a ser aberto, mas isso levaria o programa a sempre abri o mesmo arquivo todo o tempo. Como a operação de abertura de arquivo pode gerar uma exceção os métodos precisam ficar dentro de um bloco try/catch, veja o código abaixo.
public void iniciar(){ try{ JFileChooser fopen = new JFileChooser( ); fopen.showOpenDialog(null); wb= Workbook.getWorkbook(fopen.getSelectedFile( )); // se não usar o JFileChooser poderia abri a planilha //passando o nome do arquivo diretamente ex: // wb= Workbook.getWorkbook("Teste.xls"); }catch(Exception e){ e.printStackTrace(); } }
Depois de aberto o arquivo precisamos informar qual planilha queremos ler os dados , para isso criamos o método setSheets , que aceita um numero inteiro como argumento, esse numero corresponde a planilha a ser aberta , a primeira planilha inicia com o numero 0, depois 1, 2 e assim sucessivamente, você poderia também criar um método para retornar o nome de cada uma das planilhas, mas para facilitar o tutorial usamos a notação numérica mesmo. No método setSheets utilizamos o método getSheet do objeto Sheet anteriormente declarado, isso permite utilizando a referencia ao objeto Sheet, no exemplo "st", o programa tenha acesso aos dados contidos na planilha.
public void setSheets(int x){ st = wb.getSheet(x); }
O próximo passo é capturar as informações na planilha célula por célula, para fazer isso criamos o método lerArquivo que retorna uma matriz do tipo object genérico , fazemos isso por que a planilha pode conter tanto Strings quanto números , posteriormente trataremos cada um desses dados de acordo com o seu tipo mas para capturar-los precisamos armazena-los em uma matriz polimorfa do tipo Object que aceita qualquer tipo de dados (lembra de polimorfismo ???).
Como o código é extenso vamos comentar linha por linha:
Na declaração do método o "Object [ ][ ]" indica que o método retorna uma matriz de objetos genéricos. Pode ser qualquer coisa, números,textos,datas,etc. Aqui você vê o polimorfismo em ação , e por que precisamos dele?? por que a planilha pode misturar diversos tipos de dados de uma vez só.
Na linha 3, na declaração Cell c, criamos uma referencia para um objeto do tipo Cell, para quem estudou excel sabe que em uma planilha existe a celula que é a unidade básica do excel na intercessão de uma linha com uma coluna temos a célula, precisamos de um objeto célula para tratar os dados contidos na mesma.
Na linha 5 e 6 usamos o método getRows e getColumns para retornar o número de linhas e o número de colunas da planilha que contém informações. Aqui você precisa lembra da disciplina de algoritmos e programação quando o seu professor lhe ensinava a percorrer as linhas e colunas de
uma matriz, precisávamos descobrir as dimensões da matriz para poder percorrer cada endereço da mesma , aqui o principio é o mesmo, quando usamos esses dois métodos descobrimos o tamanho das linhas e colunas que contém informação dentro da planilha , dessa maneira não precisamos percorrer todos os endereços da mesma.
Nas linhas 8,9 e 10 criamos uma matriz genérica de objetos e os laços for alinhados servem para varrer cada endereço da planilha (igual a varredura de uma matriz de números). Os dois laços vão informar linha e coluna que estarão lendo a cada momento iniciando no endereço 0 0 ( linha 0, coluna 0 ) e indo até o ultimo endereço possível indicado por numlinha e numcoluna (numero de linhas numero de colunas :-) ).
Em cada endereço fornecido pelo laço de controle capturamos o conteúdo da célula atual com o comando descrito na linha 12 , "c=st.getCell(coluna,linha)". Depois de capturado o conteúdo, testamos o mesmo usando uma serie de if's:
caso seja numero armazenamos o mesmo como um double( linha 14 a 18)
caso seja texto armazenamos o mesmo como uma string ( linha 23 a 27)
caso seja um conteúdo vazio não fazemos nada(linha 19 a 22)
Existem outros tipos de dados mas para manter a praticidade do tutorial só usamos texto e números.
Finalmente depois que o laço termina retornamos a matriz de resultados (linha 32).
public Object [ ][ ] lerArquivo( ){ Cell c; int numlinha =st.getRows( ) ; int numcol = st.getColumns( ) ; Object [ ][ ]resultado = new Object[numlinha][numcol]; for(int linha = 0 ; linha < numlinha ; linha++){ for(int coluna = 0 ; coluna < numcol ; coluna ++){ c=st.getCell(coluna,linha); if (c.getType() == CellType.NUMBER) { NumberCell nc = (NumberCell) c; resultado[linha][coluna]=(Double)nc.getValue(); } if (c.getType() == CellType.EMPTY) { } if (c.getType() == CellType.LABEL) { LabelCell lc = (LabelCell) c; resultado[linha][coluna] = lc.getString( ); } } } return resultado; }Para finalizar a classe de exemplo temos que fechar o arquivo depois de usa-lo , para isso criamos o método finalizar que só faz chamar o método close do objeto Workbook
public void finalizar( ){ wb.close( ); }Agora utilizando o objeto retornado pelo método lerArquivo basta alimentar a JTable da sua aplicação e pronto. Confira o código completo da classe Leitor logo abaixo, se estiver interessado na primeira parte desse artigo clique no link a seguir : Usando a API JExcel Parte 1.
Código Completo
/** * * @author Joao Santanna */ import java.awt.Font; import java.io.File; //import java.util.Date; import javax.swing.JFileChooser; import jxl.*; public class Leitor { private Workbook wb; private Sheet st; public void iniciar(){ try{ JFileChooser fopen = new JFileChooser( ); fopen.showOpenDialog(null); wb= Workbook.getWorkbook(fopen.getSelectedFile( )); // se não usar o JFileChooser poderia abri a planilha //passando o nome do arquivo diretamente ex: // wb= Workbook.getWorkbook("Teste.xls"); }catch(Exception e){ e.printStackTrace(); } } public void setSheets(int x){ st = wb.getSheet(x); } public Object [ ][ ] lerArquivo( ){ Cell c; int numlinha =st.getRows( ) ; int numcol = st.getColumns( ) ; Object [ ][ ]resultado = new Object[numlinha][numcol]; for(int linha = 0 ; linha < numlinha ; linha++){ for(int coluna = 0 ; coluna < numcol ; coluna ++){ c=st.getCell(coluna,linha); if (c.getType() == CellType.NUMBER) { NumberCell nc = (NumberCell) c; resultado[linha][coluna]=(Double)nc.getValue(); } if (c.getType() == CellType.EMPTY) { } if (c.getType() == CellType.LABEL) { LabelCell lc = (LabelCell) c; resultado[linha][coluna] = lc.getString( ); } } } return resultado; } public void finalizar( ){ wb.close( ); } }
Boa tarde,
ResponderExcluirCara, mt bom seu post.
Estou com uma duvida ainda que não encontrei na net, estou gerando um excel com os valores de uma tabela que eu tenho no sistema, consegui gravar todos os campos, exceto o campo Preço, gostaria de deixá-lo formatado na forma de moeda, teria algum método para isso? Tentei converte-lo para Double, mas o formato que ele está atualmente (#,##) não permite esta conversão! Existe algum método que me permita formatar a célula para um valor monetário?
Boa tarde,
ResponderExcluirCara, mt bom seu post.
Estou com uma duvida ainda que não encontrei na net, estou gerando um excel com os valores de uma tabela que eu tenho no sistema, consegui gravar todos os campos, exceto o campo Preço, gostaria de deixá-lo formatado na forma de moeda, teria algum método para isso? Tentei converte-lo para Double, mas o formato que ele está atualmente (#,##) não permite esta conversão! Existe algum método que me permita formatar a célula para um valor monetário?