Exemplo básico completo: Jasper + Collection (sem BD no relatório)

Precisei construir um relatório com o Jasper e procurei muito até conseguir.

Muitas pessoas procuram exemplos com collection e não encontram, a maioria inclui exemplos com conexão a banco de dados, porém muitas aplicações já estão prontas e com collections populadas, bastando enviar para o relatório.

Criei o exemplo básico abaixo com estas características:

[color=darkblue]- Usa Collections para preencher o relatório

  • Exemplo de passagem e leitura de parâmetros no relatório
  • Sem conexão com BD no relatório
  • Exibe relatório no visualizador e também grava PDF em disco[/color]

1 - Relatório básico, exibe um parâmetro e os dados da collection

Obs: os nomes dos fields devem ser iguais aos atributos do bean (neste caso $F{nome} e $F{idade}).
Obs2: Neste exemplo o java já utiliza o relatório compilado .jasper. Utilize o iReport para criar o relatório abaixo e compilar.

<?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="ctrlRemessasPeriodo" language="groovy" pageWidth="612" pageHeight="792" 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"/> <parameter name="parameter1" class="java.lang.String"/> <background> <band splitType="Stretch"/> </background> <title> <band height="79" splitType="Stretch"> <staticText> <reportElement x="0" y="0" width="572" height="20"/> <textElement textAlignment="Center"> <font size="12"/> </textElement> <text><![CDATA[Título do relatório]]></text> </staticText> <textField pattern="EEEEE dd MMMMM yyyy"> <reportElement x="372" y="20" width="100" height="20"/> <textElement/> <textFieldExpression class="java.util.Date"><![CDATA[new java.util.Date()]]></textFieldExpression> </textField> <textField pattern="h.mm a"> <reportElement x="472" y="20" width="100" height="20"/> <textElement/> <textFieldExpression class="java.util.Date"><![CDATA[new java.util.Date()]]></textFieldExpression> </textField> </band> </title> <pageHeader> <band height="35" splitType="Stretch"/> </pageHeader> <columnHeader> <band height="61" splitType="Stretch"/> </columnHeader> <detail> <band height="64" splitType="Stretch"> <staticText> <reportElement x="57" y="23" width="100" height="20"/> <textElement/> <text><![CDATA[parametro 1:]]></text> </staticText> <textField> <reportElement x="157" y="23" width="415" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$P{parameter1}.toString()]]></textFieldExpression> </textField> <textField> <reportElement x="157" y="43" width="100" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{nome}]]></textFieldExpression> </textField> <staticText> <reportElement x="57" y="43" width="100" height="20"/> <textElement/> <text><![CDATA[lista]]></text> </staticText> <textField> <reportElement x="257" y="43" width="100" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{idade}]]></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>

2 - Bean



public class meuBean {

	private String nome;
	private Integer idade;
	private String endereco;
	
	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public meuBean(){		
	}
	
	public meuBean(String nm, int age){
		setNome(nm);
		setIdade(age);
	}
	
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public Integer getIdade() {
		return idade;
	}
	public void setIdade(Integer idade) {
		this.idade = idade;
	}
	
}

3 - Classe main

import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JasperExportManager;
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;

public class TesteJasper {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub		
		
