Relatório com IReport [RESOLVIDO]

40 respostas
B

Olá galera
Eu pesquisei, pesquisei e não entedi =/
Tipo eu jah fiz o relatório no IReport, jah criei o .jasper dele e o .jrxml, ele funcionou normal

Mas eu não sei como eu chamo esse relatório pela minha aplicação
Tipo colocar um evento em algum botão e aparecer o relatório

Como eu chamo o relatório jasper no Java?

Atenciosamente

40 Respostas

T

brunorota:
Olá galera
Eu pesquisei, pesquisei e não entedi =/
Tipo eu jah fiz o relatório no IReport, jah criei o .jasper dele e o .jrxml, ele funcionou normal

Mas eu não sei como eu chamo esse relatório pela minha aplicação
Tipo colocar um evento em algum botão e aparecer o relatório

Como eu chamo o relatório jasper no Java?

Atenciosamente

Tem que importar o .JAR do Jasper para sua aplicação, ele contem os métodos que necessita ser implementado…

Ai você manda o resultset e hashmap por parâmetro para o Jrxml que vai gerar o relatório para você.

T

Exemplo:

JRResultSetDataSource ds = new JRResultSetDataSource(resultSet); JasperPrint jp = JasperFillManager.fillReport("CAMINHO DO JRXML", hashMap, ds); JasperViewer.viewReport(jp, false);

B

Eu fiz assim

Deu erro

package Teste;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;

import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

import database.classes.ConnectionDB;

public class RelatorioTeste {
	
	public void chamRelatório(){
		
		HashMap hashMap = new HashMap();
		
		String sql = "SELECT nomeEClusa FROM eclusas";
		
		try{
			Connection conn = ConnectionDB.getConnection();
			Statement stm = conn.createStatement();
			ResultSet rset = stm.executeQuery(sql);
		
		JRResultSetDataSource ds = new JRResultSetDataSource(rset);  
        JasperPrint jp = JasperFillManager.fillReport("classic.jrxml", hashMap, ds);  
        JasperViewer.viewReport(jp, false);
	
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public static void main(String args[]){
		
		RelatorioTeste teste = new RelatorioTeste();
		
		teste.chamRelatório();
	}
}
o erro
net.sf.jasperreports.engine.JRException: Error loading object from file : classic.jrxml
	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:92)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:515)
	at Teste.RelatorioTeste.chamRelatório(RelatorioTeste.java:29)
	at Teste.RelatorioTeste.main(RelatorioTeste.java:41)
Caused by: java.io.StreamCorruptedException: invalid stream header: 3C3F786D
	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
	at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:87)
	... 3 more

O .jrxml e o .jasper estão na pasta do projeto

T

Verifique seu arquivo jasper, se esta recebendo exatamente os tipos de arquivos que está enviando no java… Esse erro ta estranho, olha a quantidade de campos do relatório e da uma reconferida nessa sintaxe SQL acho que esta errada

T

Cade o resto??? Só tem 1 campo teu relatório??? Apenas 1 tabela???

C

Não Teria que importar o pacote abaixo:

import net.sf.jasperreports.engine.util

Cordialmente;

T

claupers:
Não Teria que importar o pacote abaixo:

import net.sf.jasperreports.engine.util

Cordialmente;

Não necessariamente caro amigo,

Pode se importar os seguintes pacotes:

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

Att. Jonas

B

Ola pessoal

Eh eu estou fazendo o relatório com apenas um campo mesmo, é mais para testar sabe, só estou listando o nome das eclusas da minha tabela eclusas, primeiro vou fazer o teste assim pra eu ver como funciona depois eu faço o relatório de verdade

A sql está correta, e são os mesmos campos que tem o relatório que eu criei

O que será que está errado?

B

Tipo o meu relatório tem uma expressão que coloca a data e tals, isso não tem nada a ver com o erro neh?

Mas campos no relatório com dados do banco de dados é soh o nomeEclusa da tabela eclusas mesmo

T

Amigo, chama-se testes… Tentativa e erro. Tire tudo e deixe apenas 1 campo. apartir daí você vai saber oque pode estar acontecendo

B

Bom não eh isso, tirei os campos de data e hora e deu o mesmo erro =/

Você não tem algum exemplo de relatório ae que funciona pra eu tenta compilar aqui?

T

brunorota:
Bom não eh isso, tirei os campos de data e hora e deu o mesmo erro =/

