Dúvidas sobre Computação ?
Vamos tentar tirar dúvidas e trocar conhecimento com todos, sobre qualquer assunto relacionado a computação

segunda-feira, 23 de agosto de 2010

Lendo Arquivo OFX com ofx4j

Neste post vamos aprender a ler OFX (Open Financial Exchange, que é uma especificação unificada para a troca eletrônica de dados financeiros entre as instituições financeiras, empresas e consumidores através da Internet) utilizando a biblioteca ofx4j disponibilizada aqui.


Após transformar o ofx em objeto no java você pode navegar nas tags do arquivo, porém, achei uma falha na biblioteca, não consigo acessar diretamente a tag e o resto de sua hierarquia, mas é justamente dentro dessa tag que está as transações (que, teoricamente é o que importa para nós), desse modo tive que "pegar no braço" esse objeto com a lista de transações.


Abaixo o código exemplo:


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import net.sf.ofx4j.domain.data.MessageSetType;
import net.sf.ofx4j.domain.data.ResponseEnvelope;
import net.sf.ofx4j.domain.data.ResponseMessageSet;
import net.sf.ofx4j.domain.data.banking.BankStatementResponse;
import net.sf.ofx4j.domain.data.banking.BankStatementResponseTransaction;
import net.sf.ofx4j.domain.data.banking.BankingResponseMessageSet;
import net.sf.ofx4j.domain.data.common.Transaction;
import net.sf.ofx4j.domain.data.signon.SignonResponse;
import net.sf.ofx4j.io.AggregateUnmarshaller;
import net.sf.ofx4j.io.OFXParseException;

public class Main {

public static void main(String[] args) throws IOException, OFXParseException {
AggregateUnmarshaller a = new AggregateUnmarshaller(ResponseEnvelope.class);
ResponseEnvelope re = a.unmarshal(new FileInputStream(new File(System.getProperty("user.home") + "/Desktop/teste.ofx")));

//objeto contendo informações como instituição financeira, idioma, data da conta.
SignonResponse sr = re.getSignonResponse();

//como não existe esse get "BankStatementResponse bsr = re.getBankStatementResponse();"
//fiz esse codigo para capturar a lista de transações
MessageSetType type = MessageSetType.banking;
ResponseMessageSet message = re.getMessageSet(type);

if (message != null) {
List bank = ((BankingResponseMessageSet) message).getStatementResponses();
for (BankStatementResponseTransaction b : bank) {
System.out.println("cc: " + b.getMessage().getAccount().getAccountNumber());
System.out.println("ag: " + b.getMessage().getAccount().getBranchId());
System.out.println("balanço final: " + b.getMessage().getLedgerBalance().getAmount());
System.out.println("dataDoArquivo: " + b.getMessage().getLedgerBalance().getAsOfDate());
List list = b.getMessage().getTransactionList().getTransactions();
System.out.println("TRANSAÇÕES\n");
for (Transaction transaction : list) {
System.out.println("tipo: " + transaction.getTransactionType().name());
System.out.println("id: " + transaction.getId());
System.out.println("data: " + transaction.getDatePosted());
System.out.println("valor: " + transaction.getAmount());
System.out.println("descricao: " + transaction.getMemo());
System.out.println("");
}
}
}
}
}

dependências: nanoxml.jar, commons-logging.


e é isso, até a próxima.

