Ler de planilha no Excel e passar para Banco de Dados.  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
petter
Virtual Machine Man

Membro desde: 28/04/2006 17:11:34
Mensagens: 662
Offline

Estou com dificuldade para ler uma planilha no Excel e passar os dados lidos para um banco de dados.
Alguém já fez isso?
Grato,

-----------------------------------------
Java is the future
-----------------------------------------
[WWW]
Pedrosa
JWizard
[Avatar]

Membro desde: 13/07/2005 13:08:08
Mensagens: 2505
Localização: São Paulo - Brasil
Offline

Dá uma olhada nesse projeto da jakarta que é para manipulação de documentos da MS

http://jakarta.apache.org/poi

Aqui um artigo que explica como usá-lo

http://www.javaworld.com/javaworld/jw-03-2004/jw-0322-poi.html

petter
Virtual Machine Man

Membro desde: 28/04/2006 17:11:34
Mensagens: 662
Offline

Achei muito interessante o que vc mandou, se não for abusar vc sabe de algum arquivo que mostre como "converter" o que vc leu no arquivo para uma select por exemplo?

Valeu.

-----------------------------------------
Java is the future
-----------------------------------------
[WWW]
isneiqui
Thread.start()
[Avatar]

Membro desde: 22/04/2004 17:50:44
Mensagens: 38
Localização: São Paulo/SP
Offline

Se vc quiser poderia dar uma olhada tb no:
http://www.andykhan.com/jexcelapi/tutorial.html

as vezes pode ser um pouco mais fácil de usar do que o POI, mas com qualquer um dos dois acredito que vc resolve seu problema.

Quando vc ler os conteúdos das células, vc pode montar seu SQL daí,
por ex:

esse exemplo q passei seria usando a Java Excel API (e não a POI), mas a idéia de ler os dados e montar o SQL é a mesma... é uma sugestão.
Também é possível se conectar por ODBC diretamente no XLS (Excel) tb e manipulá-lo com SQL daí...

espero ter ajudado...
um abraço

MS IE User: BrainNotFoundException.
[MSN] [ICQ]
petter
Virtual Machine Man

Membro desde: 28/04/2006 17:11:34
Mensagens: 662
Offline

Cara agora pintou uma dúvida que dá até vergonha, estou testando o seu exemplo e procurei por todo o material mas tem que fazer alguma coisa para por exemplo "Instalar" essa API, pois uso o Netbeans e dá um monte de erro aí pensei que tivesse que instalar ela de alguma forma para a gente dar um import como fazemos com outras API´s do Java. Vc sabe onde encontro documentação de como fazer isso?

-----------------------------------------
Java is the future
-----------------------------------------
[WWW]
petter
Virtual Machine Man

Membro desde: 28/04/2006 17:11:34
Mensagens: 662
Offline

Hehe... Novato é soda.

Achei como usar, é só adicionar o jar na minha lib.

Valeu.

-----------------------------------------
Java is the future
-----------------------------------------
[WWW]
David
JavaEvangelist
[Avatar]

Membro desde: 18/03/2005 13:10:33
Mensagens: 450
Localização: Natal/RN
Offline

Uma solução que, a principio é sebosa, mas que dependendo do seu problema pode ser a mais simples é você importar o xls no Access e depois exportar para um mdb. Depois é só acessá-lo como um banco de dados normal, via ODBC.

David Pereira
Engenheiro de Computação - UFRN
Mestre em Engenharia Elétrica
Doutorando em Engenharia Elétrica
[WWW]
petter
Virtual Machine Man

Membro desde: 28/04/2006 17:11:34
Mensagens: 662
Offline

Estou usando o seguinte código para ler em um arquivo do Excel e fazer o insert no banco, contudo ele busca um valor por vez, como na minha necessidade a quantidade de linhas da planilha é variável tem como eu fazer ele pegar de forma mais automática a quantidade total das linhas para fazer o insert no banco?
Olha o código:


-----------------------------------------
Java is the future
-----------------------------------------
[WWW]
petter
Virtual Machine Man

Membro desde: 28/04/2006 17:11:34
Mensagens: 662
Offline

Pessoal, dando uma modificada no meu último Post, o código abaixo está com um erro quando chego na última linha com informação na minha planilha. Alguém pode me ajudar a tratar esse erro?

-----------------------------------------
Java is the future
-----------------------------------------
[WWW]
isneiqui
Thread.start()
[Avatar]

Membro desde: 22/04/2004 17:50:44
Mensagens: 38
Localização: São Paulo/SP
Offline

pelo que eu vi na API, tem um método em Sheet q retorna a quantidade de linhas daquela planilha. Daí é só fazer um FOR que vai inserindo um a um... tem tb um método que retorna todas as células de uma determinada linha, daí fica mais fácil pra manipular.
não testei mas acredito que dê certo, deve ficar algo assim:



foi o que escrevi aqui rapidinho deve ter vários errinhos mas o
importante é pegar a idéia principal...

qualquer coisa estamos ae,
abraços>

MS IE User: BrainNotFoundException.
[MSN] [ICQ]
petter
Virtual Machine Man