Você não tem algum exemplo de relatório ae que funciona pra eu tenta compilar aqui?

Amigo teste esse código abaixo para o CAMINHO do jasper.

String caminhoRelatorio= "TESTE.jasper"; InputStream Caminho = getClass().getResourceAsStream( "/" + caminhoRelatorio);

Testa esse código ai.

B

olá

Eu testei e deu esse erro
java.lang.NullPointerException
	at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2266)
	at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279)
	at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)
	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
	at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:191)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:580)
	at Teste.RelatorioTeste.chamRelatório(RelatorioTeste.java:35)
	at Teste.RelatorioTeste.main(RelatorioTeste.java:47)
O código ficou assim
public class RelatorioTeste {
	
	public void chamRelatório(){
		
		HashMap hashMap = new HashMap();
		
		String sql = "SELECT nomeEclusa FROM eclusas";
		
		try{
			Connection conn = ConnectionDB.getConnection();
			Statement stm = conn.createStatement();
			ResultSet rset = stm.executeQuery(sql);
		
			
		String caminhoRelatorio= "classic.jasper";      
        InputStream Caminho = getClass().getResourceAsStream(  
                    "/" + caminhoRelatorio);  
			
		JRResultSetDataSource ds = new JRResultSetDataSource(rset);  
        JasperPrint jp = JasperFillManager.fillReport(Caminho, hashMap, ds);  
        JasperViewer.viewReport(jp, false);
	
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public static void main(String args[]){
		
		RelatorioTeste teste = new RelatorioTeste();
		
		teste.chamRelatório();
	}
}
e mudando o nome do caminho para TESTE.jasper aconteceu o seguinte erro
java.lang.NullPointerException
	at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2266)
	at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279)
	at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)
	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
	at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:191)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:580)
	at Teste.RelatorioTeste.chamRelatório(RelatorioTeste.java:35)
	at Teste.RelatorioTeste.main(RelatorioTeste.java:47)

Não tenho noção doke está acontecendo o0

Obrigado TheKill pela atenção dada ao tópico ^^

T

TheKill:
brunorota:
Bom não eh isso, tirei os campos de data e hora e deu o mesmo erro =/

Você não tem algum exemplo de relatório ae que funciona pra eu tenta compilar aqui?

Amigo teste esse código abaixo para o CAMINHO do jasper.

String caminhoRelatorio= "TESTE.jasper"; InputStream Caminho = getClass().getResourceAsStream( "/" + caminhoRelatorio);

Testa esse código ai.

Amigo so uma correção, tente desta forma abaixo:

String caminhoRelatorio= "C:/DIRETORIO/NOME_DO_ARQUIVO.jasper"; InputStream Caminho = getClass().getResourceAsStream( "/" + caminhoRelatorio);

Aguardo seu retorno

B

soh uma observação

tipo o caminho não deve ser assim?
String caminhoRelatorio= "C:\DIRETORIO\NOME_DO_ARQUIVO.jasper";   
            InputStream Caminho = getClass().getResourceAsStream(  
                    "/" + caminhoRelatorio);

com as barras invertidas?

T
brunorota:
soh uma observação tipo o caminho não deve ser assim?
String caminhoRelatorio= "C:\DIRETORIO\NOME_DO_ARQUIVO.jasper";   
            InputStream Caminho = getClass().getResourceAsStream(  
                    "/" + caminhoRelatorio);

com as barras invertidas?

Não.

Existe duas formas de expecificar o caminho. 1º
String caminho = "C:\\pasta\\arquivo.ext";
String caminho = "C:/pasta/arquivo.ext";
B

ficou assim, eu copiei o .jasper e o .jrxml pro Desktop e o código ficou assim

String caminhoRelatorio= "C:/Documents and Settings/Administrador/Desktop/classic.jasper"; InputStream Caminho = getClass().getResourceAsStream( "/" + caminhoRelatorio);

e deu o seguinte erro

java.lang.NullPointerException at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2266) at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279) at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750) at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280) at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:191) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:580) at Teste.RelatorioTeste.chamRelatório(RelatorioTeste.java:35) at Teste.RelatorioTeste.main(RelatorioTeste.java:47)

T

Amigo o problema esta no seu relatório.

Tem algo errado no seu relatório, NullPointerException

B

Vixi o0

Eh q eu compilo ele e ele roda normal no IReport

Vc tem o IReport instalado na sua máquina?

Pq ae eu mandava pra ti o .jrxml pra vc, se não for mto trabalho pra ti é claro

