Mostrando postagens com marcador Relatório. Mostrar todas as postagens
Mostrando postagens com marcador Relatório. Mostrar todas as postagens

sábado, 28 de agosto de 2010

Exemplo de Relatório em Java para web

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.
Ao 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:

<?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="clientes" 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"/>
<style name="efeitoZebra">
<conditionalStyle>
<conditionExpression><![CDATA[new Boolean(($V{COLUMN_COUNT}.intValue() % 2) != 0)]]></conditionExpression>
<style mode="Opaque" backcolor="#BAB8B8"/>
</conditionalStyle>
</style>
<parameter name="clientesLista" class="java.util.List"/>
<parameter name="titulo" class="java.lang.String"/>
<parameter name="total" class="java.lang.String"/>
<field name="nome" class="java.lang.String"/>
<field name="endereco" class="java.lang.String"/>
<field name="email" class="java.lang.String"/>
<field name="cidade" class="java.lang.String"/>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="38" splitType="Stretch">
<textField>
<reportElement x="109" y="0" width="349" height="35"/>
<textElement lineSpacing="1_1_2">
<font size="20" isBold="true"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$P{titulo}]]></textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
<band height="17" splitType="Stretch"/>
</pageHeader>
<columnHeader>
<band height="34" splitType="Stretch">
<staticText>
<reportElement x="0" y="14" width="137" height="20" forecolor="#010101" backcolor="#3B56EC"/>
<textElement>
<font size="12" isBold="true" isItalic="true"/>
</textElement>
<text><![CDATA[Nome]]></text>
</staticText>
<staticText>
<reportElement x="137" y="14" width="149" height="20" forecolor="#010101" backcolor="#3B56EC"/>
<textElement>
<font size="12" isBold="true" isItalic="true"/>
</textElement>
<text><![CDATA[Endereço]]></text>
</staticText>
<staticText>
<reportElement x="286" y="14" width="153" height="20" forecolor="#010101" backcolor="#3B56EC"/>
<textElement>
<font size="12" isBold="true" isItalic="true"/>
</textElement>
<text><![CDATA[E-mail]]></text>
</staticText>
<staticText>
<reportElement x="439" y="14" width="133" height="20" forecolor="#010101" backcolor="#3B56EC"/>
<textElement>
<font size="12" isBold="true" isItalic="true"/>
</textElement>
<text><![CDATA[Cidade]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height="22" splitType="Stretch">
<textField>
<reportElement style="efeitoZebra" x="137" y="0" width="149" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{endereco}]]></textFieldExpression>
</textField>
<textField>
<reportElement style="efeitoZebra" x="439" y="0" width="133" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{cidade}]]></textFieldExpression>
</textField>
<line>
<reportElement x="0" y="20" width="572" height="1"/>
</line>
<textField>
<reportElement style="efeitoZebra" x="0" y="0" width="137" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{nome}]]></textFieldExpression>
</textField>
<textField>
<reportElement style="efeitoZebra" x="286" y="0" width="153" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{email}]]></textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height="20" splitType="Stretch">
<textField>
<reportElement x="391" y="0" width="181" height="20"/>
<textElement>
<font size="12" isBold="true"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$P{total}]]></textFieldExpression>
</textField>
</band>
</columnFooter>
<pageFooter>
<band height="54" splitType="Stretch">
<textField>
<reportElement x="225" y="17" width="80" height="20"/>
<textElement textAlignment="Right"/>
<textFieldExpression class="java.lang.String"><![CDATA["Página "+$V{PAGE_NUMBER}+" de"]]></textFieldExpression>
</textField>
<textField evaluationTime="Report">
<reportElement x="305" y="17" width="40" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[" " + $V{PAGE_NUMBER}]]></textFieldExpression>
</textField>
</band>
</pageFooter>
<summary>
<band height="42" splitType="Stretch"/>
</summary>
</jasperReport>
clientes.jrxml

3. 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.java

package 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.java

3. Passo: Para testar, crie um index.jsp, como o do exemplo abaixo:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Relatório em Java</title>
<script type="text/javascript">
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();
}
</script>
</head>
<body>
<h1>Relatório de Clientes</h1>
<form action="./RelatorioServlet" method="post" onsubmit="return false;">
<input type="hidden" name="acao" />
<input type="submit" value="Visualizar Relatorio" onclick="javascript:visualizarRelatorio();">
<input type="submit" value="Gerar Relatório PDF" onclick="javascript:gerarRelatorioPDF();">
</form>
</body>
</html>
index.jsp

Exemplo: Index
Vizualizando 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.

Jabes Felipe RSS Feed Jabes Felipe