Olá desenvolvedores, hoje iremos falar sobre o iReport uma ferramenta Front-End para o jasperReports o verdadeiro responsável pela geração de relatórios. O jasperReports é considerado um mecanismo de inteligência de negócios e relatórios de código aberto mais popular do mundo. Ele suporta scriptlets, tem integração com JFreeChart para renderizar gráficos e com o Barbecue para gerar código de barras.
Entenda, seguindo um padrão o jasperReports é inteiramente escrito em Java e é capaz de usar dados provenientes de qualquer tipo de fonte de dados e gerar relatórios a partir de arquivo XML. E estes arquivos poderão ser visualizados, impressos ou exportados em uma variedade de formatos de documento, incluindo HTML, PDF, Excel, OpenOffice e Word.
No entanto, é o iReport quem cria este arquivo XML de forma gráfica. O objetivo da série de tutoriais que começamos hoje tem o objetivo de ensinar a utilizar o iReport para criar tais relatórios. Mas antes, porém, é preciso criar a estrutura necessária.
ESTRUTURANDO O PROJETO
Crie um package relatorios para receber os arquivos de relatório que são os arquivos do iReport que será utilizado para fazer a geração de relatórios que serão exportados ou para pdf ou para Excel. E crie também um package service para armazenarmos classes que irão prover um dado serviço para a aplicação.
Na raiz da pasta src(source) crie um pacote chamado de “relatório”. E para que possamos trabalhar com relatórios com o iReport é preciso importar a biblioteca do jasperReports. Clique aqui para fazer o download da biblioteca. Depois de fazer o download e adicionar o jasperReports na subpasta lib clique sobre ele com o botão direito do mouse >> Build Path >> Add to Build Path.
CLASSES DO PROJETO
Estamos chamando de classes do projeto as classes que estão diretamente ligadas ao cenário da geração de relatório. Dessa forma, no pacote de serviços crie a classe RelatorioService que deverá implementar o Serializable.
Serializable ou serialização é entendido como um processo de tradução de estruturas de dados ou estado de objeto em um formato que possa ser armazenado ou transmitido por meio de um enlace de conexão de rede e reconstruído posteriormente no mesmo ou em outro ambiente. Isto é, o processo de serialização ocorre quando um objeto é transformado em uma cadeia de bytes e dessa forma pode ser manipulado de uma maneira mais fácil. Veja abaixo como fica a assinatura da classe.
O passo seguinte é definir a variável que representará a pasta de relatórios que criamos dentro da subpasta src (source). Está variável deverá ser também FINAL, isto é, uma forma de garantir que seu valor não será modificado arbitrariamente.
E nos antecipando já preparemos a variável que representará os sub relatórios, utilizados quando há registros de um para muitos. E por fim definiremos o separador, utilizado no contexto onde se trabalha com arquivos. Este separator nada mais é que a barra (/) muito comuns em URLs.
Assim, teremos também uma variável para o caminho do arquivo, isto é, do relatório que será inicializado como null. Uma variável para exportação de arquivos, JRExporter do pacote net.sf.jasperreports.engine. O caminho do sub relatórios e outra variável para representar o arquivo gerado.
MÉTODO DE GERAÇÃO DE RELATÓRIO
E depois de criadas e instanciadas as variáveis, o passo a seguir é criar o método geraRelatorio() que será o responsável por gerar o relatório e retornar o caminho do relatório gerado.
O método gerarRelatório () receberá como parâmetro a lista de dados. E como cada elemento de uma lista possui uma chave e um valor associado, o segundo parâmetro do método será um HashMap. O terceiro parâmetro será o nome do relatório Jasper, e o próximo o nome de saída para o relatório e por fim o ServletContext que define um conjunto de métodos que uma servlet utiliza para se comunicar.
No escopo do método instancie a lista que carregará os dados para o relatório, a lista de Bean Collections DataSource, que receberá como argumento uma lista de objetos.
JRBeanCollectionDataSource jrbcds = new JRBeanCollectionDataSource (listaDataBeanColletion);
“PEGANDO” CAMINHO DO RELATÓRIO
Agora é preciso descobrir o caminho físico do arquivo Jasper. Este caminho será invocado pelo parâmetro servletContext que o recupera da variável FOLDER_RELATÓRIOS, que é a pasta que contém os relatórios .jasper.
String caminhoRelatorio = servletContext.getRealPath(FOLDER_RELATORIOS);
E então montaremos o arquivo que representará o relatório .jasper. Para instanciaremos o arquivo que receberá o caminho do arquivo, adicionará o separador e o nome do relatório mais a sua extensão (.jasper). Todas essas informações serão passadas concatenadas.
File file = new File(caminhoRelatorio + SEARATOR + nomeRelatorioJasper + “.jasper”);
O passo seguinte é uma verificação que procurará o arquivo em outro lugar se o caminho do relatório não existir ou se este caminho for diferente de nulo, porém vazio ou ainda, se o arquivo não existir.
E se eu quiser adicionar imagens ao relatório, é possível? Sim, neste caso é necessário passar alguns parâmetros para o relatório.
parametrosRelatorio.put(“REPORT_PARAMETERS_IMG”, caminhoRelatotio);
Definimos acima duas formas para que o caminho do relatório seja corretamente identificado. Assim sendo, tendo o caminho correto é hora de montar o caminho completo até o relatório compilado indicado.
Dessa forma a variável do tipo String caminhoArquivoJasper irá receber de forma concatenada o caminho do relatório, o separador, o nome do relatório e a extensão do arquivo.
String caminhoArquivoJasper = caminhoRelatorio + SERATOR + nomeRelatorioJasper + “.jasper”;
Então precisamos agora carregar o relatório, utilizando a biblioteca Jasper para carregar o arquivo.
JasperReport relatorioJasper = (JasperReport) JRLoader.loadObjectFromFile(caminhoArquivoJasper);
E por fim “setaremos” os parâmetros do caminho físico para o SUBREPORT_DIR e então carregar o arquivo compilado para a memória.
Este arquivo compilado receberá como argumento o relatório jasper, os parâmetros do relatório e a fonte de dados que é a lista jrbcds.
JasperPrint impressoraJasper = JasperFillManager.fillReport(relatorioJasper, parametrosRelatorio, jrbcds);
DEFININDO O TIPO DE ARQUIVO
Agora definiremos o tipo de relatório que será exportado, se PDF ou arquivo do Excel, por exemplo. E claro, estabeleceremos uma variável para receber o caminho do relatório exportado, que como você já deve ter se habituado, virá concatenado do separador. Mas agora teremos o nome de saída do relatório, porém, a extensão não mais será .jasper, mas sim .pdf.
Criaremos então o arquivo de relatório, que á o arquivo que será exportado que receberá o caminho completo do arquivo compilado. E com o Exporter preparemos o arquivo para impressão, daremos um nome de saída para ele e executaremos a exportação.
E para não ocuparmos espaço no servidor desnecessariamente deletaremos do servidor o arquivo gerado. E retornaremos o caminho do arquivo de relatório;
arquivoGerado.deleteOnExit();
return caminhoArquivoRelatorio;
EM POUCAS PALAVARAS
Então já temos implementado o método para fazer a exportação do arquivo de relatório. No próximo tutorial, na servlet invocaremos este método completando a exportação. Eu fico por aqui e nos vemos na parte dois deste tutorial sobre iReport.