Você está na página 1de 25

Document Views

O problema
Queremos gerar documentos bem formatados! Queremos imprimir documentos e ter controle sobre o que ser impresso em cada pgina! Pginas web no permitem formatar corretamente relatrios! No possvel, por exemplo, imprimir pginas web e ter controle do que ser impresso no rodap de cada pgina! Falaremos aqui sobre o engine de gerao de relatrios JasperReports e o desenhador de layouts iReport. Essas duas ferramentas juntas fornecem um ambiente poderoso para o desenvolvimento de relatrios, tanto em aplicaes WEB como em Desktop. O iReport uma ferramenta para facilitar os testes e principalmente facilitar a criao do layout dos relatrios. Mas quem gera de fato os relatrios em pdf, xls, html e outros formatos o JasperReports.

JasperReports
O JasperReports um poderoso framwork opensource escrito em Java para gerao de relatrios. Ele permite gerar dinamicamente relatrios em diversos formatos; entre eles: PDF, HTML, XLS, CSV e XML.

Funcionamento
O design do relatrio (localizao dos campos a serem preenchidos e seus repectivos nomes, para futuro mapeamento) definido em um arquivo XML, que obedece a estrutura declarada no arquivo jasperreports.dtd. Usando o XML, o designer pode definir textos estticos, imagens, linhas e formas geomtricas, como retngulos e elipses, e suas localizaes dentro do relatrio. Alm disso, pode-se ainda definir os campos que sero preenchidos dinamicamente a partir de uma base de dados. O arquivo XML compilado gerando um arquivo .jasper, onde as expresses Java existentes dentro do XML sero verificadas em tempo de compilao. Diferentes objetos Jasperreports so usados para representar as etapas do processo de gerao de relatrios: JasperDesign: Representa a definio do relatrio. A partir de um template XML criado um JasperDesign. JasperReport: Representa o JasperDesign compilado. O processo de compilao verifica o design do relatrio e compila o design em um JasperReport. JasperPrint: Representa o relatrio gerado. criado um JasperPrint a partir

de um JasperReport, contendo o relatrio preenchido.

Dados
Para produzir um relatrio precisamos fornecer dados ao Jasper. Esses dados podem ser consultas SQL inserida ao cdigo XML ou ser realizada por uma classe Java, gerando um objeto ResulSet, que ser passado s classes do Jasper para o preenchimento do relatrio. O JasperReports suporta vrios tipos de datasources (fonte de dados) atravs de uma interface especfica chamada JRDataSource. H uma implementao padro desta interface para objetos ResultSet, chamada JRResultSetDataSource. No linguajar Jasper", um datasource somado a um arquivo .jasper gera um "print", que pode ser "exportado" para os formatos PDF, HTML, XML, CVS ou XLS.

Campos, Parmetros, Variveis e Expresses


Campos (Fields) so reas especficas que recebero diretamente os dados das respectivas colunas referenciadas. Por exemplo, para os dados da coluna Nome do tipo VARCHAR, da tabela Cliente, serem mapeados para o

relatrio, um campo Nome deve ser definido no arquivo XML da seguinte forma:
<field name=Nome class=java.lang.String/>

Parmetros so dados passados para a operao de preenchimento, que no podem ser encontrados normalmente na fonte de dados. So declarados, por exemplo, da seguinte forma:
<parameter name=TituloDoRelatorio class=java.lang.String/>

E passados via cdigo Java, atravs da classe HashMap:


Map parametros = new HashMap( ); parametros.put( Cliente, Aluno DACA );

Outra importante utilizao de parmetros na query do relatrio. Por exemplo:


Select * FROM CLIENTE WHERE CLIENTE=$P{Cliente}

Variveis so utilizadas para armazenar resultados temporrios necessrios para gerao do relatrio. Elas podem referenciar tipos internos de clculos, como contagem (count), soma (sum), mdia (average), menor (lowest), maior (highest), etc. Por exemplo, o clculo do valor total da compra:
<variable name=ValorTotalCompraSum class=java.lang.Double calculation=Sum> <variable expression> ${ValorProduto} </variable expression> </variable>

