Exemplo de Relatório em Java para web
Autor: Jabes Felipe | Publicado: 2010-08-28T16:16:00-07:00

Olá Pessoal,Neste post, irei mostrar um exemplo de como fazer um simples relatório em Java para aplicações web, para a geração do relatório usaremos o Jasper Reports que é um Framework open-source, para a criação do layout usaremos o Framework iReport, para testarmos a aplicação, criamos um Servlet, que será executado no servidor JBoss4 usando o Eclipse.Para baixar o JasperReports: http://jasperforge.org/projects/jasperreportsPara baixar o iReport: http://jasperforge.org/projects/ireportAo final do post o projeto será disponibilizado para download com todas bibliotecas usadas e os arquivos do relatório.1. Passo: Estrutura do projeto:2. Passo: Vamos criar a estrutura do relatório do iReport, crie um relatório com o nome clientes, com o seguinte arquivo xml:&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;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="clientes" language="groovy" pageWidth="612" pageHeight="792" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"&gt; &lt;property name="ireport.zoom" value="1.0"/&gt; &lt;property name="ireport.x" value="0"/&gt; &lt;property name="ireport.y" value="0"/&gt; &lt;style name="efeitoZebra"&gt;  &lt;conditionalStyle&gt;   &lt;conditionExpression&gt;&lt;![CDATA[new Boolean(($V{COLUMN_COUNT}.intValue() % 2) != 0)]]&gt;&lt;/conditionExpression&gt;   &lt;style mode="Opaque" backcolor="#BAB8B8"/&gt;  &lt;/conditionalStyle&gt; &lt;/style&gt; &lt;parameter name="clientesLista" class="java.util.List"/&gt; &lt;parameter name="titulo" class="java.lang.String"/&gt; &lt;parameter name="total" class="java.lang.String"/&gt; &lt;field name="nome" class="java.lang.String"/&gt; &lt;field name="endereco" class="java.lang.String"/&gt; &lt;field name="email" class="java.lang.String"/&gt; &lt;field name="cidade" class="java.lang.String"/&gt; &lt;background&gt;  &lt;band splitType="Stretch"/&gt; &lt;/background&gt; &lt;title&gt;  &lt;band height="38" splitType="Stretch"&gt;   &lt;textField&gt;    &lt;reportElement x="109" y="0" width="349" height="35"/&gt;    &lt;textElement lineSpacing="1_1_2"&gt;     &lt;font size="20" isBold="true"/&gt;    &lt;/textElement&gt;    &lt;textFieldExpression class="java.lang.String"&gt;&lt;![CDATA[$P{titulo}]]&gt;&lt;/textFieldExpression&gt;   &lt;/textField&gt;  &lt;/band&gt; &lt;/title&gt; &lt;pageHeader&gt;  &lt;band height="17" splitType="Stretch"/&gt; &lt;/pageHeader&gt; &lt;columnHeader&gt;  &lt;band height="34" splitType="Stretch"&gt;   &lt;staticText&gt;    &lt;reportElement x="0" y="14" width="137" height="20" forecolor="#010101" backcolor="#3B56EC"/&gt;    &lt;textElement&gt;     &lt;font size="12" isBold="true" isItalic="true"/&gt;    &lt;/textElement&gt;    &lt;text&gt;&lt;![CDATA[Nome]]&gt;&lt;/text&gt;   &lt;/staticText&gt;   &lt;staticText&gt;    &lt;reportElement x="137" y="14" width="149" height="20" forecolor="#010101" backcolor="#3B56EC"/&gt;    &lt;textElement&gt;     &lt;font size="12" isBold="true" isItalic="true"/&gt;    &lt;/textElement&gt;    &lt;text&gt;&lt;![CDATA[Endereço]]&gt;&lt;/text&gt;   &lt;/staticText&gt;   &lt;staticText&gt;    &lt;reportElement x="286" y="14" width="153" height="20" forecolor="#010101" backcolor="#3B56EC"/&gt;    &lt;textElement&gt;     &lt;font size="12" isBold="true" isItalic="true"/&gt;    &lt;/textElement&gt;    &lt;text&gt;&lt;![CDATA[E-mail]]&gt;&lt;/text&gt;   &lt;/staticText&gt;   &lt;staticText&gt;    &lt;reportElement x="439" y="14" width="133" height="20" forecolor="#010101" backcolor="#3B56EC"/&gt;    &lt;textElement&gt;     &lt;font size="12" isBold="true" isItalic="true"/&gt;    &lt;/textElement&gt;    &lt;text&gt;&lt;![CDATA[Cidade]]&gt;&lt;/text&gt;   &lt;/staticText&gt;  &lt;/band&gt; &lt;/columnHeader&gt; &lt;detail&gt;  &lt;band height="22" splitType="Stretch"&gt;   &lt;textField&gt;    &lt;reportElement style="efeitoZebra" x="137" y="0" width="149" height="20"/&gt;    &lt;textElement/&gt;    &lt;textFieldExpression class="java.lang.String"&gt;&lt;![CDATA[$F{endereco}]]&gt;&lt;/textFieldExpression&gt;   &lt;/textField&gt;   &lt;textField&gt;    &lt;reportElement style="efeitoZebra" x="439" y="0" width="133" height="20"/&gt;    &lt;textElement/&gt;    &lt;textFieldExpression class="java.lang.String"&gt;&lt;![CDATA[$F{cidade}]]&gt;&lt;/textFieldExpression&gt;   &lt;/textField&gt;   &lt;line&gt;    &lt;reportElement x="0" y="20" width="572" height="1"/&gt;   &lt;/line&gt;   &lt;textField&gt;    &lt;reportElement style="efeitoZebra" x="0" y="0" width="137" height="20"/&gt;    &lt;textElement/&gt;    &lt;textFieldExpression class="java.lang.String"&gt;&lt;![CDATA[$F{nome}]]&gt;&lt;/textFieldExpression&gt;   &lt;/textField&gt;   &lt;textField&gt;    &lt;reportElement style="efeitoZebra" x="286" y="0" width="153" height="20"/&gt;    &lt;textElement/&gt;    &lt;textFieldExpression class="java.lang.String"&gt;&lt;![CDATA[$F{email}]]&gt;&lt;/textFieldExpression&gt;   &lt;/textField&gt;  &lt;/band&gt; &lt;/detail&gt; &lt;columnFooter&gt;  &lt;band height="20" splitType="Stretch"&gt;   &lt;textField&gt;    &lt;reportElement x="391" y="0" width="181" height="20"/&gt;    &lt;textElement&gt;     &lt;font size="12" isBold="true"/&gt;    &lt;/textElement&gt;    &lt;textFieldExpression class="java.lang.String"&gt;&lt;![CDATA[$P{total}]]&gt;&lt;/textFieldExpression&gt;   &lt;/textField&gt;  &lt;/band&gt; &lt;/columnFooter&gt; &lt;pageFooter&gt;  &lt;band height="54" splitType="Stretch"&gt;   &lt;textField&gt;    &lt;reportElement x="225" y="17" width="80" height="20"/&gt;    &lt;textElement textAlignment="Right"/&gt;    &lt;textFieldExpression class="java.lang.String"&gt;&lt;![CDATA["Página "+$V{PAGE_NUMBER}+" de"]]&gt;&lt;/textFieldExpression&gt;   &lt;/textField&gt;   &lt;textField evaluationTime="Report"&gt;    &lt;reportElement x="305" y="17" width="40" height="20"/&gt;    &lt;textElement/&gt;    &lt;textFieldExpression class="java.lang.String"&gt;&lt;![CDATA[" " + $V{PAGE_NUMBER}]]&gt;&lt;/textFieldExpression&gt;   &lt;/textField&gt;  &lt;/band&gt; &lt;/pageFooter&gt; &lt;summary&gt;  &lt;band height="42" splitType="Stretch"/&gt; &lt;/summary&gt;&lt;/jasperReport&gt;clientes.jrxml3. Passo: Vamos criar um Servlet, chamado RelatorioServlet, o foco do post é mostrar como fazer relatório em Java, para isto, deixarei toda lógica no Servlet, deixando o projeto com uma baixa coesão, fique a vontade para fazer o projeto com a separação das camadas. Crie também uma JavaBean chamado Cliente, para carregar as informações dos Clientes, criaremos um List de Clientes no próprio Servlet. O exemplo terá uma opção que visualizará o Relatório, usando o método estático viewReport da Classe JasperViewer, a outra opção será o pdf do Relatório usando o método estático printReportToPdfFile da Classe JasperPrintManager.package modelo;public class Cliente {  private String nome; private String endereco; private String email; private String cidade;    public Cliente() {  super(); } public Cliente(String nome, String endereco, String email, String cidade) {  super();  this.nome = nome;  this.endereco = endereco;  this.email = email;  this.cidade = cidade; } public String getNome() {  return nome; } public void setNome(String nome) {  this.nome = nome; } public String getEndereco() {  return endereco; } public void setEndereco(String endereco) {  this.endereco = endereco; } public String getEmail() {  return email; } public void setEmail(String email) {  this.email = email; } public String getCidade() {  return cidade; } public void setCidade(String cidade) {  this.cidade = cidade; }}Cliente.javapackage relatorio;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import modelo.Cliente;import net.sf.jasperreports.engine.JRException;import net.sf.jasperreports.engine.JasperFillManager;import net.sf.jasperreports.engine.JasperPrint;import net.sf.jasperreports.engine.JasperPrintManager;import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;import net.sf.jasperreports.view.JasperViewer;public class RelatorioServlet extends HttpServlet { private static final long serialVersionUID = 1L;         public RelatorioServlet() {        super();          }        public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {     List clientesLista = new ArrayList();  clientesLista.add(new Cliente("Jabes Felipe", "Copacabana, 54", "jabesfelipe@gmail.com", "Rio de Janeiro"));  clientesLista.add(new Cliente("Camila Ribeiro", "Ipanema,324", "camilarib@gmail.com", "Rio de Janeiro"));  clientesLista.add(new Cliente("Jaque Silva", "Lapa, 44", "jaquesilva@gmail.com", "Rio de Janeiro"));  clientesLista.add(new Cliente("Bruna Lira", "Centro, 32", "brunalira@gmail.com", "Rio de Janeiro"));  clientesLista.add(new Cliente("Amanda Alves", "Lapa, 342", "amandaa@gmail.com", "Rio de Janeiro"));  clientesLista.add(new Cliente("Priscila Ratina", "Barra Tijuca, 86", "priscilaratina@gmail.com", "Rio de Janeiro"));  clientesLista.add(new Cliente("Carolina Marques", "Copacabana, 234", "carolinamarques@gmail.com", "Rio de Janeiro"));    try {      String acao = request.getParameter("acao") == null ? "" : request.getParameter("acao");      String caminhoJasper = getServletContext().getRealPath("/WEB-INF/classes/relatorio/") + "/";   String caminho = getServletContext().getRealPath("/");      JRBeanCollectionDataSource jrDT = new JRBeanCollectionDataSource(clientesLista);   Map parametros = new HashMap();   parametros.put("titulo", "Relatórios de Clientes");   parametros.put(clientesLista, jrDT);   parametros.put("total", "Total de Clientes: " + clientesLista.size());   JasperPrint jasperPrint = JasperFillManager.fillReport(caminhoJasper + "clientes.jasper", parametros, jrDT);      if("visualizar".equals(acao)) {    JasperViewer.viewReport(jasperPrint, false);   } else if("pdf".equals(acao)) {    JasperPrintManager.printReportToPdfFile(jasperPrint, caminho + "/RelatorioCliente.pdf");    response.sendRedirect("RelatorioCliente.pdf");   } else {    response.sendRedirect("index.jsp");   }       } catch (JRException e) {      e.printStackTrace();  }    }        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {     processRequest(request, response);    }     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  processRequest(request, response); }}RelatorioServlet.java3. Passo: Para testar, crie um index.jsp, como o do exemplo abaixo:&lt;%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%&gt;&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;&lt;html&gt;&lt;head&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;&lt;title&gt;Relatório em Java&lt;/title&gt;&lt;script type="text/javascript"&gt; function visualizarRelatorio() {    enviar("visualizar");   } function gerarRelatorioPDF() {    enviar("pdf"); } function enviar(acao) {  document.forms[0].acao.value = acao;  document.forms[0].target = "_blank";  document.forms[0].action = "./RelatorioServlet";  document.forms[0].submit(); }&lt;/script&gt;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;Relatório de Clientes&lt;/h1&gt;&lt;form action="./RelatorioServlet" method="post" onsubmit="return false;"&gt; &lt;input type="hidden" name="acao" /&gt;  &lt;input type="submit" value="Visualizar Relatorio" onclick="javascript:visualizarRelatorio();"&gt; &lt;input type="submit" value="Gerar Relatório PDF" onclick="javascript:gerarRelatorioPDF();"&gt; &lt;/form&gt;&lt;/body&gt;&lt;/html&gt;index.jspExemplo: IndexVizualizando o Relatório:PDF do Relatório:Bom galera, este foi um exemplo de como criar relatórios em Java, usando o JasperReport e o iReport,Para quem quiser baixar o exemplo, clique aqui.Qualquer dúvida, crítica ou sugestão, fico à disposição.