T

Ter eu tenho, mas nao tenho sua base de dados.

E também estou em serviço né hehe…

Mas se quiser pode mandar, posso dar uma olhada rápida.

E-mail: [email removido]

Att. Jonas

B

hehehe valew

Eu vou passar a base de dados tbm caso vc tenha o mysql instalado ^^

Muito obrigado pela ajuda

T

Nao tenho, trabalho com Firebird

T

Conseguiu resolver o problema caro amigo?

Se sim, seria legal renomear o topico para Resolvido …

Já abri umas 4x esse topico rsrsrs

B

consegui nada TheKill

Eu mandei um e-mail pra vc, vou digitar o que eu mandei pra vc aki

Tipo eu peguei um tutorial e fiz isso
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;

public class RelatorioTeste {
	private static final String url = "jdbc:mysql://localhost/banco_eclusas";
	private static final String driver = "com.mysql.jdbc.Driver";
	private static final String login = "root";
	private static final String pwd = "root";
   
	public RelatorioTeste() {
	}
   
	public void gerar( String jasperFile ) throws JRException , SQLException, ClassNotFoundException {

		Class.forName( driver );
		Connection con = DriverManager.getConnection( url , login , pwd );
		Statement stm = con.createStatement();
		String query = "select nomeEclusa from eclusas";
		ResultSet rs = stm.executeQuery( query );

		//implementação da interface JRDataSource para DataSource ResultSet
		JRResultSetDataSource jrRS = new JRResultSetDataSource( rs );
   
		//executa o relatório
		Map parametros = new HashMap();
		//parametros.put("nota", new Double(10));

		/* Preenche o relatório com os dados. Gera o arquivo BibliotecaPessoal.jrprint    */
		JasperFillManager.fillReportToFile( jasperFile, parametros, jrRS );
		
		/* Exporta para o formato PDF */
		JasperExportManager.exportReportToPdfFile( "classic.jrprint" );
	}
   
	public static void main(String[] args) {
		try {
			new RelatorioTeste().gerar( "classic.jasper" );
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
compilei e deu o seguinte erro
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
	at net.sf.jasperreports.engine.fill.JRBaseFiller.<clinit>(JRBaseFiller.java:96)
	at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:147)
	at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:83)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
	at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:492)
	at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:448)
	at Teste.RelatorioTeste.gerar(RelatorioTeste.java:42)
	at Teste.RelatorioTeste.main(RelatorioTeste.java:50)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
	... 8 more
o erro acontece quando chega nessa linha
/* Preenche o relatório com os dados. Gera o arquivo BibliotecaPessoal.jrprint    */
		JasperFillManager.fillReportToFile( jasperFile, parametros, jrRS );

eu não sei oq está acontecendo

Pra q serve o HashMap q eu passo como parâmetro?

T

Exato.

HashMap serve para quando vc estiver usando parametros no seu relatório.

exemplo: $P{cor}

no java:

String cor=red;

HashMap h = new HashMap();

h.put(cor);
T

Cerfique-se que esteja utilizando o library correto do iReport. no meu eu utilizo o jasperreports-3.5.3.jar
e Tambem necessita de outros Jars.

Vou colocar os nomes e você adiciona no projeto:
commons-beanutils-1.8.0.jar
commons-collections-3.2.1.jar
commons-digester-1.7.jar
commons-javaflow-20060411.jar
commons-logging-1.1.jar
jasperreports-3.5.3.jar
iText-2.1.0.jar

T
brunorota:
# Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
Provavel que esteja sem a library commons.logging ...

Verifique

B

Bom nos libraies tem o jasperReport3.0.jar, o mysqlConector.jar e a library do java 1.6

Tem q ter mais algumas?

T

Sim, veja oque falei anteriormente…

TheKill:
Cerfique-se que esteja utilizando o library correto do iReport. no meu eu utilizo o jasperreports-3.5.3.jar
e Tambem necessita de outros Jars.

Vou colocar os nomes e você adiciona no projeto:
commons-beanutils-1.8.0.jar
commons-collections-3.2.1.jar
commons-digester-1.7.jar
commons-javaflow-20060411.jar
commons-logging-1.1.jar
jasperreports-3.5.3.jar
iText-2.1.0.jar

B

Onde eu baixo esses jars?

T

Na pasta de instalação do JasperSoft…
\Ireport\ireport\modules\ext

