Você está na página 1de 25

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.

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

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}.

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

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.

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

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 {

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

//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

Saída
Código 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 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.

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

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.

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 ...".
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

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:

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

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)
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,
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/

Você também pode gostar