Neste artigo, vou mostrar como gerar um relatório usando o iReport, no qual as informações virão de um banco de dados, e usaremos o Hibernate para conexão. Em uma aplicação, é comum que o cliente queira um relatório. Para gerá-lo, vamos usar o iReport e o JasperReport. No "mundo real", gera-se um relatório a partir de uma base de dados, que na maioria das vezes é um banco de dados.
Vamos trabalhar com a hipótese de que você já tenha um BD e uma tabela de onde deseja extrair a informação.
Este é meu banco:
Você precisa fazer o download do iReport. Até o momento, a versão mais recente é a 3.7.6.
Faça o download do iReport;
Copie os .jars que estão na pasta ext do iReport para o projeto Java, mas, se for JEE, adicione à pasta lib. Não se esqueça do .jar para o BD, caso os dados do relatório venham de um banco de dados, que é o mais real e comum.
Commons-beanutils:
Veja, em poucas palavras e de uma forma direta, o que é iReport e o JasperReport:
Report: é uma espécie de IDE para criação do layout do seu relatório. Com ele, você pode definir qual a aparência do seu relatório e o que vai conter. E é exatamente aqui que fazemos a conexão com o banco de dados, e, consequentemente, com as tabelas. É aqui, também, onde informamos quais colunas de uma tabela vão aparecer no relatório. Ele gera um arquivo .jrxml, que será lido por JasperReport.
JasperReport: É uma API que permite nossa classe Java estabelecer uma "conversa" com o nosso layout-relatório. Isso é ú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).
O desenvolvedor cria o layout baseado no propósito do relatório e 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: se será de um BD, 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. Um arquivo será gerado em um local específico, ou, se for um JEE, será carregado pelo browser.
Note que os nomes das variáveis da classe devem estar iguais aos nomes dos campos (fields) no layout do relatório.
Passo a passo para gerar o relatório:
Parte 1: vá para o iReport e crie um arquivo, seguindo as instruções do assistente, que são bem simples:
Na parte de banco
de dados, basta informar os dados relacionados à conexão do banco:
Feito isso, o
relatório aparecerá na tela e, então, podemos editá-lo. Observe que ele já
aparece montando com os dados do BD, ou seja, com os nomes das colunas e nos
seus devidos lugares. Isso só acontece nas versões mais recentes do iReport.
Parte 2: Agora, precisamos criar um projeto no Eclipse. Este será um Java
Crie o Bean (os nomes entre o bean e os fields no layout
devem ser os mesmos);
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:
Observe que é recomendável colocar o .jrxml em um package
para que terceiros não tenham acesso. Eu coloquei fora só para mostrar que é
possível rodar dessa maneira sem problema algum.
A classe Bean:
Gerando o
Essa é a classe
principal, que de fato faz gerar o relatório em PDF. Ela pega o layout definido
no iReport, e o JasperReport faz a conversão, veja:
public static void main(String[] args) throws JRException,SQLException {
System.out.println("Gerando relatório...");
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 usuários através de uma query HQL.
public List listaTodos(){
Query query = getSession().createQuery("from Usuario");
List listaUs = query.list();
return listaUs;
relatório, precisamos informar onde está o arquivo jrxml. Não se esqueça de
criar o folder.
.compileReport("relatorio/reportcamilo.jrxml");
Dica: se o jrxml
estiver no mesmo package que a classe que gera o relatório, o código acima é
válido. Do contrario, deve ser conforme mostrado abaixo:
"../relatorio/reportblog.jrxml"
Passando o data source
O data source nada mais é do que uma lista com os dados que serão inseridos no relatório.
Obs.: No primeiro argumento,
temos o caminho do layout do relatório gerado pelo iReport, o parâmetro pode
ser null. E criamos um
data source com o conteúdo da lista que tem o resultado HQL.
No class dao:
public List listaUsuario(){
Query query = getSession().createQuery("from Tusuario");
List lista = query.list();
Em outra classe:
TUsuarioDAO tusuariodao = new TUsuarioDAO();
List listaUS = tusuariodao.listaUsuario();
Exportando para
Para exportar,
temos um método para cada formato de exportação:
"relatorio/RelatorioUser.pdf");
Obs.: No primeiro argumento, temos a variável que tem o relatório preenchido e o caminho pelo qual ele deve ser exportado.