A ordem em que as variveis so declaradas no relatrio importante. Podemos definir o nvel no qual uma varivel ir ser inicializada. Pode ser no incio do relatrio (uma nica vez), a cada pgina, coluna ou grupo.
<variable name=ValorTotalCompraSum class=java.lang.Double resetType=Page calculation=Sum> <variable expression> ${ValorProduto} </variable expression> <initialValueExpression> new Double( 0 ) </initialValueExpression> </variable>

Existem tambm variveis internas da ferramenta, com nomes auto-explicativos, prontas para o uso nas expresses: PAGE_NUMBER, COLUMN_NUMBER, REPORT_COUNT, PAGE_COUNT, COLUMN_COUNT. Expresses (Expressions) so utilizadas para especificar o contedo de campos de texto, na realizao de clculos freqentes, por exemplo. Todas elas so expresses Java que podem conter em sua sintaxe: campos: acessado com $F{nome} parmetros: acessado com $P{nome} variveis de relatrio: acessado com $V{nome}.

Exemplo de uma expresso:


<textFieldExpression> Sr.(a) + $F{Cliente} + " realizou um total de compras no valor de " + $V{ValorTotalCompraSum} + " no dia " + (new SimpleDateFormat("dd/MM/yyyy")).format($F{DataCompra }) + "." </textFieldExpression>

Layout
O JasperReports divide o layout do relatrio em reas pr-definidas, chamadas sees. As sees levam em considero a estrutura visual de um relatrio. So elas: backgroud, title, pageHeader, columnHeader, detail, columnFoter, pageFooter, lastPageFooter e summary.

API

Classe dori.jasper.engine.design.JasperDesign

Instncias dessa classe representam o relatrio no seu formato mais primitivo. So resultados de um processamento sobre o arquivo XML. Classe dori.jasper.engine.JasperReport Instncias dessa classe representam relatrios compilados. Nesse estgio, toda a anlise sinttica nas expresses existentes no XML j foram realizadas. Objetos dessa classe podem ser armazenados em arquivos .jasper. Classe dori.jasper.engine.JasperCompileManager Responsvel por criar instncias das classes JasperReport e JasperDesign. Classe dori.jasper.engine.JasperPrint Consiste no JasperReport com todos os campos preenchidos. Um objeto dessa classe pode ser visualizado diretamente utilizando visualizadores internos do JasperReport, como tambm pode ser transformado em formatos mais populares como HTML, XML ou PDF. Interface dori.jasper.engine.JRDataSource Essa interface padroniza o comportamento das classes que manipulam as fontes de dados necessrias durante o preenchimento dos campos existentes no JasperReport. Dessa forma, vrias fontes podem ser utilizadas, seja um banco de dados, ou mesmo um arquivo XML.

Entre as classes que implementam essa interface; podemos citar: dori.jasper.engine.JRResultSetDa taSource (acessa um banco de dados) dori.jasper.engine.data.JRTableM odelDataSource (acessa tabelas j carregadas em interfaces swing) dori.jasper.engine.JREmptyDataSo urce (no acessa nenhuma fonte de dados, utilizada quando se deseja criar um JasperPrint sem acessar nenhuma fonte de dados). Classe dori.jasper.engine.JasperFillManager Essa classe utilizada para gerar instncias da classe JasperPrint. Em seu processamento, ela utiliza uma fonte de dados (JRDataSource) e uma instncia da classe JasperReport. Classe dori.jasper.engine.JasperPrintManager Permite imprimir o relatrio (o contedo do relatrio enviado para impressora, uma janela de requisio de impresso aberta). Tanto possvel imprimir todo o relatrio como tambm pginas do mesmo. Alm disso, possvel imprimir o relatrio como uma imagem ( utilizando o mtodo printPageToImage)!

Classe dori.jasper.engine.JasperExportManager Permite gerar documentos nos formatos PDF, HTML e XML (verso 1.0). Com o tempo, novos formatos sero incorporados.

