25
Document Views O problema Queremos gerar documentos bem formatados! Queremos imprimir documentos e ter controle sobre o que será impresso em cada página! Páginas web não permitem formatar corretamente relatórios! Não é possível, por exemplo, imprimir páginas web e ter controle do que será impresso no rodapé de cada página! Falaremos aqui sobre o engine de geração de relatórios JasperReports e o desenhador de layouts iReport. Essas duas ferramentas juntas fornecem um ambiente poderoso para o desenvolvimento de relatórios, tanto em aplicações WEB como em Desktop. O iReport é uma ferramenta para facilitar os testes e principalmente facilitar a criação do layout dos relatórios. Mas quem gera de fato os relatórios em pdf, xls, html e outros formatos é o JasperReports. JasperReports O JasperReports é um poderoso framwork open- source escrito em Java para geração de relatórios. Ele permite gerar dinamicamente relatórios em diversos formatos; entre eles: PDF, HTML, XLS, CSV e XML.

Relatório com jasper Ireport

Embed Size (px)

Citation preview

Page 1: Relatório com jasper Ireport

Document Views

O problema

Queremos gerar documentos bem formatados! Queremos imprimir documentos e ter controle sobre o que será impresso em cada página!

Páginas web não permitem formatar corretamente relatórios!

Não é possível, por exemplo, imprimir páginas web e ter controle do que será impresso no rodapé de cada página!

Falaremos aqui sobre o engine de geração de relatórios JasperReports e o desenhador de layouts iReport. Essas duas ferramentas juntas

fornecem um ambiente poderoso para o desenvolvimento de relatórios, tanto em aplicações WEB como em Desktop.

O iReport é uma ferramenta para facilitar os testes e principalmente facilitar a criação do layout dos relatórios. Mas quem gera de fato os relatórios em pdf, xls, html e outros formatos é o JasperReports.

JasperReports

O JasperReports é um poderoso framwork open-source escrito em Java para geração de relatórios. Ele permite gerar dinamicamente relatórios em diversos formatos; entre eles: PDF, HTML, XLS, CSV e XML.

Page 2: Relatório com jasper Ireport

Funcionamento

