Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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.
http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/documentviews/relatorios.htm 29/06/2010
Relatórios em Java Página 2 de 10
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”/>
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.
http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/documentviews/relatorios.htm 29/06/2010
Relatórios em Java Página 3 de 10
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.JRResultSetDataSource (acessa um banco de dados)
dori.jasper.engine.data.JRTableModelDataSource (acessa tabelas já
carregadas em interfaces swing)
dori.jasper.engine.JREmptyDataSource (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.
http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/documentviews/relatorios.htm 29/06/2010
Relatórios em Java Página 4 de 10
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 JasperReportExemple() {
}
//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 );
//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();
}
Tabela turma
Saída
http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/documentviews/relatorios.htm 29/06/2010
Relatórios em Java Página 5 de 10
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.
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”.
http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/documentviews/relatorios.htm 29/06/2010
Relatórios em Java Página 6 de 10
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”.
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:
http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/documentviews/relatorios.htm 29/06/2010
Relatórios em Java Página 7 de 10
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:
http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/documentviews/relatorios.htm 29/06/2010
Relatórios em Java Página 8 de 10
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:
http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/documentviews/relatorios.htm 29/06/2010
Relatórios em Java Página 9 de 10
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() {
}
Class.forName( driver );
Connection con = DriverManager.getConnection( url , login , pwd );
Statement stm = con.createStatement();
String query = "select * from turma";
ResultSet rs = stm.executeQuery( query );
http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/documentviews/relatorios.htm 29/06/2010
Relatórios em Java Página 10 de 10
//executa o relatório
Map parametros = new HashMap();
parametros.put("nota", new Double(10));
. . .
try {
// Aqui ele cria o relatório
JasperPrint impressao = JasperFillManager.fillReport(pathJasper
+ "jasperfile.jasper", parametros, con);
Links importantes
· http://ireport.sourceforge.net/
· http://jasperreports.sourceforge.net/
http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/documentviews/relatorios.htm 29/06/2010