Importar planilha (*.xls) para um banco de dados

Boa noite caros colegas!!

Pessoal, preciso de uma dica de vocês, seguinte:

Criei em java, um campo pra upload de um arquivo. Esse arquivo é um *.xls (documento do MS Excel) que contém basicamente duas colunas, Data(do tipo date) e Meta(do tipo Double). Preciso de alguma forma para fazer com que o programa possa ler os dados da planilha e copiar as informações para um banco de dados Oracle, que possui também duas colunas(Data, e Meta). À princípio criei uma função pra percorrer linha por linha do documento, e armazena-la numa variável “auxiliar” so tipo String. Tive problemas, já que a variavel do tipo String “não aceitou” armazenar dados do tipo Date e Double. Infelizmente não posso postar o código aqui porque está em outro computador. Preciso da ajuda de vocês pra realizar essa tarefa, preciso de pelo menos uma dica de como fazer isso, não sei ao menos como começar e nem o que fazer.

ps.: Não posso apontar no código o diretório onde vai está a planilha, porque é o usuário final que vai apontar o arquivo clicando em “procurar arquivos” num campo que fiz.

Concluindo: Básicamente é pegar os dados de uma planilha do formato *.xls e importar os dados da plalinha para um banco de dados que possui as mesmas colunas da planilha. IMplementando em código Java.

Aguardo respostas, bom feriado a todos.
Moderem na cerveja!! :stuck_out_tongue: kkk

As suas colunas no Oracle estão como? Date e Number? Se sim, crie suas variáveis como Date e Long ou BigDecimal, o que preferir, e faça cast das Strings para o respectivo tipo. Não entendi muito bem qual o problema, rsrsrsrs.

A disposição.

kkkkk, o problema é que eu não sei como jogar os dados(informações) das colunas da planilha(*.xls) para as colunas da tabela do banco de dados atraves do upload.

Não sei se vai ajudar, mas eu desenvolvi um projeto um tempo atrás para ajudar a ler planilhas do excel.

Você pode fazer download do mesmo aqui:

http://sourceforge.net/projects/leitor-excel/files/

pegue o arquivo leitorexcel0.1RC01bin.tar.gz
Depois que descompactar ele, adicione os jars no classpath do seu projeto e leia o javadoc das classes:

br.eti.rogerioaguilar.minhasclasses.util.excel.leitor.LeitorExcel
br.eti.rogerioaguilar.minhasclasses.util.excel.leitor.listener.ColunaListener
br.eti.rogerioaguilar.minhasclasses.util.excel.leitor.listener.LinhaListener

O código abaixo é um exemplo de como a biblioteca poderia ser utilizada no seu caso, utilizando a planilha que está em anexo (que segue o formato que vc disse).
OBS: para testar não esquecer de alterar o caminho do arquivo que está como /home/duque/Desktop/teste.xls


import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import br.eti.rogerioaguilar.minhasclasses.util.excel.leitor.LeitorExcel;
import br.eti.rogerioaguilar.minhasclasses.util.excel.leitor.exception.ListenerException;
import br.eti.rogerioaguilar.minhasclasses.util.excel.leitor.listener.ColunaListener;
import br.eti.rogerioaguilar.minhasclasses.util.excel.leitor.util.LinhaColunaListenerVo;

class DadosVO implements Serializable {
	private Date colunaData;
	private Double valor;

	public Date getColunaData() {
		return colunaData;
	}

	public void setColunaData(Date colunaData) {
		this.colunaData = colunaData;
	}

	public Double getValor() {
		return valor;
	}

	public void setValor(Double valor) {
		this.valor = valor;
	}

	public DadosVO(Date colunaData, Double valor) {
		super();
		this.colunaData = colunaData;
		this.valor = valor;
	}
	
	public DadosVO(){
	}

	public String toString() {
		return "Data --> " + colunaData + " valor --> " + valor;
	}

}

public class TesteLeitorExcel {

	public static void main(String[] args) throws Exception {

		InputStream is = new FileInputStream("/home/duque/Desktop/teste.xls");
		LeitorExcel leitor = null;

		//Lista que irá guardar os dados da planilha
		final List<DadosVO> listaDadosVO = new LinkedList<DadosVO>();

		leitor = new LeitorExcel("[*,*]", 1, is, null,

			new ColunaListener() {
				DadosVO dadosVO = null;
	
				
				@Override
				public boolean lendoColuna(int linha, int coluna, Map dadosColuna)
						throws ListenerException {
					LinhaColunaListenerVo voAtual = (LinhaColunaListenerVo) dadosColuna
							.get(ColunaListener.CHAVE_VO_COLUNA);
					if (linha > 1) { //Pula primeira linha pois é a linha que possui o título
						switch (coluna) {
							case 1:// Coluna data
								if(dadosVO == null){
									dadosVO = new DadosVO();
								}
								Date data = voAtual.getCelulaAtual().getDateCellValue();
								System.out.println("Data --> " + data);
								dadosVO.setColunaData(data);
								break;
							case 2:// Coluna meta
								double valor = voAtual.getCelulaAtual().getNumericCellValue();
								System.out.println("Valor atual -->" + valor);
								dadosVO.setValor(valor);
								//"acabei de ler a linha" Adiciono o vo na lista
								listaDadosVO.add(dadosVO);
								dadosVO = null;
						}
					}
	
					return true;
	
				}
			}
		);
		
		leitor.processarLeituraPlanilha();
		
		//Agora faço o que quiser com os dados da planilha
		for(DadosVO vo : listaDadosVO) {
			System.out.println( vo );
		}
		
	}
}

Os detalhes sobre como utilizar a api estão na documentação javadoc do componente.
Existem duas classes que eu implementei que são exemplos da implementação dos listeners para as interfaces de leitura das linhas e colunas.
Estas classes são:

