Busca

JSantanna

Meu blog sobre engenharia, tecnologia, ciência da Computação, etc.

Categoria

JExcel

Vídeo: extraindo dados de uma tabela Excel usando Java

Esse vídeo faz parte de uma das minhas aulas de programação, nele eu mostro como utilizar a API ( aplication Programming Interface) JExcel para extrair dados de uma planilha excel diretamente em uma tabela Java swing.A API vc encontra no endereço: http://jexcelapi.sourceforge.net/


JEXCELAPI from João Santanna on Vimeo.

Anúncios

>Usando a API JExcel Parte 2 – Acessando e imprimindo dados de uma planilha

>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.

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( );
}

}

Usando a API JExcel Parte 2 – Acessando e imprimindo dados de uma planilha

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.

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( );
}

}

>Usando a API JExcel Parte 1 – Instalando o JExcel no Netbeans

>A JExcel API é uma biblioteca open source  que utilizamos para que o java possa acessar dados em planilhas do MS-Excel , a API ( Application Programming Interface) dá ao usuário métodos para ler , escrever e modificar dados em planilhas , o site do projeto fica no endereço http://jexcelapi.sourceforge.net/ .

Vou dividir esse artigo em 4 partes :

  • Instalando o JExcel no Netbeans .
  • Acessando e imprimindo dados de uma planilha
  • Acessando os dados de uma planilha e colocando em uma JTable
  • Salvando os dados de uma JTable para uma planilha em Excel

Além da JExcel outra API disponível para desenvolvedores java é a API do projeto Apache POI da Apache foundation , a diferença é que a JExcel é mais simples e também mais limitada , só trabalha com planilhas do Excel , já a API da Apache trabalha manipulando vários tipos de arquivos do MS Office , logo é muito mais extensa e complexa, como estou desenvolvendo atualmente um projeto que precisa acessar planilhas do Excel escolhi o JExcel por ser mais simples que o Apache POI .

Instalando a JExcel no Netbeans

Vou mostrar aqui como configurar o netbeans para importar o JExcel, os passos são similares se você estiver usando outra ferramenta de desenvolvimento como o eclipse por exemplo . 
Depois de baixado e descompactado o arquivo da API , você terá uma pasta com toda a documentação e um tutorial de como utilizar o JExcel além do código fonte (pasta source) e um arquivo JAR que contém todas as classes da API .
Inicialize o netbeans e procure no menu ferramentas a opção bibliotecas, essa opção ativa o gerenciador de bibliotecas que você vai utilizar para adicionar o JExcel.
 Procure o botão Nova biblioteca, dê um nome a nova biblioteca ( sugestão : JExcel API) , feito isso procure pela nova biblioteca recém criada na lista de bibliotecas e selecione-a, do lado direito do gerenciador de biblioteca selecione a aba Classpath e logo depois clique no botão adicionar JAR/Pasta, procure na pasta que você acabou de fazer o download da API o arquivo jxl.jar , depois basta clicar no botão adicionar pasta na caixa de busca , finalmente clique no botão ok do gerenciador de bibliotecas.
Note que se você mudar o locar onde fica o arquivo jxl.jar , essa mudança deve ser ajustada no gerenciador de bibliotecas.
Agora para usar a JExcel API no seu projeto é fácil, primeiramente crie um projeto java qualquer, depois de criado o projeto selecione a pasta bibliotecas e de um clique com o botão Direito (Control + Mouse no MAC), na janela de dialogo aberta escolha o item adicionar biblioteca.

 Logo depois disso uma janela com todas as bibliotecas instaladas será aberta e você pode selecionar a JExcel API previamente configurada. Sua pasta de bibliotecas vai ficar parecida com a figura abaixo.
Pronto , seu projeto já está pronto para importar classes da API e você já pode começar a ler dados de planilhas do Excel , aguarde os próximos artigos onde comentamos o código que torna isso possível.

Usando a API JExcel Parte 1 – Instalando o JExcel no Netbeans

A JExcel API é uma biblioteca open source  que utilizamos para que o java possa acessar dados em planilhas do MS-Excel , a API ( Application Programming Interface) dá ao usuário métodos para ler , escrever e modificar dados em planilhas , o site do projeto fica no endereço http://jexcelapi.sourceforge.net/ .

Vou dividir esse artigo em 4 partes :

  • Instalando o JExcel no Netbeans .
  • Acessando e imprimindo dados de uma planilha
  • Acessando os dados de uma planilha e colocando em uma JTable
  • Salvando os dados de uma JTable para uma planilha em Excel

Além da JExcel outra API disponível para desenvolvedores java é a API do projeto Apache POI da Apache foundation , a diferença é que a JExcel é mais simples e também mais limitada , só trabalha com planilhas do Excel , já a API da Apache trabalha manipulando vários tipos de arquivos do MS Office , logo é muito mais extensa e complexa, como estou desenvolvendo atualmente um projeto que precisa acessar planilhas do Excel escolhi o JExcel por ser mais simples que o Apache POI .

Instalando a JExcel no Netbeans

Vou mostrar aqui como configurar o netbeans para importar o JExcel, os passos são similares se você estiver usando outra ferramenta de desenvolvimento como o eclipse por exemplo . 
Depois de baixado e descompactado o arquivo da API , você terá uma pasta com toda a documentação e um tutorial de como utilizar o JExcel além do código fonte (pasta source) e um arquivo JAR que contém todas as classes da API .
Inicialize o netbeans e procure no menu ferramentas a opção bibliotecas, essa opção ativa o gerenciador de bibliotecas que você vai utilizar para adicionar o JExcel.
 Procure o botão Nova biblioteca, dê um nome a nova biblioteca ( sugestão : JExcel API) , feito isso procure pela nova biblioteca recém criada na lista de bibliotecas e selecione-a, do lado direito do gerenciador de biblioteca selecione a aba Classpath e logo depois clique no botão adicionar JAR/Pasta, procure na pasta que você acabou de fazer o download da API o arquivo jxl.jar , depois basta clicar no botão adicionar pasta na caixa de busca , finalmente clique no botão ok do gerenciador de bibliotecas.
Note que se você mudar o locar onde fica o arquivo jxl.jar , essa mudança deve ser ajustada no gerenciador de bibliotecas.
Agora para usar a JExcel API no seu projeto é fácil, primeiramente crie um projeto java qualquer, depois de criado o projeto selecione a pasta bibliotecas e de um clique com o botão Direito (Control + Mouse no MAC), na janela de dialogo aberta escolha o item adicionar biblioteca.

 Logo depois disso uma janela com todas as bibliotecas instaladas será aberta e você pode selecionar a JExcel API previamente configurada. Sua pasta de bibliotecas vai ficar parecida com a figura abaixo.
Pronto , seu projeto já está pronto para importar classes da API e você já pode começar a ler dados de planilhas do Excel , aguarde os próximos artigos onde comentamos o código que torna isso possível.

Blog no WordPress.com.

Acima ↑