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.
ficou show will...
ResponderExcluirPor favor me ajude!
ResponderExcluirWilliam, 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....
Olá Gabriel, você importou a lib nanoxml ?
ResponderExcluirhttp://devkix.com/nanoxml.php
Favor, disponibilize o link para download no corpo da explicação, e coloque essa lib como sendo pré requisito.
ResponderExcluirGabriel, por favor, nos mantenha informado sobre seu problema, e de preferencia adicione nosso blog aos seus favoritos. xD
abaixo do código existe o seguinte texto: dependências: nanoxml.jar, commons-logging. Cada dependência é um link para baixar os arquivos.
ResponderExcluirOlá! Tive o mesmo erro que o gabriel, importeei os jars, importei as dependencias tbm..
ResponderExcluirse puderem me ajudar..
É só trocar isso AggregateUnmarshaller a = new AggregateUnmarshaller(ResponseEnvelope.class)
Excluirpor isso
AggregateUnmarshaller a = new AggregateUnmarshaller(ResponseEnvelope.class);
Este comentário foi removido pelo autor.
ResponderExcluirBoa tarde amigos.
ResponderExcluirTive 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?
Gostaria de saber como realizar a exportação nesse formato? Algum exemplo?
ResponderExcluirParabéns pelo post.
ResponderExcluirImplementei 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?
Estou enfrentando este problema agora, conseguiu resolver Duilio?
ResponderExcluirPosta o código e a dúvida, fica mais fácil para ajudar.
ExcluirAqui todos os caracteres especiais viram um sinal de ?... Ai acontece o mesmo?
ResponderExcluirProvavelmente seu arquivo OFX está em uma codificação e o programa que está lendo esse arquivo está em outra.
ExcluirTerá 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.
Excelente. Muito útil. Obrigado.
ResponderExcluirEste comentário foi removido pelo autor.
ResponderExcluireste 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É possível colocar um exemplo utilizando a biblioteca atual (2.2.3) ?
ResponderExcluirMuito obrigado! serviu 100% para o meu codigo! thanks a lot!
ResponderExcluirFuncionou perfeitamente :)
ResponderExcluirEste comentário foi removido pelo autor.
ExcluirAtualizei o código e coloquei as dependências atualizadas, quem precisar só acessar https://github.com/rvidalgit/utils/blob/master/Java/leitorOfx.java
Excluir// 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
// https://mvnrepository.com/artifact/org.javassist/javassist - Versão: 3.26.0-GA
Excluir// 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
Como mostrar as informações do OFX em UTF-8?
ResponderExcluir