Membro desde: 28/04/2006 17:11:34
Mensagens: 662
Offline

Cara valeu mesmo, peguei a sua idéia e agreguei ao que eu já tinha feito e agora tá funcionando perfeito, para constar como efeito de como foi implementada a solução segue o código:




-----------------------------------------
Java is the future
-----------------------------------------
[WWW]
bebad
JavaEvangelist
[Avatar]

Membro desde: 27/07/2006 19:56:35
Mensagens: 303
Offline

Parabéns pela iniciativa amigos,

Muito obrigado.


Eu tentei usar a do Jakarta pois estou precisando converter xls de office mais avancados,

Bom, após apanhar uma madrugada inteira e metade do dia seguinte finalmente consegui executar o exemplo que encontrei no www.onjava.com.

Valeu !!!!!!!

Admin.. PATCH your box now, or DIE!!!

Oracle Certified Associate, Java SE 5/SE 6
Oracle Certified Professional, Java SE 6 Programmer
Oracle Certified Professional, Java ME 1 Mobile Application Developer
Oracle Certified Expert, Java EE6 Web Services Developer
Oracle Certified Master, Java EE 5 Enterprise Architect
Oracle Certified Professional, Java EE 5 Web Component Developer
Oracle Certified Professional, Java EE 5 Business Component Developer

representing the old school defacers brazil:
red_eye
ATH
ir4dex
hax0rs lab
IoN
r00t_system
kernel_panic

bebad was here.
anderline27
Entusiasta Java

Membro desde: 23/11/2007 18:38:01
Mensagens: 19
Offline

Olá,

Primeiro queria agradecer ao exemplo de inserir a planilha no excel no banco de dados, eu usei o codigo pra minha monografia, porem não vou inserir no banco de dados, vou usar os dados em uma formula chamada EWMA, que calcula derivativos, porem a formula somente aceita dados do tipo double ou float. Preciso urgentemente converter esses dados em double ou float pra colocar em minha monografia q é pra Dezembro/2007 e se eu resolver esse problema, tenho outro, vou ter q plotar um grafico, to pensando em usar a API jFreeChart.

C:\Documents and Settings\NTI\Meus documentos\Anderson\Monografia\src\EWMA.java