O design do relatório (localização 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 estáticos, imagens, linhas e formas geométricas, como retângulos e elipses, e suas localizações dentro do relatório.

Além disso, pode-se ainda definir os campos que

serão preenchidos dinamicamente a partir de uma base de dados.

O arquivo XML é compilado gerando um arquivo .jasper, onde as expressões Java existentes dentro do XML serão verificadas em tempo de compilação.

Diferentes objetos Jasperreports são usados para representar as etapas do processo de geração de relatórios:

JasperDesign: Representa a definição do relatório. A partir de um template XML é criado um JasperDesign.

JasperReport: Representa o JasperDesign compilado. O processo de compilação verifica o design do relatório e compila o design em um JasperReport.

JasperPrint: Representa o relatório gerado. É criado um JasperPrint a partir

Page 3: Relatório com jasper Ireport

de um JasperReport, contendo o relatório preenchido.

Dados

Para produzir um relatório precisamos fornecer dados ao Jasper.

Esses dados podem ser consultas SQL inserida

ao código XML ou ser realizada por uma classe Java, gerando um objeto ResulSet, que será passado às classes do Jasper para o preenchimento do relatório.

O JasperReports suporta vários tipos de datasources (fonte de dados) através de uma interface específica chamada JRDataSource.

Há uma implementação padrão 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, Parâmetros, Variáveis e

Expressões

Campos (Fields) são “áreas específicas” que

receberão 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

Page 4: Relatório com jasper Ireport

relatório, um campo Nome deve ser definido no arquivo XML da seguinte forma:

<field name=”Nome” class=”java.lang.String”/>

Parâmetros são dados passados para a

operação de preenchimento, que não podem ser encontrados normalmente na fonte de dados. São declarados, por exemplo, da seguinte forma:

<parameter name=”TituloDoRelatorio”

class=”java.lang.String”/>

E passados via código Java, através da classe HashMap:

Map parametros = new HashMap( );

parametros.put( “Cliente”, “Aluno DACA” );

Outra importante utilização de parâmetros é na query do relatório. Por exemplo:

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

Variáveis são utilizadas para armazenar

resultados temporários necessários para geração do relatório. Elas podem referenciar tipos

internos de cálculos, como contagem (count), soma (sum), média (average), menor (lowest), maior (highest), etc.

Por exemplo, o cálculo do valor total da compra:

<variable name=”ValorTotalCompraSum”

class=”java.lang.Double” calculation=”Sum”>

<variable expression> ${ValorProduto}

</variable expression>

</variable>

Page 5: Relatório com jasper Ireport

A ordem em que as variáveis são declaradas no relatório é importante.

Podemos definir o nível no qual uma variável irá

ser inicializada. Pode ser no início do relatório (uma única vez), a cada página, 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 também variáveis internas da

ferramenta, com nomes “auto-explicativos”, prontas para o uso nas expressões: PAGE_NUMBER, COLUMN_NUMBER,

REPORT_COUNT, PAGE_COUNT, COLUMN_COUNT.

Expressões (Expressions) são utilizadas para especificar o conteúdo de campos de texto, na realização de cálculos freqüentes, por exemplo.

Todas elas são expressões Java que podem conter em sua sintaxe:

campos: acessado com $F{nome}

parâmetros: acessado com $P{nome}

variáveis de relatório: acessado com

$V{nome}.

Page 6: Relatório com jasper Ireport

Exemplo de uma expressão:

<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 relatório em áreas “pré-definidas”, chamadas seções.

As seções levam em considerção a estrutura visual de um relatório. São elas: backgroud, title, pageHeader, columnHeader, detail,

columnFoter, pageFooter, lastPageFooter e summary.

API

Classe dori.jasper.engine.design.JasperDesign

Page 7: Relatório com jasper Ireport

Instâncias dessa classe representam o relatório

no seu formato mais primitivo. São resultados de um processamento sobre o arquivo XML.

Classe dori.jasper.engine.JasperReport

Instâncias dessa classe representam relatórios compilados. Nesse estágio, toda a análise

sintática nas expressões existentes no XML já foram realizadas. Objetos dessa classe podem ser armazenados em arquivos .jasper.

Classe dori.jasper.engine.JasperCompileManager

Responsável por criar instâncias 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 também 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 necessárias durante o preenchimento dos campos existentes no JasperReport. Dessa

forma, várias fontes podem ser utilizadas, seja um banco de dados, ou mesmo um arquivo XML.

Page 8: Relatório com jasper Ireport

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 (não 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 instâncias da classe JasperPrint. Em seu processamento, ela

utiliza uma fonte de dados (JRDataSource) e

uma instância da classe JasperReport.

Classe dori.jasper.engine.JasperPrintManager

Permite imprimir o relatório (o conteúdo do relatório é enviado para impressora, uma janela de requisição de impressão é aberta). Tanto é possível imprimir todo o relatório como também páginas do mesmo.

Além disso, é possível imprimir o relatório como

uma imagem ( utilizando o método

printPageToImage)!

Page 9: Relatório com jasper Ireport

Classe dori.jasper.engine.JasperExportManager

Permite gerar documentos nos formatos PDF, HTML e XML (versão 1.0). Com o tempo, novos formatos serão incorporados.

Exemplo completo

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.HashMap;

import 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 {

Page 10: Relatório com jasper Ireport

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 relatório

JasperReport relatorio =

JasperCompileManager.compileReport( desenho );

//estabelece conexão

Class.forName( driver );

Connection con =

DriverManager.getConnection( url , login , pwd );

Statement stm = con.createStatement();

String query = "select * from turma";

ResultSet rs = stm.executeQuery( query );

Page 11: Relatório com jasper Ireport

//implementação da interface JRDataSource

para DataSource ResultSet

JRResultSetDataSource jrRS = new

JRResultSetDataSource( rs );

//executa o relatório

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

Page 12: Relatório com jasper Ireport

Saída

Código XML

Arquivo report.jrxml (clique aqui!) utilizado no

exemplo anterior.

Problemas

Page 13: Relatório com jasper Ireport

Dificuldade na escrita do documento XML.

IReport

O iReport é uma ferramenta que permite definir o design do relatório dentro de um ambiente

gráfico, contento “todos” os recursos que a biblioteca Jasper oferece.

É possível definir relatórios com designs modernos e complexos sem se quer escrever uma linha de código XML, que é todo gerado automaticamente.

O ambiente oferece atalhos para tarefas de compilação e visualização do relatório, permitindo a realização de testes.

Definindo uma fonte de dados

Para acessar uma fonte de dados, é necessário criar inicialmente uma Conexão.

1) Selecione o menu Fonte de dados >> Conexões /Fonte de dados. A janela que aparece lista todas as fontes de dados e

conexões JDBC que você define. Clique no botão New para criar uma nova conexão.

Page 14: Relatório com jasper Ireport

2) Na janela que aparece escolha o tipo de conexão (no nosso caso Database JDBC Connection). Na mesma janela dê um nome à conexão. Por exemplo, “DacaDataSource”.

3) No campo “JDBC Driver”, selecione o driver do seu banco. Caso não 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 documentação de seu banco para saber a sintaxe exata. Repare também 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 opção “Save password”.

