Introdução
O JasperReports é um framework para a geração de relatórios. É uma ferramenta totalmente open source e gratuita, e a mais utilizada com esse propósito atualmente. Entre as funcionalidades do JasperReports podemos destacar:
- é capaz de exportar relatórios para diversos formatos diferentes, tais como PDF, HTML, XML, XLS, etc.
- aceita diversas formas de entrada de dados, tais como um arquivo XML ou CSV, conexão com o banco de dados, uma sessão do Hibernate, uma coleção de objetos em memória, etc.
- permite o uso de diagramas, gráficos, e até códigos de barras.
Como o JasperReports funciona?
Um aspecto importante do JasperReports é que o layout do relatório é definido em um arquivo XML, geralmente com a extensão .jrxml. Este XML possui todas as informações de formatação do relatório, e além disso, possui os campos que serão preenchidos posteriormente, de acordo com a fonte de dados utilizada (data source). Como dito anteriormente, a fonte de dados pode variar, e ser uma tabela em uma base de dados, ou ser um arquivo CSV, porém a formatação do relatório será a mesma em ambos os casos.
Os passos para gerar um relatório são bem simples. O primeiro passo é compilar o relatório em XML. Depois da compilação, o resultado é um objeto do tipo JasperReport. O próximo passo é preencher o relatório com os dados, e o resultado dessa etapa fica armazenado em um objeto do tipo JasperPrint. Esse objeto já representa o relatório finalizado, a partir dele podemos enviar para impressão diretamente, ou podemos exportar para um outro formato, tal como PDF por exemplo. Veja um diagrama ilustrando o processo completo:
O JasperReports pode ser baixado aqui. O download inclui, além do jar do próprio JasperReports, vários outros jars do qual o JasperReports depende. Por exemplo, caso você utilize gráficos no seu relatório, precisará incluir o jfreechart no seu build path. Por padrão, qualquer projeto que utilize o JasperReports precisará incluir pelo menos as seguintes jars:
- commons-beanutils
- commons-collections
- commons-digester
- commons-logging
- groovy-all
- iText
- poi
- jasperreports (é claro)
Para que serve o iReport?
O iReport é uma ferramenta desenvolvida pela mesma empresa do JasperReports, a JasperForge, e por isso é muito comum ver os dois sendo usados em conjunto. Uma das dificuldades ao trabalhar com os relatórios, está na definição do layout. É complicado escrever o layout totalmente em XML, sem ter que se aprofundar em todas as tags e atributos possíveis, e além disso posicionar todos os elementos corretamente. Na prática, é muito raro alguém editar o JRXML manualmente, e sim apenas para fazer alguns pequenos ajustes quando necessários. O processo normal é utilizar alguma ferramenta para gerar o JRXML automaticamente, e o iReport é utilizado com esse propósito.
O iReport é um aplicativo gráfico, que permite que você “desenhe” um relatório, utilizando uma palheta, e arrastando e soltando componentes, de forma bem parecida com a criação de interfaces e janelas para programas. Ao salvar, automaticamente será gerado um JRXML que você poderá utilizar na aplicação que estiver desenvolvendo. A vantagem é que não é necessário que você conheça a fundo o XML a ser editado, economizando tempo de desenvolvimento. Ele também traz um conjunto pronto de templates que você já pode utilizar diretamente, ou então, escrever seus próprios templates e reaproveitá-los sempre que precisar criar um novo tipo de relatório.
O iReport pode ser baixado aqui.
Criando um design com o iReport
Para o nosso exemplo, vamos utilizar o iReport para gerar o nosso JRXML. Não vou me aprofundar sobre a sintaxe do JRXML, vou apenas utilizar os recursos visuais oferecidos pelo iReport. Uma boa dica para quem quer aprender mais a fundo, é fazer alterações no layout visual, e depois mudar para a aba XML e verificar o que foi alterado. Dessa forma você pode ir aprendendo as tags e os atributos possíveis no XML enquanto faz as alterações visualmente.
Vamos agora criar um design. Execute o iReport e você terá uma tela parecida com a abaixo:
Selecione o menu File->Open, e na janela de diálogo que surgir, escolha a aba à esquerda como Report e selecione o template “Simple Blue”.
Neste exemplo vamos utilizar um template já pronto, dessa forma não perdemos muito tempo formatando a aparência do relatório. Ainda na mesma caixa de diálogo, clique no botão “Open this template”. A caixa de diálogo seguinte irá pedir um nome do relatório e a pasta onde o mesmo será salvo. Após selecionar o nome e a pasta, clique em “Next” e logo em seguida “Finish”.
Agora você deve estar com uma imagem parecida com essa:
Muitos desses componentes que já foram incluídos por padrão vão ser desnecessários. No lado direito, temos um Inspector mostrando os elementos do relatório. Você pode remover os agrupamentos que foram adicionados, clicando nos elementos “Group1 Group Header” e todos os demais, e após isso, clique com botão direito e selecione a opção “Remove band”. Apenas para comentar rapidamente sobre a estrutura de um relatório, abaixo temos as seções que são incluídas:
- Title – onde fica o título do relatório;
- Page Header – adiciona algum tipo de informação sobre o relatório (por exemplo, o ano vigente);
- Column Header – onde ficam os cabeçalhos da tabela;
- Detail – aqui ficam as “linhas” da tabela, a informação principal do relatório;
- Column Footer – usado para o rodapé da tabela;
- Summary – geralmente usado para uma conclusão, diagrama ou gráfico;
- Page Footer – informações como data, página do relatório, etc.
Todas estas seções não são obrigatórias. No nosso caso vamos utilizar apenas o Title, o Column Header e o Detail por se tratar de um relatório bem simples. Você pode alterar o texto dos elementos dando um clique duplo sobre ele, e depois colocar o texto novo, digite enter.
A parte mais importante do relatório é a informação que deve ser mostrada. Acima eu já indiquei que essa informação fica na seção “Detail”. O elemento que deve ser colocado nesta seção é chamado de campo (field), e a informação sobre os campos devem vir da fonte de dados (data source), dessa forma o JasperReport já sabe de onde extrair a informação que será mostrada nesta seção. Para adicionar um novo campo ao nosso relatório, clique com o botão direito em “Fields” e selecione a opção “Add field”, e depois clique sobre o campo que foi criado e o renomeie. Note que ele apenas criou o campo no Inspector, mas esse campo ainda não foi adicionado ao nosso layout.