1 import java.io.File;
2 import java.util.*;
3 //import jxl.*;
4 import java.lang.*;
5 import java.io.File;
6 import java.io.IOException;
7 import java.sql.Connection;
8 import java.sql.DriverManager;
9 import java.sql.PreparedStatement;
10 import java.sql.SQLException;
11 import java.util.Date;
12 import javax.swing.JOptionPane;
13 import jxl.Cell;
14 import jxl.CellType;
15 import jxl.DateCell;
16 import jxl.NumberCell;
17 import jxl.Sheet;
18 import jxl.Workbook;
19 import jxl.read.biff.BiffException;
20 import javax.swing.*;
21
22
23 public class EWMA{
24
25 private static Connection conn;
26 private static int i = 0;
27 private static int j = 0;
28 private static String stringa1;
29 private static String stringb2;
30 private static double intc3;
31 private static double lambida;
32 private static double lambida2;
33 private static double ewma;
34 private static double a;
35 private static String titulo;
36 private static String stringd4;
37 private static String stringe5;
38 private static String stringf6;
39 private static String stringg7;
40 private static String stringh8;
41 private static String stringi9;
42 private static String stringj10;
43 private static String stringk11;
44 private static String stringl12;
45 private static String stringm13;
46 private static String stringn14;
47
48
49 /** Creates a new instance of Main */
50 public static void main(String[] args ) throws IOException, BiffException
51 //throws IOException, BiffException,
52 /*ClassNotFoundException, SQLException */
53 {
54 ewma();
55 //vet = new Vector();
56
57 //Conexão com o banco de dados
58 //Class.forName("com.mysql.jdbc.Driver");
59 //Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jar",
60 // "user",
61 // "senha");
62
63 /* pega o arquiivo do Excel OPÇÃO 1*/ // não achou o arquivo
64 //Workbook workbook = Workbook.getWorkbook(new File("myfile.xls"));
65
66 }
67
68 public static void ewma() throws IOException, BiffException{
69
70 JOptionPane.showMessageDialog(null,"Lendo o arquivo ...");
71
72 // pega o arquiivo do Excel
73 String filename = "c:/1995_completo_soja.xls";
74 File f= new File(filename);
75 Workbook planilha = Workbook.getWorkbook(f);
76 // Mostra o nome do arquivo lido
77 JOptionPane.showMessageDialog(null,"Leu o arquivo " +f);
78
79 /* pega a primeira planilha dentro do arquivo XLS */
80 Sheet sheet = planilha.getSheet(0);
81
82 //Pega a quantidade de linhas da planilha
83 int linhas = sheet.getRows();
84 // Mostra a quantidad de linhas
85 JOptionPane.showMessageDialog(null,"Quantidade de linhas: " +linhas);
86 //Pega a quantidade de colunas da planilha
87 int colunas = sheet.getColumns();
88 // Mostra a quantidade de colunas
89 JOptionPane.showMessageDialog(null,"Quantidade de colunas: " +colunas);
90
91 for(i = 0; i < linhas; i++){ // pega as linhas
92 for(j = 0; j < colunas; i++){ // pega as colunas
93
94 /* pega os valores das células como se numa matriz */
95
96 //Cell a1 = sheet.getCell(0,i);
97 //Cell b2 = sheet.getCell(1,i);
98 //Cell c3 = sheet.getCell(2,i);
99 //Cell d4 = sheet.getCell(3,i);
100 //Cell e5 = sheet.getCell(4,i);
101 //Cell f6 = sheet.getCell(5,i);
102 //Cell g7 = sheet.getCell(6,i);
103 //Cell h8 = sheet.getCell(7,i);
104 //Cell i9 = sheet.getCell(8,i);
105 //Cell j10 = sheet.getCell(9,i);
106
107 // pega as celulas da coluna, pulando a 1º linha do titulo
108 Cell k11 = sheet.getCell(10,i+1);
109
110 /*
111 if (k11.getType() == CellType.NUMBER)
112 {
113 NumberCell fc = (NumberCell)k11;
114 stringk11 = fc.getNumberFormat();
115 }
116 */
117
118
119 //Cell l12 = sheet.getCell(11,i);
120 //Cell m13 = sheet.getCell(12,i);
121 //Cell n14 = sheet.getCell(13,i);
122
123
124
125 /* pega os conteúdos das células */
126
127 //stringa1 = a1.getContents(); // Pega todo o conteudo da coluna A
128 //stringb2 = b2.getContents(); // Pega todo o conteudo da coluna B
129 //stringd4 = d4.getContents(); // Pega todo o conteudo da coluna C
130 //stringe5 = e5.getContents(); // Pega todo o conteudo da coluna D
131 //stringf6 = f6.getContents(); // Pega todo o conteudo da coluna E
132 //stringg7 = g7.getContents(); // Pega todo o conteudo da coluna F
133 //stringh8 = h8.getContents(); // Pega todo o conteudo da coluna G
134 //stringi9 = i9.getContents(); // Pega todo o conteudo da coluna H
135 //stringj10 = j10.getContents(); // Pega todo o conteudo da coluna I
136
137
138 // Pega todo o conteudo da coluna J
139
140 stringk11 = k11.getContents();
141 // stringj10 = Float.parseFloat(j10.getContents());
142
143
144 //stringl12 = l12.getContents(); // Pega todo o conteudo da coluna K
145 //stringm13 = m13.getContents(); // Pega todo o conteudo da coluna L
146 //stringn14 = n14.getContents(); // Pega todo o conteudo da coluna M
147
148 // Mostra o conteudo da coluna J
149 JOptionPane.showMessageDialog(null,"Conteudo da Coluna: " +stringk11);
150
151
152
153
154 // Inicio da Formula EWMA
155
156 lambida = 0.94;
157 i = 1;
158 lambida2 = 1;
159 ewma = 0;
160 do{
161 ewma = ewma + Math.pow(k11.getContents(10,i+1),2) * lambida2;
162 lambida2 = lambida2 * lambida;
163 i = i+1;
164 }while(lambida2 > 0.00001);
165 ewma = ewma * ( 1 - lambida);
166
167 // Fim da Formula EWMA
168
169 } // fecha for j
170 } // fecha for i
171 planilha.close(); // fecha planilha
172 };
173
174 }
175
176
177


O erro é na linha 161, os dados q estão vindo pra formula são em String, porem preciso elevar os dados a potência de 2 e esse metodo Math.pow(double a, double b) só aceita double.
Se alguem puder ajudar ai, vou ficar muito grato.

Meu msn é : ander_dorneles@hotmail.com
To sempre on line

Anderson Dorneles
lavh
GUJ Master

Membro desde: 30/07/2006 16:09:55
Mensagens: 1311
Offline

não sei se entendi bem...mas acho que um:



ou



resolve o seu problema

[]'s

This message was edited 1 time. Last update was at 23/11/2007 19:02:20

anderline27
Entusiasta Java

Membro desde: 23/11/2007 18:38:01
Mensagens: 19
Offline

Olá,

Obriago pela dica, mais eu ja tinha experimentado isso, tanto float qto double:

stringk11 = Double.parseDouble(k11.getContents());

e da esse erro de excessão:

Exception in thread "main" java.lang.NumberFormatException: For input string: "12,3"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
at java.lang.Double.parseDouble(Double.java:510)
at EWMA.ewma(EWMA.java:141)
at EWMA.main(EWMA.java:54)
Java Result: 1

ahh, so pra constar, q como String o codigo como está lê todos os dados das celulas dessa coluna, ja como double...

esse dado "12,3" ele se encontra +/- no meio da planilha, não sei pq o erro nesse dado se os outros dados são parecidos. Porem ainda acho q o problema é a função getContents(); q não suporta dado ponto flutuante. Acho q preciso pegar esses dados de forma diferente, só não sei como fazer, só sei q pegar como string não vai rolar, e pelo q dei uma olhada na documentação, tem umas funções q pegam ja como double, só não soube usá-las.

Mais agradeço desde já

Anderson Dorneles
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team