		try{
			//cria beans e coloca na collection
        	meuBean bean1 = new meuBean("João", 31);
        	meuBean bean2 = new meuBean("Fernando", 43);
        	meuBean bean3 = new meuBean("Luis", 24);
        	
        	Collection<meuBean> lista = new ArrayList<meuBean>();
        	
        	lista.add(bean1);
        	lista.add(bean2);
        	lista.add(bean3);      	
        	
        	//cria datasource a partir da collection
        	JRBeanCollectionDataSource jrds = new JRBeanCollectionDataSource(lista);
        	
        	//mapeia parâmetros
        	Map parametros = new HashMap();        	
        	//parâmetro parameter1 deve existir no relatório
        	parametros.put("parameter1", "texto via parametro java");
        	
        	//preenche relatorio com parâmetros e datasource
        	JasperPrint printer = JasperFillManager.fillReport("/home/usuario/workspace/xJasperTeste/relatorios/relatorio.jasper", parametros, jrds);
  
        	//abre visualizador
        	JasperViewer jv = new JasperViewer(printer, false);
            jv.setTitle("Título da janela do visualizador");  
            jv.setVisible(true);

            //grafa relatorio pdf em disco
            FileOutputStream fos = new FileOutputStream("/home/usuario/workspace/xJasperTeste/relatorios/relatorio.pdf");
            JasperExportManager.exportReportToPdfStream(printer, fos);
            fos.flush();
            fos.close();
    	}
    	catch(Exception e) {
    		System.out.println("ERRO ");
    		e.printStackTrace();
        }
		
	}

}

4 - Tive vários problemas na execução por falta de JAR ou por versões incompatíveis (iText, por exemplo), segue a lista dos JARs incluídos, alguns abaixo talvez não sejam necessários.

commons-beanutils-1.7.jar
commons-logging.jar
commons-collections-2.1.jar
groovy-all-1.7.5.jar
commons-digester-2.0.jar
groovy-binary-1.8.0.zip
commons-discovery-0.2.jar
iText-2.1.7.jar
commons-el.jar
jasperreports-4.0.2.jar
commons-fileupload-1.2.1.jar
jasperreports-applet-4.0.2.jar
commons-io-1.4.jar
jasperreports-fonts-4.0.2.jar
commons-lang-2.4.jar
jasperreports-javaflow-4.0.2.jar
commons-logging-1.0.4.jar
poi-3.6.jar

Espero que este tópico ajude outros que estão iniciando em relatórios. :thumbup:

Boa iniciativa, vai ajudar os iniciantes.
Eu sempre recomendo navegar nos topicos do GUJ,
pois já ajudei uma consideravel quantia de pessoas sobre iReport… Enfim, vou indicar este topico

Eu naveguei por vários tópicos, e sempre faltava algum detalhe.

Espero que este que fiz seja “básico completo” mesmo.

EdyStauch, ótima iniciativa!
Me diz uma coisa: não seria legal formatar teu conteúdo como um documento / tutorial e postar aqui?
Eu ajudo, se quiser!
Abraço!

É uma boa ideia.

Vou tentar fazer isso, mas meu problema é tempo…

Nossa! Maravilha!
Vou salvar esse tópico pra poder checar depois.
Vou precisar implementar isso num software de controle financeiro, gerando relatórios de fluxo de caixa etc.
Espero que isso me ajude!

Obrigado pela contribuição!

boa iniciativa,

Só um add, caso não queira incluir as libs do groovy você pode mudar a liguagem para java nas propriedades do report, segue :

Mais uma vez parabens pela iniciativa!!!

Não tá compilando isso aí :~

Diz que nome e idade não foram encontrados, entretanto meu bean tem esses atributos…

Pessoal sei que o tópico é antigo mas com ele fica mais facil de explicar minha duvida.
Como o Edy mencionou meu projeto ja esta quase todo implementado so falto o relatorios e outra particularidades, não quero que o relatorio conect-se diretamente ao banco de dados pois quero que minha aplicação seja bem portavel.
Então minha duvida é o seguinte to criando um relatorio que ira me retornar as ordem de serviço com seu respectivos itens, ate ai tudo bem o problema sao entidade que estão relacionada a elas por exemplo na entidade itens tem a tabela serviços relacionada, na tabela “OS” tem a tabela cliente e tecnico. como faço pra enviar dados dessas outra entidades.

Obs. quero evitar que o relatorio conecte diretamento no banco queria usar essas tecnica de mandas os beans.

Olá amigos, gostaria de saber se tem como dividir o detail do report em duas colunas, ou faço isso por tabela?

Abraço