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: