Jasper + List de Objetos [RESOLVIDO]

14 respostas
L

Pessoal Boa noite, estou abrindo aqui um tópico provavelmente já deve ter mais sobre o assunto, desde já desculpe-me pela ambiguidade do assunto!!
É o seguinte estou precisando utilizar o Jasper em um projeto para faculdade, nunca tinha mexido com a ferramenta e ai dei uma pesquisada e percebi um pessoal usando o IReport com as SQL, ou seja estão descentralizando do DAO, não gostando disto venho lhes pedir uma alternativa a isto, ou seja para mim a melhor solução seria poder passar para o Jasper apenas uma lista de objetos e ele apenas gerar o PDF desta lista, eu construo o Relatório com Referencia a lista que ele vai receber, mas apenas isto!!!
A todos os Possíveis colaboradores muito obrigado!!!

14 Respostas

F
// Use o seu DAO para efetuar a pesquisa e criar a lista de Beans
List<SeuBean> beanCollection = seuDAO.select(...);

// Datasource para o relatório criado a partir de uma lista de Beans
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(beanCollection);

// O relatório será preenchido usando o DataSource criado anteriormente. Você poderá fazer este passo usando outras 
// alternativas disponibilizadas pelo JasperReports. Este é só um exemplo. O importante, na sua situação, é passar o 
// DataSource criado a partir da lista de Beans
jasperPrint = JasperFillManager.fillReport(jasperReport, params, ds);

Obs.: No relatório você deve usar os atributos do seu Bean nos elementos Field. Ex:

class Cliente {
   String nome;
   Endereco endereco;

    get ...
    set ...
}

class Endereco {
   String nomeRua;
   int numero;
   get...
   set...
}
No relatório você deve referenciar a os atributos dos beans nas expressões do elementos Field:

"nome"
"endereco.numero"
"endereco.nomeRua"

L

fbcarvalho, muito obrigado!!!
Pesquisando um pouco achei http://www.furutani.com.br/2009/02/usando-o-jrbeancollectiondatasource/
Sei que e’ coisa de novato kkk, mas estou com um nullPoiter aqui e nao to achando o porque.
Basicamente estou trazendo uma lista que nao esta nula e tentando fazer os procedimentos, chega em impressao = JasperFillManager.fillReport(relJasper, parametros, ds); ai para.

public void geraRelatorio() throws Exception {
		AlunoDelegate alunoDelegate = new AlunoDelegate();
		List<AlunoVO> listaAlunos = alunoDelegate.filtrarTodos(new AlunoVO());

		HashMap parametros = new HashMap();
		String caminhoRelJasper = "c://Alunos.jasper";

		// Stream com o .jasper
		InputStream relJasper = getClass()
				.getResourceAsStream(caminhoRelJasper);

		// Datasource para o relatório criado a partir de uma lista de Beans
		JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(
				listaAlunos);

		JasperPrint impressao = null;

		try {
			impressao = JasperFillManager.fillReport(relJasper, parametros, ds);
			JasperViewer viewer = new JasperViewer(impressao, true);
			viewer.setVisible(true);
		} catch (JRException e) {
			System.out.println(e.getMessage());
		}
	}

Outra Duvida, no IReport tenho que mexer e mais alguma coisa alem de Language Java ???

F

Poste o stacktrace para que eu possa visualizar melhor o erro.

L

Esta falando do meu InputStream mas eu tenho em c: o Alunos.jasper.

Exception in thread main java.lang.NullPointerException

at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2264)

at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2277)

at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2748)

at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)

at java.io.ObjectInputStream.(ObjectInputStream.java:280)

at net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream.(ContextClassLoaderObjectInputStream.java:53)

at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:200)

at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:603)

at br.projetofatec.Reports.TesteGUJ.geraRelatorio(TesteGUJ.java:38)

at br.projetofatec.Reports.TesteGUJ.main(TesteGUJ.java:48)
F

Use :

ao invés de:

L
String caminhoRelJasper = "/Alunos.jasper";  
  
        // Stream com o .jasper  
        InputStream relJasper = getClass()  
                .getResourceAsStream(caminhoRelJasper);

Nada tentei c:\alunos.jaspr \alunos.jasper kkk nada
relJasper continua vindo nulo!!!

javer

Tá meio esquisito como você tá chamando o arquivo compilado.

Olha só eu tenho os seguintes pacotes:
emissor
emissor.report
emissor.report.src // aqui ficam os meus relatorios compilados, os arquivos .jasper
No pacote emissor eu tenho uma classe Main.class:
package emissor;

/**
 *
 * @author Francisco
 */