Exemplo completo
import import import import import import import java.sql.Connection; java.sql.DriverManager; java.sql.ResultSet; java.sql.SQLException; java.sql.Statement; java.util.HashMap; java.util.Map;

import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRResultSetDataSource; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.design.JasperDesign; import net.sf.jasperreports.engine.xml.JRXmlLoader; import net.sf.jasperreports.view.JasperViewer;

public class JasperReportExemple {

private static final String url = "jdbc:mysql://127.0.0.1/teste"; private static final String driver = "com.mysql.jdbc.Driver"; private static final String login = ""; private static final String pwd = "";

public JasperReportExemple() { }

public void gerar( String layout ) throws JRException , SQLException, ClassNotFoundException { //gerando o jasper design JasperDesign desenho = JRXmlLoader.load( layout );

//compila o relatrio JasperReport relatorio = JasperCompileManager.compileReport( desenho );

//estabelece conexo Class.forName( driver ); Connection con = DriverManager.getConnection( url , login , pwd ); Statement stm = con.createStatement(); String query = "select * from turma"; ResultSet rs = stm.executeQuery( query );

//implementao da interface JRDataSource para DataSource ResultSet JRResultSetDataSource jrRS = new JRResultSetDataSource( rs );

//executa o relatrio Map parametros = new HashMap(); parametros.put("nota", new Double(10)); JasperPrint impressao = JasperFillManager.fillReport( relatorio , parametros, jrRS );

//exibe o resultado JasperViewer viewer = new JasperViewer( impressao , true ); viewer.show(); }

public static void main(String[] args) { try { new JasperReportExemple().gerar( "report.jrxml" ); } catch (Exception e) { e.printStackTrace(); } } }

Tabela turma

Sada

Cdigo XML
Arquivo report.jrxml (clique aqui!) utilizado no exemplo anterior.

Problemas

Dificuldade na escrita do documento XML.

IReport
O iReport uma ferramenta que permite definir o design do relatrio dentro de um ambiente grfico, contento todos os recursos que a biblioteca Jasper oferece. possvel definir relatrios com designs modernos e complexos sem se quer escrever uma linha de cdigo XML, que todo gerado automaticamente. O ambiente oferece atalhos para tarefas de compilao e visualizao do relatrio, permitindo a realizao de testes.

Definindo uma fonte de dados


Para acessar uma fonte de dados, necessrio criar inicialmente uma Conexo. 1) Selecione o menu Fonte de dados >> Conexes /Fonte de dados. A janela que aparece lista todas as fontes de dados e conexes JDBC que voc define. Clique no boto New para criar uma nova conexo.

2) Na janela que aparece escolha o tipo de conexo (no nosso caso Database JDBC Connection). Na mesma janela d um nome conexo. Por exemplo, DacaDataSource. 3) No campo JDBC Driver, selecione o driver do seu banco. Caso no esteja listado, como no nosso caso, especifique um de acordo com o seu SGBD. 4) Em JDBC URL digitamos o caminho para a nossa base de dados: jdbc:mysql://localhost/teste. A sintaxe da URL difere de SGBD para SGBD, consulte a documentao de seu banco para saber a sintaxe exata. Repare tambm no caminho para a base de dados. 5) Em Server Address digite o caminho para servidor de banco de dados, no nosso caso localhost. Temos a possibilidade de salvar a senha marcando a opo Save password.

Testando a conexo com o banco de dados (boto Test).

Criando um relatrio
1) Menu Arquivo >> Novo documento 2) Ir aparecer a seguinte janela:

3) Para inserir um texto esttico, basta pressionar o boto e clicar no local onde se deseja inserir o texto. Aparecer a seguinte tela:

4) Para inserir textos dinmicos recuperados em um banco de dados, devemos fazer o seguinte: a) Conhecer o nome das colunas da tabela onde os dados encontram-se armazenados.

O iReport permite a insero do SQL no cdigo XML atravs do menu Fonte de dados>> Consultas do relatrio. possvel levantar os nomes das colunas de cada tabela existente no banco. Quando a consulta for realizada, todas as colunas passam a ser campos que podem ser utilizandos no relatrio a ser editado.