Page 15: Relatório com jasper Ireport

Testando a conexão com o banco de dados (botão Test).

Criando um relatório

1) Menu Arquivo >> Novo documento

2) Irá aparecer a seguinte janela:

Page 16: Relatório com jasper Ireport

3) Para inserir um texto estático, basta

pressionar o botão e clicar no local onde se deseja inserir o texto. Aparecerá a seguinte tela:

4) Para inserir textos dinâmicos recuperados em um banco de dados, devemos fazer o seguinte:

a) Conhecer o nome das colunas da tabela onde os dados encontram-se armazenados.

Page 17: Relatório com jasper Ireport

O iReport permite a inserção do SQL no código

XML através do menu “Fonte de dados>> Consultas do relatório”. É possível 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 relatório a ser editado.

5) Para visualizar os Campos que podem ser utilizados durante a edição do relatórios, ver menu "Visualizar >> Campos do Relatório ...".

Page 18: Relatório com jasper Ireport

Nessa mesma tela é possível visualizar as variáveis e parâmetros que podem ser visualizados.

Vamos criar o parâmetro nota. Menu Visualizar >> Parâmetros do relatório. A seguinte tela irá abrir:

Para criar, clique em New

Page 19: Relatório com jasper Ireport

Digite na tela que vai aparecer o nome do

parâmetro e seu valor (observe que o valor do parâmetro é escrito em Java).

6) Para inserir o campo mapeado no relatório,

basta pressionar o botão e clicar no local onde

se deseja inserir o texto no relatório. Aparecerá a seguinte tela:

Page 20: Relatório com jasper Ireport

Observe que $F{nome}, implica que o campo

será preenchido quando o relatório for gerado

com os dados recuperados na coluna nome da

tabela turma do banco de dados.

Note que serão impressos os nomes selecionados

pela consulta cadastrada no iReport (select *

from turma).

7) Podemos também criar expressões para efetuar cálculos ou formatações sobre os dados provenientes das colunas mapeadas, assim como, optar a que nível executar esta expressão.

Veja um exemplo:

No primeiro, no campo “Evaluation time”, escolhemos o nível de execução “Now”, que considerará a página atual e para o segundo field, o nível “Report“, que significa que a variável será inicializada somente uma vez, no começo do relatório, e que executa o cálculo

Page 21: Relatório com jasper Ireport

especificado até que o fim do relatório seja

alcançado, ou seja, a quantidade de total de páginas.

8) Vamos agora ver como ficou a cara do nosso relatório!

Exemplo de código

Page 22: Relatório com jasper Ireport

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 );

//implementação da interface JRDataSource

para DataSource ResultSet

JRResultSetDataSource jrRS = new

JRResultSetDataSource( rs );

//executa o relatório

Map parametros = new HashMap();

Page 23: Relatório com jasper Ireport

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

/* Preenche o relatório 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 relatórios junto com aplicações WEB

public class Relatorio extends HttpServlet {

protected void doGet(HttpServletRequest arg0,

HttpServletResponse arg1)

Page 24: Relatório com jasper Ireport

throws ServletException, IOException {

doPost(arg0, arg1);

}

protected void doPost(HttpServletRequest req,

HttpServletResponse res)

throws ServletException, IOException {

// Na variavel pathJasper ficara o

caminho do diretório para

// os relatórios compilados (.jasper)

String pathJasper =

getServletContext().getRealPath(

"/WEB-

INF/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 relatório

JasperPrint impressao =

JasperFillManager.fillReport(pathJasper

+ "jasperfile.jasper",

parametros, con);

// Grava o relatório em disco em

pdf

JasperManager.printReportToPdfFile(impressao,

Page 25: Relatório com jasper Ireport

path

+ "/RelatorioLivros.pdf");

// Redireciona para o pdf gerado

res.sendRedirect("RelatorioLivros.pdf");

} catch (Exception e) {

res.getWriter().println("Erro ao

gerar o relatório: " + e);

}

}

}

Links importantes

· http://ireport.sourceforge.net/ · http://jasperreports.sourceforge.net/

M elhores c orrespondências p ara g erar u m a rquivo c sv

a p artir d e u ma c onsulta j ava

M ais c orrespondências »