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,
Ler de planilha no Excel e passar para Banco de Dados
36 Respostas
Dá uma olhada nesse projeto da jakarta que é para manipulação de documentos da MS
Aqui um artigo que explica como usá-lo
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.
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:
/* pega o arkivo do Excel */
Workbook workbook = Workbook.getWorkbook(new File("myfile.xls"));
/* pega a primeira planilha dentro do arquivo XLS */
Sheet sheet = workbook.getSheet(0);
/* pega os valores das célular como se numa matriz */
Cell a1 = sheet.getCell(0,0);
Cell b2 = sheet.getCell(1,1);
Cell c2 = sheet.getCell(2,1);
/* pega os conteúdos das células */
String stringa1 = a1.getContents();
String stringb2 = b2.getContents();
String stringc2 = c2.getContents();
/* agora é só montar seu SQL*/
String sql = "INSERT INTO MinhaTabela(col1,col2,col3) "+
"VALUES('"+stringa1+"','"+stringb2+"',"+stringc2+"')";
/*execute esse SQL agora (por JDBC 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
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?
Hehe… Novato é soda.
Achei como usar, é só adicionar o jar na minha lib.
Valeu.
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.
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:
package controleweb;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
/**
*
* @author petter
*/
public class Main {
private static Connection conn;
/** Creates a new instance of Main */
public static void main(String[] args ) throws IOException, BiffException,
ClassNotFoundException, SQLException {
/* pega o arquiivo do Excel */
Workbook workbook = Workbook.getWorkbook(new File("enviados.xls"));
/* pega a primeira planilha dentro do arquivo XLS */
Sheet sheet = workbook.getSheet(0);
/* pega os valores das célular como se numa matriz */
Cell a1 = sheet.getCell(0,0);
Cell b2 = sheet.getCell(1,1);
Cell c2 = sheet.getCell(2,1);
/* pega os conteúdos das células */
String stringa1 = a1.getContents();
String stringb2 = b2.getContents();
String stringc2 = c2.getContents();
/*String sql = "INSERT INTO MinhaTabela(col1,col2,col3) "+
"VALUES('"+stringa1+"','"+stringb2+"',"+stringc2+"')";*/
/*Executa o insert para inserir os dados no banco de testes MySQL*/
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jar", "user", "senha");
PreparedStatement ps = conn.prepareStatement("INSERT INTO Teste(string1,string2,titulo) "+
"VALUES('"+stringa1+"','"+stringb2+"','"+stringc2+"')");
ps.executeUpdate();
ps.close();
}
}
package controleweb;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
import jxl.Cell;
import jxl.DateCell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
/**
*
* @author petter
*/
public class Main {
private static Connection conn;
private static int i = 1;
private static Date datea1;
private static String stringb2;
private static double intc3;
private static String stringd4;
private static String stringe5;
private static String stringf6;
private static String stringg7;
private static String stringh8;
private static String stringi9;
private static String stringj10;
/** Creates a new instance of Main */
public static void main(String[] args ) throws IOException, BiffException,
ClassNotFoundException, SQLException {
/* pega o arquiivo do Excel */
Workbook workbook = Workbook.getWorkbook(new File("enviados.xls"));
/* pega a primeira planilha dentro do arquivo XLS */
Sheet sheet = workbook.getSheet(0);
do{
/* pega os valores das células como se numa matriz */
Cell a1 = sheet.getCell(0,i);
Cell b2 = sheet.getCell(1,i);
Cell c3 = sheet.getCell(2,i);
Cell d4 = sheet.getCell(3,i);
Cell e5 = sheet.getCell(4,i);
Cell f6 = sheet.getCell(5,i);
Cell g7 = sheet.getCell(6,i);
Cell h8 = sheet.getCell(7,i);
Cell i9 = sheet.getCell(8,i);
Cell j10 = sheet.getCell(9,i);
/* pega os conteúdos das células */
DateCell dc = (DateCell) a1;
datea1 = dc.getDate();
stringb2 = b2.getContents();
NumberCell nc = (NumberCell) c3;
intc3 = nc.getValue();
stringd4 = d4.getContents();
stringe5 = e5.getContents();
stringf6 = f6.getContents();
stringg7 = g7.getContents();
stringh8 = h8.getContents();
stringi9 = i9.getContents();
stringj10 = j10.getContents();
//Auto incremento para pular de linhas na planilha do Excell
i++;
}while(stringg7 != null);
/*Executa o insert para inserir os dados no banco de testes MySQL*/
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jar",
"user",
"senha");
PreparedStatement ps = conn.prepareStatement("INSERT INTO Teste(data,hora,tamanho,ip," +
" string1,string2,de," +
" para,cc,titulo) "+
"VALUES('"+datea1+"','"+stringb2+"','"+intc3+"','"+stringd4+"','"+stringe5+"'" +
" ,'"+stringf6+"','"+stringg7+"','"+stringh8+"','"+stringi9+"','"+stringj10+"')");
ps.executeUpdate();
ps.close();
workbook.close();
}
}
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:
/*Database */
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jar", "user", "senha");
/* pega a primeira planilha dentro do arquivo XLS */
Sheet sheet = workbook.getSheet(0);
int linhas = sheet.getRows(); //numero de linhas na planilha
Cell[] celulas; //array que terá as células da linha
StringBuffer sql;
for(int i=0;i<linhas;i++) //para cada linha na planilha
{
sql = new StringBuffer("");
sql.append("INSERT INTO Tabela(col1,col2,col3) "); //monta o SQL
sql.append("VALUES(");
celulas = sheet.getRow(i); //monta um array com todas as células daquela linha
for(int j=0;j<celulas.length();j++) //para cada célula na linha
{
sqlBuffer.append("'"+celulas[j].getContents()+"'"); //pega o valor da célula e coloca no SQL
if (j!=celulas.length()-1) //não adiciona a vírgula no último valor do sql
sqlBuffer.append(",");
}
sql.append(")");
System.out.println("SQL a ser executado: "+sql); //SO PRA VC VER O QUE TÁ EXECUTANDO NOS TESTES
conn.executeUpdate(sql.toString()); //executa o INSERT, como está dentro do FOR irá executar para toda linha
//altere à vontade a forma de executar o SQL.
}
conn.close();
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>
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:
package controleweb;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
import jxl.Cell;
import jxl.DateCell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
/**
*
* @author petter
*/
public class Main {
private static Connection conn;
private static int i = 0;
private static String stringa1;
private static String stringb2;
private static double intc3;
private static String stringd4;
private static String stringe5;
private static String stringf6;
private static String stringg7;
private static String stringh8;
private static String stringi9;
private static String stringj10;
private static String stringl11;
/** Creates a new instance of Main */
public static void main(String[] args ) throws IOException, BiffException,
ClassNotFoundException, SQLException {
//Conexão com o banco de dados
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jar",
"user",
"senha");
/* pega o arquiivo do Excel */
Workbook workbook = Workbook.getWorkbook(new File("enviados.xls"));
/* pega a primeira planilha dentro do arquivo XLS */
Sheet sheet = workbook.getSheet(0);
//Pega a quantidade de linhas da planilha
int linhas = sheet.getRows();
for(i = 0; i < linhas; i++){
/* pega os valores das células como se numa matriz */
Cell a1 = sheet.getCell(0,i);
Cell b2 = sheet.getCell(1,i);
Cell c3 = sheet.getCell(2,i);
Cell d4 = sheet.getCell(3,i);
Cell e5 = sheet.getCell(4,i);
Cell f6 = sheet.getCell(5,i);
Cell g7 = sheet.getCell(6,i);
Cell h8 = sheet.getCell(7,i);
Cell i9 = sheet.getCell(8,i);
Cell j10 = sheet.getCell(9,i);
Cell l11 = sheet.getCell(10,i);
/* pega os conteúdos das células */
stringa1 = a1.getContents();
stringb2 = b2.getContents();
NumberCell nc = (NumberCell) c3;
intc3 = nc.getValue();
stringd4 = d4.getContents();
stringe5 = e5.getContents();
stringf6 = f6.getContents();
stringg7 = g7.getContents();
stringh8 = h8.getContents();
stringi9 = i9.getContents();
stringj10 = j10.getContents();
stringl11 = l11.getContents();
/*Executa o insert para inserir os dados no banco de testes MySQL*/
PreparedStatement ps = conn.prepareStatement("INSERT INTO Teste(data,hora,tamanho,ip," +
" string1,string2,de," +
" para,cc,titulo,anexo) "+
"VALUES('"+stringa1+"','"+stringb2+"','"+intc3+"','"+stringd4+"','"+stringe5+"'" +
" ,'"+stringf6+"','"+stringg7+"','"+stringh8+"','"+stringi9+"','"+stringj10+"'" +
" ,'"+stringl11+"')");
ps.executeUpdate();
}
workbook.close();
}
}
:lol:
:lol:
:lol:
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 !!!
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.<em>;
3 //import jxl.</em>;
4 import java.lang.<em>;
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.</em>;
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 <em>/
50 public static void main(String[] args ) throws IOException, BiffException
51 //throws IOException, BiffException,
52 /<em>ClassNotFoundException, SQLException <em>/
53 {
54 ewma();
55 //vet = new Vector();
56
57 //Conexão com o banco de dados
58 <a href="//Class.forName">//Class.forName</a>(“com.mysql.jdbc.Driver”);
59 //Connection conn = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/jar”,
60 // “user”,
61 // “senha”);
62
63 /</em> pega o arquiivo do Excel OPÇÃO 1</em>/ // 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 /</em> pega a primeira planilha dentro do arquivo XLS <em>/
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 /</em> pega os valores das células como se numa matriz <em>/
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 /</em>
111 if (k11.getType() == CellType.NUMBER)
112 {
113 NumberCell fc = (NumberCell)k11;
114 stringk11 = fc.getNumberFormat();
115 }
116 <em>/
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 /</em> 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 é : [email removido]
To sempre on line
Anderson Dorneles
não sei se entendi bem…mas acho que um:
Float.parseFloat(celula)
ou
Double.parseDouble(celula)
resolve o seu problema
[]'s
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
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: 1ahh, 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
Esse erro é pq o Java usa “.” ao invez de “,” para casas decimais.
O ideal seria usar essas funções que vc falou da própria API, mas eu tbm não conheço a API de manipulação do Excel.
Existem duas soluções pro seu caso, não são a idéais, mas resolvem:
-
Alterar a sua planilha do excel para usar “.”
-
Dar um replace na String antes de converter ela trocando de “,” para “.”. Use o método replace(’,’,’.’);
Mas o ideal seria vc tentar achar na API o método que te devolve double direto.
Olá,
Obrigado ai pelas dicas, mais não posso modificar a planilha, ela é esse padrao no sistema de recuperação do site da BMF. Se alguem conhecer a API Java Excel e souber como faço pra pegar esses dados da planilha em double ou float e quiser da uma força, vou ficar muito grato.
T+
Anderson Dorneles
Olá,
Resolvi o problema com a conversão de String para double com esse codigo:
if (k11.getType() == CellType.NUMBER)
{
NumberCell fc = (NumberCell)k11;
stringk11 = fc.getValue();
}
Declarei a String com double e funcionou, porem estou com outro problema, preciso colocar o retorno dessa função:
String stringk11 = k11.getContents();
Dentro de uma função Math.pow(x,y); onde o x é elevado a 2 e y são os retornos de cada celula da coluna de minha planilha, alguem sabe me dizer se Math.pow() aceita q eu faça isso:
lambida = 0.94;
i = 1;
lambida2 = 1;
ewma = 0;
do{
ewma = ewma + Math.pow(2, /* função de retorno do conteudo das celulas */ ) * lambida2;
lambida2 = lambida2 * lambida;
i = i+1;
}while(lambida2 > 0.00001);
ewma = ewma * ( 1 - lambida);
Ja tentei simplesmente multiplicar os retornos pelos prorprios retornos, ja q é elevado a 2, mais tb não funcionou.
Eu testi aki no compilador e não deu certo, se alguem souber de uma outra solução pra eu elever todo o conteudo das celulas ao quadrado da uma força ai q fico grato.
T+
Anderson Dorneles
Ola Galera
Tou aqui pecisando duma gande ajudinha:
Preciso construir um grafico (usando jfreechart) a partir dos dados (valores) que se encontram guardados num ficheiro.txt!!Como posso fazer isso?? 
Ola GaleraTou aqui pecisando duma gande ajudinha:
Preciso construir um grafico (usando jfreechart) a partir dos dados (valores) que se encontram guardados num ficheiro.txt!!Como posso fazer isso??
Olá,
Esses valores estão sendo sepadaros uns dos outros como ? tem como fazer acessando o arquivo, porem te aconselho colocar esses mesmos valores numa planilha do excel e usar a API Jexcel. Qualquer coisa te dou uma força pra vc ler os dados do excel a partir do java.
T+
Os dados são guardados num ficheiro de texto (.txt)!! Tenho os dados “Nome Data Hora Temperatura”!!Agora tenho que fazer um grafico com base nos valores Data-HOra (eixo X) eTemperatura (eixo Y). Ja vi que o ideal é usar JFreeChart mas não sei se me permite fazer o grafico a partir dos dados de um ficheiro de texto 
Alguem me pode ajudar??
Os dados são guardados num ficheiro de texto (.txt)!! Tenho os dados “Nome Data Hora Temperatura”!!Agora tenho que fazer um grafico com base nos valores Data-HOra (eixo X) eTemperatura (eixo Y). Ja vi que o ideal é usar JFreeChart mas não sei se me permite fazer o grafico a partir dos dados de um ficheiro de texto![]()
Alguem me pode ajudar??
Olá,
Na minha monografia os meus dados estavam em excel, dai acessei a planilha, joguei todos os valores num vetor dinamico, dai depois joguei os valores do vetor dentro de um for simples, percorrendo todo o vetor, dai a partir disso, plotei o grafico. No seu caso vc pode acessar o arquivo do tipo .TXT, jogar os valores dentro de um vetor e depois passar isso pro código do grafico. É bem simples, primeiro tenta ai acessar o arquivo, guardar os valores num vetor e depois te passo parte do codigo de como gerar o grafico a partir do vetor.
T+
Valeu!!Muito Obrigado pela ajuda!!
Percebi perfeitamente a sua dica.
Isso de ler/escrever os dados num vector e depois num ficheiro em formato .txt ja tenho feito!
Agora não estou a ver é como mando fazer o grafico porque não tenho grandes conhecimentos de jfreechart
e respectiva construção do grafico a partir dos dados(data/hora e temperatura) do ficheiro.
Se me puder arranjar algum exemplo agradecia imenso!!
Abraço e Muito Obrigado
Valeu!!Muito Obrigado pela ajuda!!
Percebi perfeitamente a sua dica.Isso de ler/escrever os dados num vector e depois num ficheiro em formato .txt ja tenho feito!
Agora não estou a ver é como mando fazer o grafico porque não tenho grandes conhecimentos de jfreecharte respectiva construção do grafico a partir dos dados(data/hora e temperatura) do ficheiro.
Se me puder arranjar algum exemplo agradecia imenso!!Abraço e Muito Obrigado
Olá,
Vou enviar o que fiz na minha monografia, acho q vai ajudar:
package Monografia;
import java.awt.Font;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import javax.swing.JOptionPane;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.annotations.XYTextAnnotation;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CombinedDomainXYPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
/**
* A demonstration application showing how to create a vertical combined chart.
*
*/
//setDefaultCloseOperation(java.awt.Window.getWindows() .awt.WindowConstants.DISPOSE_ON_CLOSE);
public class gerar_graficos extends ApplicationFrame {
public gerar_graficos(final String title, int linhas, int i_curta, int f_curta, int f_longa, int i_longa, double ewma_b[], double media_longa[], double ewma_a[], double media_curta[], double dados_planilha[]) {
super(title);
final JFreeChart chart = createCombinedChart(linhas, i_longa, f_longa, i_curta, f_curta, ewma_b, media_longa, ewma_a, media_curta, dados_planilha);
final ChartPanel panel = new ChartPanel(chart, true, true, true, false, true);
panel.setPreferredSize(new java.awt.Dimension(500, 270));
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setContentPane(panel);
}
private JFreeChart createCombinedChart(int linhas, int i_curta, int f_curta, int f_longa, int i_longa, double ewma_b[], double media_longa[], double ewma_a[], double media_curta[], double dados_planilha[]) {
// create subplot 1...
final XYDataset data1 = createDataset1(linhas, i_longa, f_longa, i_curta, f_curta, ewma_b, media_longa, ewma_a, media_curta, dados_planilha);
final XYItemRenderer renderer1 = new StandardXYItemRenderer();
final NumberAxis rangeAxis1 = new NumberAxis("Escala - Em R$");
final XYPlot subplot1 = new XYPlot(data1, null, rangeAxis1, renderer1);
subplot1.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT);
final XYTextAnnotation annotation = new XYTextAnnotation("Hello!", 50.0, 10000.0);
annotation.setFont(new Font("SansSerif", Font.PLAIN, 9));
annotation.setRotationAngle(Math.PI / 4.0);
subplot1.addAnnotation(annotation);
// create subplot 2...
final XYItemRenderer renderer2 = new StandardXYItemRenderer();
final NumberAxis rangeAxis2 = new NumberAxis("Escala 2");
rangeAxis2.setAutoRangeIncludesZero(false);
// parent plot...
final CombinedDomainXYPlot plot = new CombinedDomainXYPlot(new NumberAxis("Dominio - Nº de elementos"));
plot.setGap(10.0);
// add the subplots...
plot.add(subplot1, 1);
plot.setOrientation(PlotOrientation.VERTICAL);
// return a new chart containing the overlaid plot...
JFreeChart graf=new JFreeChart("Gráficos",
JFreeChart.DEFAULT_TITLE_FONT, plot, true);
return graf;
}
private XYDataset createDataset1(int linhas, int i_curta, int f_curta, int f_longa, int i_longa, double ewma_b[], double media_longa[], double ewma_a[], double media_curta[], double dados_planilha[]) {
int i; int j;
final XYSeries series1 = new XYSeries("Média Longa");
final XYSeries series2 = new XYSeries("EWMA - Média Longa");
final XYSeries series3 = new XYSeries("Média Curta");
final XYSeries series4 = new XYSeries("EWMA - Média Curta");
//final XYSeries series5 = new XYSeries("Dados reais - Planilha Excel");
for(i = (10 + i_curta); i <= linhas; i++){
series1.add(i , media_longa[i]); // plota grafico de media longa
series2.add(i , ewma_b[i]); // plota grafico ewma de media longa
series3.add(i , media_curta[i]); // plota grafico de media curta
series4.add(i , ewma_a[i]); // plota grafico ewma de media curta
// series5.add(i , dados_planilha[i]); // plota grafico de valores reais da planilha
} // fim do for i
final XYSeriesCollection collection = new XYSeriesCollection();
collection.addSeries(series1);
collection.addSeries(series2);
collection.addSeries(series3);
collection.addSeries(series4);
//collection.addSeries(series5);
return collection;
}
public void windowClosed(WindowEvent event) {
dispose();
}
}
esse arquivo eu usei só pra gerar o grafico, todo o tratamento dos vetores eu fiz em outro arquivo e passei como parametro para esse gerar o grafico;
gerar_graficos grafico = new gerar_graficos("Gráficos - EWMA, Média Longa e Média Curta", linhas, f_longa, i_longa, i_curta, f_curta, ewma_b, media_longa, ewma_a, media_curta, dados_planilha);
grafico.pack();
RefineryUtilities.centerFrameOnScreen(grafico);
grafico.setVisible(true);
dispose();
não sei se sabe, mais vc vai ter a add as bibliotecas no seu java, no netbeans é facil de fazer isso.
T+
Valeu a ajuda! Muito Obrigado!
Mas nao estou percebendo donde voce retira esses dados:
int linhas, int i_curta, int f_curta, int f_longa, int i_longa, double ewma_b[], double media_longa[], double ewma_a[], double media_curta[], double dados_planilha[].
E onde voce os tem armazenados?
Abraço
Valeu a ajuda! Muito Obrigado!Mas nao estou percebendo donde voce retira esses dados:
int linhas, int i_curta, int f_curta, int f_longa, int i_longa, double ewma_b[], double media_longa[], double ewma_a[], double media_curta[], double dados_planilha[].
E onde voce os tem armazenados?
Abraço
Olá,
Isso são variáves q usei no meu programa (int linhas, int i_curta, int f_curta, int f_longa, int i_longa) e isso são os vetores (double ewma_b[], double media_longa[], double ewma_a[], double media_curta[], double dados_planilha[]), então subistitua isso pelas suas variavés que funciona.
T+
Ok Muito Obrigado!!
E Voce tem essas variaveis e esses vectores guardados num ficheiro?
É que no meu caso vou ter que as ter num ficheiro e depois ir ao ficheiro retirar os respectivos valores para construir o grafico!!
Tenho que fazer a chamada do respectivo ficheiro em algum lado?
Abraço
Ok Muito Obrigado!!E Voce tem essas variaveis e esses vectores guardados num ficheiro?
É que no meu caso vou ter que as ter num ficheiro e depois ir ao ficheiro retirar os respectivos valores para construir o grafico!!
Tenho que fazer a chamada do respectivo ficheiro em algum lado?
Abraço
Olá,
Acho q vc não entendeu oq eu quis dizer até agora, então vou por passos.
Seus dados estão em um arquivo do tipo .TXT, então, te recomento duas coisas;
1º. vc faz o acesso direto ao arquivo,
Por exemplo:
um arquivo com 10 valores, um debaixo do outro, vc vai lendo linha a linha;
lendo os dados no arquivo, linha a linha, pega todos os valores, joga num vetor (se vc ja souber a qtdade de linhas vc usa um vetor estatico se vc não souber, usa um vetor dinamico), depois q os seus dados tiverem no vetor, usa akele codigo q te passei pra plotar o grafico. Só lembrando q existem vários tipos de graficos, não sei se akele grafico q te passei é o tipo de grafico q c quer.
então a questão é o inverso dakilo q vc ta achando q é :
“E Voce tem essas variaveis e esses vectores guardados num ficheiro?”
é o contrario, os valores do seu ficheiro q vão ser guardados em variáveis.
T+
Ok Valeu
Muito Obrigado
Ok ValeuMuito Obrigado
De nada, tamos ai pra ajudar, o pessoal daki me ajudou muito, é uma retribuição e boa sorte.
Anderson Dorneles
Cara você faz a chamada do ficheiro de texto nalgum lado?Ou faz um read file ou algo do genero?
Esse ficheiro pode estar armazenado nalgum lado ou tem que tar dentro da pasta do Projecto?
Abraço
Cara você faz a chamada do ficheiro de texto nalgum lado?Ou faz um read file ou algo do genero?Esse ficheiro pode estar armazenado nalgum lado ou tem que tar dentro da pasta do Projecto?
Abraço
Deixa eu ver se entendi vc,
Eu primeiro fiz uma função de leitura, escrita e fechamento do arquivo, por exemplo:
Ler_arquivo(){
abro o arquivo,
Leio o arquivo (linha por linha),
Altero seu conteudo (ou não)
Fecho o arquivo,
}
dai onde eu precisava ler o meu arquivo eu usava a função
eu tenho o codigo completo, mais ta la em casa, me manda outra msg pedindo o arquivo q eu te envio.
Ok Muito Obrigado.
Quando puder me mande o arquivo se faz favor para eu ver.
Abraço.
Ok Muito Obrigado.Essa é a função de leitura do arquivo:Quando puder me mande o arquivo se faz favor para eu ver.
Abraço.
public static void leitura_arquivo_lambida()throws IOException, BiffException{
// Pega o valor lambida do arquivo
String linha;
File arquivo = new File("c:/lambida.txt"); // cria o arquivo chamado lambida.txt em C:/
if (arquivo.exists()){ // se arquivo existir faz ...
try {
FileReader leitura; // Cri ao objeto de leitura
leitura = new FileReader(arquivo); // passa o nome do arquivo (lambida.txt) para o objeto
BufferedReader ler = new BufferedReader(leitura); // cria um buffer pra leitura
try {
while( (linha = ler.readLine()) != null ) // cria um laço para ler o arquivo linha por linha
lambida1 = linha; // Valor inserido no arquivo
lambida = Double.parseDouble(lambida1); // Conversão do valor para Double
//JOptionPane.showMessageDialog(null,"Valor de Lambida " + lambida);
} catch (HeadlessException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}else{
// arquivo não existe
JOptionPane.showMessageDialog(null,"Arquivo lambida.txt não existe ");
}
}
}
[code/]
Função de verificação do arquivo
[code]
public static void verifica_arquivo_lambida() throws IOException, BiffException{
double valor_inicial;
try {
//double valor_inicial = 0.94; // Coloca um valor inicial dentro do arquivo
File arquivo = new File("c:/lambida.txt");
//PrintWriter arquivo = new PrintWriter(arquivo);
//arquivo.print(0.94);
// Cria arquivo se ele não existir
// boolean success = (new File("c:\monografia")).mkdir(); // Tentei aki por o arquivo criado dentro de uma pasta mais não deu certo
boolean success = arquivo.createNewFile(); // função que verifica se o arquivo existe, se não existir
if (success) { //
FileWriter fw; // cria o arquivo
fw = new FileWriter("c:/lambida.txt"); // com o nome lambida.txt
PrintWriter pw = new PrintWriter(fw); // crio objeto de escrita no arquivo
valor_inicial = 0.94; // variavel com um valor inicial
pw.print(valor_inicial); // Grava valor incial no arquivo
pw.close(); // fecha o arquivo
JOptionPane.showMessageDialog(null,"Arquivo lambida.txt criado com sucesso ! " );
} else {
// Arquivo já existe
JOptionPane.showMessageDialog(null,"Arquivo lambida.txt já existe ! " );
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
leitura_arquivo_lambida(); // quando eu precisei ler o arquivo
verifica_arquivo_lambida(); // quando precisei verificar se havia um valor dentro do arquivo (pq não podia ser em branco) e a propria existencia do arquivo.
Espero ter ajudado,
T+
Anderson Dorneles
Ok Valeu, Muito Obrigado.
É nesse ficheiro lambida.txt que voce tem seus dados? E depois como os adiciona no grafico?
Cumprimentos
Ok Valeu, Muito Obrigado.É nesse ficheiro lambida.txt que voce tem seus dados? E depois como os adiciona no grafico?
Cumprimentos
Olá,
Não, meus dados vem de uma planilha do excel, eu guardo nesse ficheiro somente uma variável q uso no meu calculo.
T+
Olá Pessoal…
Eu to usando este DateCell, só que a Data vem cabulosamente cheia de informações (Feb 29…) eu só queria que retornasse do jeito que está na célula (29/02/2007)
tentei como string também, só que ele retorna 29/02/07 ou quando tento usar o simpledateformat ele retorna (0007/02/29).
Alguem ai pode me ajudar?