Para adicionar o campo ao relatório, você deve selecionar o campo no Inspector e arrastar e soltar dentro do relatório. Lembre-se que você deve “soltá-lo” dentro da seção Detail. Por padrão, o iReport irá adicionar automaticamente um cabeçalho na seção Column Header correspondendo ao campo que você acabou de adicionar. Depois disso, você pode reposicionar o elemento e redimensionar utilizando o mouse. No exemplo, eu criei 3 campos: nome, email e telefone. A idéia é montar um relatório mostrando informações sobre clientes, e esse são os campos do nosso futuro objeto Cliente. No final, o relatório deve ficar semelhante à imagem abaixo:
Não se preocupe se seu exemplo não ficar muito parecido, a aparência do relatório neste caso é apenas secundária, e você ainda pode baixar o código no final do artigo. Logo, não é necessário perder muito tempo deixando o exemplo parecido
.
Compilando e gerando o relatório
Bem, agora que o relatório está pronto, nós precisamos apenas do código em Java que irá gerar o arquivo pra gente. Neste exemplo, vou utilizar como data source uma ArrayList de clientes. Assim o exemplo fica mais simples, e não é necessário nenhuma configuração extra em um banco de dados. Crie um projeto Java no Eclipse (ou outra IDE de sua preferência) e adicione as jars comentadas no início do artigo ao build path do projeto. Depois, adicione a classe cliente:
public class Cliente {
private String nome;
private String email;
private String telefone;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTelefone() {
return telefone;
}
public void setTelefone(String telefone) {
this.telefone = telefone;
}
}
Agora só precisamos adicionar uma classe com o método main para gerar o arquivo PDF. Veja abaixo o exemplo (com comentários para facilitar a compreensão):
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class RelatorioDeClientes {
public static void main(String[] args) throws JRException, SQLException {
System.out.println("Gerando relatório...");
// lista com os nossos clientes
List lista = new ArrayList();
Cliente c1 = new Cliente();
c1.setNome("Alexandre Macedo");
c1.setEmail("alexbmac@gmail.com");
c1.setTelefone("9999-9999");
Cliente c2 = new Cliente();
c2.setNome("Rafael Cosentino");
c2.setEmail("cosen@gmail.com");
c2.setTelefone("8888-8888");
Cliente c3 = new Cliente();
c3.setNome("Daniel Machado");
c3.setEmail("daniel@gmail.com");
c3.setTelefone("7777-7777");
lista.add(c1);
lista.add(c2);
lista.add(c3);
// compilacao do JRXML
JasperReport report = JasperCompileManager
.compileReport("relatorios/RelatorioClientes.jrxml");
// preenchimento do relatorio, note que o metodo recebe 3 parametros:
// 1 - o relatorio
//
// 2 - um Map, com parametros que sao passados ao relatorio
// no momento do preenchimento. No nosso caso eh null, pois nao
// estamos usando nenhum parametro
//
// 3 - o data source. Note que nao devemos passar a lista diretamente,
// e sim "transformar" em um data source utilizando a classe
// JRBeanCollectionDataSource
JasperPrint print = JasperFillManager.fillReport(report, null,
new JRBeanCollectionDataSource(lista));
// exportacao do relatorio para outro formato, no caso PDF
JasperExportManager.exportReportToPdfFile(print,
"relatorios/RelatorioClientes.pdf");
System.out.println("Relatório gerado.");
}
}
E pronto. Só rodar o exemplo e se nada der errado, deveremos ter um arquivo PDF no local indicado do código. Neste exemplo, criei uma pasta chamada “relatorios” dentro da pasta do projeto, que é onde armazeno tanto o arquivo JRXML, quanto o PDF gerado posteriormente.
Conclusão
Esta foi uma rápida introdução ao JasperReports e iReport. Este é um assunto bem extenso, e no futuro teremos mais alguns exemplos mostrando como utilizar outras fontes de dados (como uma conexão JDBC ou um arquivo XML), ou como customizar relatório um pouco mais, adicionando um gráfico por exemplo. O JasperReports é bem completo, e possui várias funcionalidades além das mostradas aqui, se você quiser se aprofundar mais deve conferir a documentação oficial.
Donwload do código aqui.
Tags: ireport, jasperreports, java, relatorios, tutorial







[...] o artigo [...]
muito bom o post, simples, objetivo e bem direto ao ponto, sem falar que ensinar como se tivesse pegando na mão. gostei da escrita do post.
parabens! a k19 pelo trabalho q vem fazendo com as apostilas e os posts no blog.
Cara, parabéns mesmo, esse foi o único tutorial de jasper e iReport que eu consegui ENTENDER realmente como tudo funciona, vc salvou minha pele… ^^
Ótimo post, vlw…
Abrass e sucesso!