Tem todos os Jars… Localize os nomes que falei e importe no projeto

B

AEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

DEU CERTOOO ^^

Ow valew mesmo TheKill, muito obrigado, sou muito grato a vc kra

Precisar de alguma coisa, alguma ajuda é soh pedir

Muito obrigado mesmo, foi soh importar as bibliotecas ^^

Tipo mais agora como q eu faço pra aparece na tela jah, pq ali ele gerou um pdf na pasta do projeto
qual é o comando pra aparecer na tela?

Obrigado

T

JasperViewer.viewReport(jp, false);

Testa ae!! Foi nada não… Precisar estamos ae

B

JasperPrint jp = JasperFillManager.fillReport("teste.jasper", parametros, jrRS); JasperViewer.viewReport(jp, false);

Coloquei esse código e aparecer q o documento não contém páginas, oq aconteceu?

T

brunorota:
JasperPrint jp = JasperFillManager.fillReport("teste.jasper", parametros, jrRS); JasperViewer.viewReport(jp, false);

Coloquei esse código e aparecer q o documento não contém páginas, oq aconteceu?

É este é um erro comum… tem que dar uma analisada … Pode ser varias coisas…

Mas eu penso que é na transmissão dos dados para o relatório…

Voce ta passando por HashMap ou SQL ?

Se for HashMap tem que colocar os atributos no relatório do tipo $P{atributo}

E se for SQL no relatorio tem que ser $F{NOME_DO_CAMPO_NA_TABELA}

B

é por sql

e no relatório já está $F{nome} que é o nome do campo da tabela no banco

o código é esse, o pdf gerou normal
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

public class RelatorioTeste {
	private static final String url = "jdbc:mysql://127.0.0.1/teste";
	private static final String driver = "com.mysql.jdbc.Driver";
	private static final String login = "root";
	private static final String pwd = "root";
   
	public RelatorioTeste() {
	}
   
	public void gerar( String jasperFile ) throws JRException , SQLException, ClassNotFoundException {

		Class.forName( driver );
		Connection con = DriverManager.getConnection( url , login , pwd );
		Statement stm = con.createStatement();
		String query = "select * from turma";
		ResultSet rs = stm.executeQuery( query );

		//implementação da interface JRDataSource para DataSource ResultSet
		JRResultSetDataSource jrRS = new JRResultSetDataSource( rs );
   
		//executa o relatório
		Map parametros = new HashMap();
		//parametros.put("nota", new Double(10));

		/* Preenche o relatório com os dados. Gera o arquivo BibliotecaPessoal.jrprint    */
		JasperFillManager.fillReportToFile( jasperFile, parametros, jrRS );
  
		/* Exporta para o formato PDF */
		JasperExportManager.exportReportToPdfFile( "teste.jrprint" );
		
		JasperPrint jp = JasperFillManager.fillReport("teste.jasper", parametros, jrRS);    
        JasperViewer.viewReport(jp, false);  
	}
   
	public static void main(String[] args) {
		try {
			new RelatorioTeste().gerar( "teste.jasper" );
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

att

T

Uma pergunta,

Você quer que gere automaticamente o PDF no HD???

Ou ele salva o PDF se ele quiser?!

Se for pra salvar Opcionalmente retire a linha

//Exporta para o formato PDF */  
JasperExportManager.exportReportToPdfFile( "teste.jrprint" );
T

Se a parte de código que comentei anteriormente nao funcionou…

Faça o seguinte teste:

/* Preenche o relatório com os dados. Gera o arquivo BibliotecaPessoal.jrprint    */
//JasperFillManager.fillReport(jasperFile, parametros, jrRS);   

/* Exporta para o formato PDF */  
//JasperExportManager.exportReportToPdfFile( "teste.jrprint" );  

JasperPrint jp = JasperFillManager.fillReport(jasperFile, parametros, jrRS);      
JasperViewer.viewReport(jp, false);
B

Opa
Testei aki deu certinho TheKill

Vc me ajudou bastante mesmo, muito obrigado, agora que eu tenho a formulá vou bolar o relatório que eu preciso fazer ^^

Qualquer problema que eu não conseguir resolver de jeito nenhum eu posto outro tópico

Muito obrigado mesmo TheKill ^^

Atenciosamente

Bruno Rota Sargi

T

Opa nao foi nada hehe

Att. Jonas

Criado 13 de outubro de 2009
Ultima resposta 16 de out. de 2009
Respostas 40
Participantes 3