br.eti.rogerioaguilar.minhasclasses.util.excel.leitor.teste.listener.ConsoleLinhaListener
br.eti.rogerioaguilar.minhasclasses.util.excel.leitor.teste.listener.ConsoleColunaListener

se quiser ver o código destas classes você terá que fazer o download do pacote que possui o código fonte da biblioteca:

leitorexcel0.1RC01desenv.tar.gz

Você pode ler algumas informações sobre este componente aqui:

http://leitor-excel.sourceforge.net/

Espero que te ajude de alguma forma.

Até mais!

Isso mesmo cara o que eu precisava, você me ajudou muito. Obrigado! Fica com Deus, na segunda vou implementar essa sua solução. Obrigado!

Talvez seja bom você ler tb o javadoc para a classe:

br.eti.rogerioaguilar.minhasclasses.util.excel.leitor.util.LinhaColunaListenerVo

esta classe tenta ao máximo transformar os dados para o tipo que você quer, porém vc pode
acessar o objeto original da api Apache POI utilizando o método getCelulaAtual(), como fiz no exemplo.

Você talvez tenha que alterar o código do listener dependendo do que for fazer. O meu exemplo não vai funcionar direito se alguma linha não possuir dados para a segunda coluna, por exemplo, mas isso está relacionado com a lógica que eu utilizei. Talvez vc tenha que alterar a lógica caso exista a possibilidade de células vazias ou com valores inválidos, mas isso você que terá que implementar de acordo com o que quiser. A idéia geral do componente é que vc especifique quais linhas e/ou colunas você quer ler e qual planilha você quer ler no arquivo. À partir destes dados, o componente lê as células da planilha e chama os listeners correspondentes. A implementação dos listeners com os dados da linha ou coluna é você que faz de acordo com as suas necessidades e você não precisa acessar diretamente a api Apache poi para fazer a leitura dos dados da planilha. Quando o objeto criado não possuir dados suficientes sobre a linha ou coluna, você pode acessar os objetos originais da api poi que representam as linhas e colunas, conforme explicado no javadoc e nas classes que imprimem os dados no console (que estão no pacote de desenvolvimento).

Até mais!

Infelizmente não pude usar a sua biblioteca por motivos de força maior (rs), criei a seguinta classe no button action do upload do arquivo:

private void tg_upload1_action(JdbcUtil j, ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
    HttpSession session = request.getSession(true);
    try {
      CadastroDePMTActionForm f = (CadastroDePMTActionForm) form;
      if (f.getUpload() != null && f.getUpload().toString() != null && f.getUpload().toString().length() > 0) {

        String path = this.getServlet().getServletContext().getRealPath("index.html");
        path = path.substring(0, path.lastIndexOf("/"));
        String realPath0bl_form_Tb_meta_diaria_1 = path + "/temp";
        realPath0bl_form_Tb_meta_diaria_1 = realPath0bl_form_Tb_meta_diaria_1 + java.io.File.separator;

        java.io.File fl = new java.io.File(realPath0bl_form_Tb_meta_diaria_1 + f.getUpload().toString());
        java.io.FileReader fr = new java.io.FileReader(fl);
        java.io.BufferedReader reader = new java.io.BufferedReader(fr);
        java.io.BufferedReader in = new java.io.BufferedReader(new java.io.FileReader(realPath0bl_form_Tb_meta_diaria_1 + f.getUpload().toString()));

        String auxiliar = (realPath0bl_form_Tb_meta_diaria_1 + f.getUpload().toString());
        List sheetData = new ArrayList();

        java.io.FileInputStream fis = null;
        try {
          fis = new java.io.FileInputStream(auxiliar);

          org.apache.poi.hssf.usermodel.HSSFWorkbook workbook = new org.apache.poi.hssf.usermodel.HSSFWorkbook(fis);
          org.apache.poi.hssf.usermodel.HSSFSheet sheet = workbook.getSheetAt(0);

          Iterator rows = sheet.rowIterator();
          while (rows.hasNext()) {
            org.apache.poi.hssf.usermodel.HSSFRow row = (org.apache.poi.hssf.usermodel.HSSFRow) rows.next();
            Iterator cells = row.cellIterator();
            ArrayList data = new ArrayList ();
            while (cells.hasNext()) {
              org.apache.poi.hssf.usermodel.HSSFCell cell = (org.apache.poi.hssf.usermodel.HSSFCell) cells.next();
              data.add(cell.getStringCellValue());
            }
            Tb_meta_diaria table = new Tb_meta_diaria();
            String dt_meta = new String((String) data.get(0));
            String vl_meta = new String((String) data.get(1));
            table.setDt_meta(com.egen.util.text.FormatDate.parseDate(dt_meta, "dd/MM/yyyy"));
            table.setVl_meta(com.egen.util.text.FormatNumber.toDouble(vl_meta));
          }
        } catch (java.io.IOException e) {
          e.printStackTrace();
        } finally {
          if (fis != null) {
            fis.close();
          }
        }
        ActionForward actionForward = mapping.findForward("same");
      }
      session.setAttribute(mapping.getName(), form);
    } catch (Exception e) {
      throw e;
    } finally {
    }
  }

Esta dando um erro, verifiquei no debug que ele pula pro tratamento de excessao nessa parte do código:

Tb_meta_diaria table = new Tb_meta_diaria(); String dt_meta = new String((String) data.get(0)); String vl_meta = new String((String) data.get(1)); table.setDt_meta(com.egen.util.text.FormatDate.parseDate(dt_meta, "dd/MM/yyyy")); table.setVl_meta(com.egen.util.text.FormatNumber.toDouble(vl_meta));

Não sei o que eu fiz de errado :confused: