Ler de planilha no Excel e passar para Banco de Dados

36 respostas
P

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,

36 Respostas

Pedrosa

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

P

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.

isneiqui

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

P

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?

P

Hehe… Novato é soda.

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

Valeu.

David

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.

P

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

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>

P

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

:smiley: :lol: :smiley: :lol: :smiley: :lol:

bebad

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

A

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

L

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

Float.parseFloat(celula)

ou

Double.parseDouble(celula)

resolve o seu problema

[]'s

A

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,3at 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

L

anderline27:
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,3at 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

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:

  1. Alterar a sua planilha do excel para usar “.”

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

A

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

A

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

B

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?? :frowning:

A

BrunoNave:
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?? :frowning:

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+

B

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 :frowning:

Alguem me pode ajudar??

A

BrunoNave:
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 :frowning:

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+

B

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 :frowning: 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

A

BrunoNave:
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 :frowning: 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

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+

B

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

A

BrunoNave:
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+

B

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

A

BrunoNave:
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+

B

Ok Valeu

Muito Obrigado

A

BrunoNave:
Ok Valeu

Muito Obrigado

De nada, tamos ai pra ajudar, o pessoal daki me ajudou muito, é uma retribuição e boa sorte.

Anderson Dorneles

B

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

A

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

B

Ok Muito Obrigado.

Quando puder me mande o arquivo se faz favor para eu ver.

Abraço.

A
BrunoNave:
Ok Muito Obrigado.

Quando puder me mande o arquivo se faz favor para eu ver.

Abraço.

Essa é a função de leitura do arquivo:
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();
        }
    }
dai depois de criar essas duas funções, eu usei elas no meu programa:

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

B

Ok Valeu, Muito Obrigado.

É nesse ficheiro lambida.txt que voce tem seus dados? E depois como os adiciona no grafico?

Cumprimentos

A

BrunoNave:
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+

P

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?

Criado 28 de abril de 2006
Ultima resposta 24 de set. de 2012
Respostas 36
Participantes 9