5) Para visualizar os Campos que podem ser utilizados durante a edio do relatrios, ver menu "Visualizar >> Campos do Relatrio ...".

Nessa mesma tela possvel visualizar as variveis e parmetros que podem ser visualizados. Vamos criar o parmetro nota. Menu Visualizar >> Parmetros do relatrio. A seguinte tela ir abrir:

Para criar, clique em New

Digite na tela que vai aparecer o nome do parmetro e seu valor (observe que o valor do parmetro escrito em Java).

6) Para inserir o campo mapeado no relatrio, basta pressionar o boto e clicar no local onde se deseja inserir o texto no relatrio. Aparecer a seguinte tela:

Observe que $F{nome}, implica que o campo ser preenchido quando o relatrio for gerado com os dados recuperados na coluna nome da tabela turma do banco de dados. Note que sero impressos os nomes selecionados pela consulta cadastrada no iReport (select * from turma). 7) Podemos tambm criar expresses para efetuar clculos ou formataes sobre os dados provenientes das colunas mapeadas, assim como, optar a que nvel executar esta expresso. Veja um exemplo:

No primeiro, no campo Evaluation time, escolhemos o nvel de execuo Now, que considerar a pgina atual e para o segundo field, o nvel Report, que significa que a varivel ser inicializada somente uma vez, no comeo do relatrio, e que executa o clculo

especificado at que o fim do relatrio seja alcanado, ou seja, a quantidade de total de pginas. 8) Vamos agora ver como ficou a cara do nosso relatrio!

Exemplo de cdigo

public class IReportExemple { private static final String url = "jdbc:mysql://127.0.0.1/teste"; private static final String driver = "com.mysql.jdbc.Driver"; private static final String login = ""; private static final String pwd = "";

public IReportExemple() { }

public void gerar( String jasperFile ) throws JRException , SQLException, ClassNotFoundException {

Class.forName( driver ); Connection con = DriverManager.getConnection( url , login , pwd ); Statement stm = con.createStatement(); String query = "select * from turma"; ResultSet rs = stm.executeQuery( query );

//implementao da interface JRDataSource para DataSource ResultSet JRResultSetDataSource jrRS = new JRResultSetDataSource( rs );

//executa o relatrio Map parametros = new HashMap();

parametros.put("nota", new Double(10));

/* Preenche o relatrio com os dados. Gera o arquivo BibliotecaPessoal.jrprint */ JasperFillManager.fillReportToFile( jasperFile, parametros, jrRS );

/* Exporta para o formato PDF */ JasperExportManager.exportReportToPdfFile( "untitled_report_1.jrprint" ); }

public static void main(String[] args) { try { new IReportExemple().gerar( "untitled_report_1.jasper" ); } catch (Exception e) { e.printStackTrace(); } } }

Exemplo de relatrios junto com aplicaes WEB


public class Relatorio extends HttpServlet {

protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)

throws ServletException, IOException { doPost(arg0, arg1); }

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

// Na variavel pathJasper ficara o caminho do diretrio para // os relatrios compilados (.jasper) String pathJasper = getServletContext().getRealPath( "/WEBINF/classes/br/eti/furutani/") + "/";

// A variavel path armazena o caminho real para o contexto // isso util pois o seu web container pode estar instalado em lugares diferentes String path = getServletContext().getRealPath("/");

. . .

try { // Aqui ele cria o relatrio JasperPrint impressao = JasperFillManager.fillReport(pathJasper + "jasperfile.jasper", parametros, con); // Grava o relatrio em disco em pdf JasperManager.printReportToPdfFile(impressao,

path + "/RelatorioLivros.pdf"); // Redireciona para o pdf gerado res.sendRedirect("RelatorioLivros.pdf"); } catch (Exception e) { res.getWriter().println("Erro ao gerar o relatrio: " + e); } } }

Links importantes
http://ireport.sourceforge.net/ http://jasperreports.sourceforge.net/
M ap
M

elhores c artir d
ais c

orrespondncias p eu ma c

ara g

erar u ava

ma

rquivo c

sv

onsulta j

orrespondncias