Neste artigo vou mostrar como gerar um relatório usando Ireport, cujas informações vêm do banco de dados. Além disso, usaremos o Hibernate para fazer conexão. É bem comum em uma aplicação que o cliente queira algum tipo de relatório. Para gerá-los, vamos usar o Ireport e o JasperReport. Outro ponto tratado neste artigo será um Java Project normal.
Vou levar em conta que você já tem um um banco de dados e uma tabela de onde deseja extrair a informação. Esse é meu banco:
<img table bd http://blog.camilolopes.com.br/wp-content/uploads/2010/12/ireportbdus.JPG>
Requisitos:
Você precisa fazer o download do Ireport. A versão mais recente até agora é a 3.7.6.
Configuração:
- Fazer o download do Ireport;
- Copiar os .jars que estão na pasta ext do Ireport para o projeto Java. Se for JEE, adicionar na pasta lib. Não esquecer do .jar para o banco de dados, caso os dados do relatório venham de um banco de dados, que é o mais real e comum.
Commons-beanutils
- commons-collections;
- commons-digester;
- commons-logging;
- groovy-all;
- iText;
- poi;
- jasperreports.
Veja o que é o Ireport e o JasperReport (de forma simples e direta):
- Ireport é uma especie de IDE para a criação do layout do seu relatório, ou seja, é a cara e o conteúdo que ele vai ter. E é aqui que fazemos a conexão com o banco de dados e, consequentemente, com as tabelas. É, tambem, onde informamos quais colunas de uma tabela vão aparecer no relatório. Ele gera um arquivo .jrxml, que será lido pelo JasperReport.
- JasperReport é uma API que permite nossa classe Java estabelecer uma “conversa” com o nosso layout-relatório. Isso vem a ser útil para que sua aplicação Java gere relatórios em um único ambiente. O usuário não percebe que foi gerado por algo “fora” do Java (isso para aqueles que sabem o que é Java).
Como acontece na prática:
- O desenvolvedor cria o layout do relatório com base no propósito deste, põe a logomarca da empresa e os dados que devem aparecer. Não precisa ser um webdesigner para desenhar o layout e é no Ireport que falamos de onde vem a informação e se ela será de um banco de dados, ou não.
- No JasperReport apenas setamos onde está o layout .jrxml do Ireport e em seguida informamos para qual tipo vamos exportar o relatório: PDF, XML, HTML ou TEXT. Podemos dizer que será gerado um arquivo em um local especifico, ou se for um JEE, que vai ser carregado pelo browser.
Note: os nomes das variáveis da classe devem estar iguais aos nomes dos campos (fields) no layout do relatório.
Vamos colocar mão na massa por partes:
- Parte 1: Ir para o Ireport e criar um arquivo, seguindo as instruções do assistente, que são bem simples:
Na parte de banco de dados, basta informar os dados de conexão do banco.
Feito isso, temos o relatório na tela e podemos editá-lo. Observe que ele já foi montando com os dados do banco de dados, ou seja, com os nomes da coluna nos devidos locais – isso acontece nas versões mais recentes do Ireport.
- Parte 2: Agora no Eclipse precisamos criar um projeto. Este será um Java Project.
Passos:
- Crie o Bean (os nomes entre o bean e os fields no layout devem ser os mesmos);
- Crie uma conexão com o banco de dados (usamos o Hibernate);
- Crie um método List na classe DAO, usando HQL com a query que deseja;
- Importe para o projeto do eclipse o arquivo jrxml;
- Crie a classe main com “exportando o relatório”.
Abaixo veja a estrutura do meu projeto:
<img projeto http://blog.camilolopes.com.br/wp-content/uploads/2010/12/ireportprojectbdmain.JPG>
Note: é recomendavel colocar o .jrxml em um package para que terceiros não tenham acesso, mas coloquei fora só para mostrar que é possível rodar sem problemas dessa forma.
A classe Bean:
@Entity
@Table(name="tusuario")
public class Usuario {
@Column
private String nome;
@Column
private String email;
@Id
private int id;
//gets/sets omitidos
Gerando o relatório
Essa é a classe principal que, de fato, faz gerar o relatório em PDF. Pegando o layout definido no Ireport, o JasperReport faz a conversão. Veja:
public class GerarRelatorio {
public static void main(String[] args) throws JRException,SQLException {
System.out.println("Gerando relatório...");
UsuarioDAO usuarioDAO = new UsuarioDAO();
List listaUs = usuarioDAO.listaTodos();
JasperReport pathjrxml = JasperCompileManager.compileReport("relatorio/reportex.jrxml");
JasperPrint printReport = JasperFillManager.fillReport(pathjrxml, null, new JRBeanCollectionDataSource(listaUs));
JasperExportManager.exportReportToPdfFile(printReport, "relatorio/reportex.pdf");
System.out.println("Relatorio gerado");
}
Minha classe UsuarioDAO retorna todos os usuarios atraves de uma query HQL:
public List listaTodos(){
Query query = getSession().createQuery("from Usuario");
List listaUs = query.list();
return listaUs;
}
Note: Informando o JRXML. Na classe “relatório”, precisamos informar onde está o arquivo jrxml. Não se esqueça de criar o folder:
JasperReport report = JasperCompileManager
.compileReport("relatorio/reportcamilo.jrxml");
Dica: Se o jrxml estiver no mesmo package que a classe que gera o relatório, o código acima é valido; do contrario, deve ser conforme mostrado abaixo:
"../relatorio/reportblog.jrxml"
Passando o data source
O data source nada mais eh que uma lista com os dados que serao inseridos no relatorio.
JasperPrint print = JasperFillManager.fillReport(report, null,
new JRBeanCollectionDataSource(lista));
Obs.: No primeiro argumento temos o caminho do layout do relatório gerado pelo Ireport (parâmetro pode ser null) e criamos um data source com o conteúdo da lista que tem o resultado HQL:
class dao
public List listaUsuario(){
Query query = getSession().createQuery("from Tusuario");
List lista = query.list();
return lista;
Em outra classe:
TUsuarioDAO tusuariodao = new TUsuarioDAO();
List listaUS = tusuariodao.listaUsuario();
Exportando para um formato
Para exportar, temos métodos para cada formato de exportação:
JasperExportManager.exportReportToPdfFile(print,
"relatorio/RelatorioUser.pdf");
Obs.: No primeiro argumento temos a variável que tem o relatorio preenchido e o caminho que deve ser percorrido para exportá-lo. Agora é só rodar a classe main.