public class Main {
...
Para chamar os .jasper de qualquer lugar no meu sistema eu apenas faço isso:
InputStream is = Main.class.getResourceAsStream("report/src/LISTA_CLIENTES.jasper");
Não tem erro, isso funciona certinho.
L
String caminhoRelJasper = "br/projetofatec/reports/alunos.jasper";

Coloquei assim agora na mesma pasta. Mesmo assim nao funcionou!!! k zica hen!!

furutani

Olá

Muito estranho não funcionar usando o caminho absoluto. Verificou se não está digitando algo errado, como por exemplo letras minúsculas no lugar de maiúsculas?

L

Sim sim garantido estou digitando certo. Repara que na primeira vez que era no c://Alunos.jasper agora e’ alunos.jasper para nao ter problemas eu recriei o jasper com outro nome!!!
mas mesmo assim nao vai…

javer

O que você precisa é colocar mais código aqui, visualizando o código a gente pode ver algo que você não vê (isso acontece com todo mundo), mande mais código, se puder mande o jxml também.

L

Javer muito obrigado pela ajuda então ai vai!!

Meu AlunoVo:

public class AlunoVO {
	
	private Long id;
	private String nome;
	private String cpf;
	private String telefone;
	private String status;
	private EnderecoVO endereco;

// GET SET ...
}

ai tem o meu teste jasper que somente muda o endereco do jasper em relacao ao codigo acima.

package br.projetofatec.reports;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;
import br.projetofatec.Delegate.AlunoDelegate;
import br.projetofatec.VO.AlunoVO;

public class TesteGUJ {

	@SuppressWarnings("unchecked")
	public void geraRelatorio() throws Exception {
		AlunoDelegate alunoDelegate = new AlunoDelegate();
		List<AlunoVO> listaAlunos = alunoDelegate.filtrarTodos(new AlunoVO());

		HashMap parametros = new HashMap();
		String caminhoRelJasper = "br/projetofatec/reports/alunos.jasper";

		// Stream com o .jasper
		InputStream relJasper = getClass()
				.getResourceAsStream(caminhoRelJasper);

		// Datasource para o relatório criado a partir de uma lista de Beans
		JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(
				listaAlunos);

		JasperPrint impressao = null;

		try {
			impressao = JasperFillManager.fillReport(relJasper, parametros, ds);
			JasperViewer viewer = new JasperViewer(impressao, true);
			viewer.setVisible(true);
		} catch (JRException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws Exception {
		TesteGUJ guj = new TesteGUJ();
		guj.geraRelatorio();
	}
}

e por ultimo o alunos.jrxml

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="alunos" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
	<property name="ireport.zoom" value="1.0"/>
	<property name="ireport.x" value="0"/>
	<property name="ireport.y" value="0"/>
	<field name="nome" class="java.lang.String"/>
	<field name="endereco.cep" class="java.lang.String"/>
	<background>
		<band splitType="Stretch"/>
	</background>
	<title>
		<band height="79" splitType="Stretch"/>
	</title>
	<pageHeader>
		<band height="35" splitType="Stretch"/>
	</pageHeader>
	<columnHeader>
		<band height="61" splitType="Stretch"/>
	</columnHeader>
	<detail>
		<band height="125" splitType="Stretch">
			<textField>
				<reportElement x="17" y="0" width="100" height="20"/>
				<textElement/>
				<textFieldExpression class="java.lang.String"><![CDATA[$F{nome}]]></textFieldExpression>
			</textField>
			<textField>
				<reportElement x="154" y="0" width="100" height="20"/>
				<textElement/>
				<textFieldExpression class="java.lang.String"><![CDATA[$F{endereco.cep}]]></textFieldExpression>
			</textField>
		</band>
	</detail>
	<columnFooter>
		<band height="45" splitType="Stretch"/>
	</columnFooter>
	<pageFooter>
		<band height="54" splitType="Stretch"/>
	</pageFooter>
	<summary>
		<band height="42" splitType="Stretch"/>
	</summary>
</jasperReport>
javer

Bom, dentro do seu problema eu fiz um pequeno projeto (usando JasperReport e iReport 3.7.6) no qual a execução do relatório está funcionando 100%, compare com o seu aí e veja qual é o problema.

Pelo que vi seu problema não era no InputStream, porém era no DataSource, o arquivo zipado do projeto está anexado a essa mensagem.

Boa sorte.

L

Pessoal depois de muito tempo precisei novamente, na época novato e ainda sou porem consegui resolver!!
Em outro contexto mais ai vai!!

package util.testesdiversos;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;
import to.ClienteTO;
import dao.ClienteDAO;

public class TesteEasyReport2 {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		List<ClienteTO> beanCollection = null;
		try {
			ClienteDAO clienteDAO = new ClienteDAO();
			beanCollection = clienteDAO.listarTodos(new ClienteTO());
			HashMap parametros = new HashMap();
			InputStream inputStream = TesteEasyReport2.class
					.getResourceAsStream("/util/report/Teste1.jasper");
			JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(
					beanCollection);
			JasperPrint impressao = null;
			try {
				impressao = JasperFillManager.fillReport(inputStream,
						parametros, ds);
				JasperViewer viewer = new JasperViewer(impressao, true);
				viewer.setLocationRelativeTo(null);
				viewer.setVisible(true);
			} catch (JRException e) {
			}
		} catch (Exception e) {
		}
	}
}

Resolvi o que tinha neste post mesmo!! só vai a dica, tive problemas com repositório com versões diversas da mesmas lib !! estranho neh hehe

Criado 6 de dezembro de 2010
Ultima resposta 8 de dez. de 2010
Respostas 14
Participantes 4