25 comentários:

  1. Por favor me ajude!

    William, não consegui implementar o codigo acima, o mesmo apresenta um erro no código
    ResponseEnvelope re = a.unmarshal(new FileInputStream(new File(System.getProperty("user.home") + "/Desktop/teste.ofx")));

    Para poder rodar o codigo eu tive que adicionar um cast (ResponseEnvelope), mas mesmo assim ocorre o seguinte problema.
    Exception in thread "main" java.lang.NoClassDefFoundError: net/n3/nanoxml/XMLParseException
    at net.sf.ofx4j.io.AggregateUnmarshaller.newReader(AggregateUnmarshaller.java:80)
    at net.sf.ofx4j.io.AggregateUnmarshaller.unmarshal(AggregateUnmarshaller.java:42)
    at ofxRead.main(ofxRead.java:23)
    Caused by: java.lang.ClassNotFoundException: net.n3.nanoxml.XMLParseException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 3 more

    Muito obrigado....

    ResponderExcluir
  2. Olá Gabriel, você importou a lib nanoxml ?
    http://devkix.com/nanoxml.php

    ResponderExcluir
  3. Favor, disponibilize o link para download no corpo da explicação, e coloque essa lib como sendo pré requisito.

    Gabriel, por favor, nos mantenha informado sobre seu problema, e de preferencia adicione nosso blog aos seus favoritos. xD

    ResponderExcluir
  4. abaixo do código existe o seguinte texto: dependências: nanoxml.jar, commons-logging. Cada dependência é um link para baixar os arquivos.

    ResponderExcluir
  5. Olá! Tive o mesmo erro que o gabriel, importeei os jars, importei as dependencias tbm..
    se puderem me ajudar..

    ResponderExcluir
    Respostas
    1. É só trocar isso AggregateUnmarshaller a = new AggregateUnmarshaller(ResponseEnvelope.class)
      por isso
      AggregateUnmarshaller a = new AggregateUnmarshaller(ResponseEnvelope.class);

      Excluir
  6. Este comentário foi removido pelo autor.

    ResponderExcluir
  7. Boa tarde amigos.
    Tive um problema para ler um arquivo OFX, pois o arquivo foi gerado direto pelo BB porem um pouco fora das especificações, com isso identifiquei que o arquivo continha no inicio um espaço e outro mais, e não continha entre tag a tabulação correta.
    ALguem ja passou por isso?

    ResponderExcluir
  8. Gostaria de saber como realizar a exportação nesse formato? Algum exemplo?

    ResponderExcluir
  9. Parabéns pelo post.
    Implementei e adaptei ao meu aplicativo, funcionou corretamente.
    Contudo percebi que em alguna casos, o arquivo ofx traz o campo com "," ao invéz de ".", nesses casos a importação apresenta o erro:
    "Unable to set element 'TRNAMT' (property 'amount' of aggregate net.sf.ofx4j.domain.data.common.Transaction)
    java.lang.NumberFormatException:"

    Alguém já passou por isso?

    ResponderExcluir
  10. Estou enfrentando este problema agora, conseguiu resolver Duilio?

    ResponderExcluir
    Respostas
    1. Posta o código e a dúvida, fica mais fácil para ajudar.

      Excluir
  11. Aqui todos os caracteres especiais viram um sinal de ?... Ai acontece o mesmo?

    ResponderExcluir
    Respostas
    1. Provavelmente seu arquivo OFX está em uma codificação e o programa que está lendo esse arquivo está em outra.
      Terá que ler o arquivo usando o charset adequado e, após isso, converter usando o charset que seu programa está usando.
      Exemplo:

      def f = myInFile.getText('ISO-8859-1') //Arquivo estava com esse charset ISO...
      myInFile.write(f, 'UTF-8') // Li com o charset origem e escrevi no mesmo arquivo usando o charset do sistema.

      Excluir
  12. Este comentário foi removido pelo autor.

    ResponderExcluir
  13. este codigo funciona com alguma alterracoes feitas pelo compilador, porem na versao mais atual (1.8)do ofx4j esse codigo nao funciona, comigo funcinou aversao 1.3 (que parece ser a mesma utilizado pelo autor.)

    ResponderExcluir
  14. É possível colocar um exemplo utilizando a biblioteca atual (2.2.3) ?

    ResponderExcluir
  15. Muito obrigado! serviu 100% para o meu codigo! thanks a lot!

    ResponderExcluir
  16. Respostas
    1. Este comentário foi removido pelo autor.

      Excluir
    2. Atualizei o código e coloquei as dependências atualizadas, quem precisar só acessar https://github.com/rvidalgit/utils/blob/master/Java/leitorOfx.java

      // https://mvnrepository.com/artifact/org.javassist/javassist 3.26.0-GA
      // https://mvnrepository.com/artifact/org.reflections/reflections 0.9.11
      // https://mvnrepository.com/artifact/commons-logging/commons-logging 1.2
      // https://mvnrepository.com/artifact/be.cyberelf.nanoxml/nanoxml 2.2.3
      // https://mvnrepository.com/artifact/com.webcohesion.ofx4j/ofx4j 1.17
      // https://mvnrepository.com/artifact/com.google.guava/guava 28.1-jre

      Excluir
    3. // https://mvnrepository.com/artifact/org.javassist/javassist - Versão: 3.26.0-GA
      // https://mvnrepository.com/artifact/org.reflections/reflections - Versão: 0.9.11
      // https://mvnrepository.com/artifact/commons-logging/commons-logging - Versão: 1.2
      // https://mvnrepository.com/artifact/be.cyberelf.nanoxml/nanoxml - Versão: 2.2.3
      // https://mvnrepository.com/artifact/com.webcohesion.ofx4j/ofx4j - Versão: 1.17
      // https://mvnrepository.com/artifact/com.google.guava/guava - Versão: 28.1-jre

      Excluir
  17. Como mostrar as informações do OFX em UTF-8?

    ResponderExcluir