Olá Pessoal, tudo bom?
O post de hoje é relacionado a criação de um projeto básico em Java utilizando o controlador de dependências de bibliotecas Maven e adicionando a biblioteca Jasper Reports. Utilizaremos o post básico de criação de um projeto Maven, assim iremos continuar o projeto lá criado. Além disso descrevei um pouco sobre o Jasper Reports. Veja na continuação desse post…
Jasper Reports – definição
Existem várias bibliotecas que geram relatórios, mas para o dia a dia de uma empresa o mais comum é utilizar a biblioteca do Jasper Reports por ser open source. A biblioteca Jasper Reports é especializada na geração de documentos nos mais diversos formatos como pdfs, docs, xls. Ela pode gerar gráficos através da biblioteca JFreeChart e utilizar-se de subrelatórios, cabeçalhos e rodapés, facilitando assim o reuso desses arquivos. Nós temos duas frentes de trabalho ao utilizar a biblioteca, a primeira é o editor gráfico de relatórios, que veremos em outros posts, e a segunda é a utilização dos arquivos gerados pelo editor dentro da aplicação Java. Para o post de hoje iremos utilizar um arquivo .jasper já pronto.
Existem diversos formatos de arquivos gerados pela biblioteca. O primeiro, básico que o editor gera é um xml no formato próprio para a leitura pelo editor. Esse arquivo possui o formato jrxml (Jasper Report XML). Ele é um xml básico, com o schema de acordo com o formato Jasper.
Dentro do editor é possível compilar esse jrxml, gerando assim um arquivo no formato jasper. Essa compilação também pode ser automatizada via Maven, veremos isso com mais detalhes em outros posts.
Após gerado o jasper, dentro da aplicação Java é possível gerar o formato jrprint, o qual está preparado para gerar qualquer tipo de documento, seja pdf, doc, xls ou outros formatos. A Figura 01 abaixo exemplifica esse padrão de geração de arquivos pela biblioteca Jasper Reports.
Incluindo Jasper Reports em um Projeto Básico no Eclipse
O primeiro ponto é criar o projeto básico do Maven conforme o post relacionado.
Depois de criado, é hora de começar a adaptação nos arquivos desse projeto a fim de utilizar a biblioteca Jasper Reports.
Alterando o pom.xml
Abra o arquivo pom.xml, que se encontra na raiz do projeto. Adicione a dependência do Jasper Reports. Vamos adicionar a ultima versão estável, 6.4.0. O código destacado abaixo acrescenta essa dependência:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.4.0</version> </dependency> </dependencies> |
Pronto, com esses códigos o maven irá adicionar a dependência do Jasper Reports ao projeto. Agora vamos alterar outros pontos para poder testá-la.
Criação da pasta reports e copia dos Arquivos
Todos os arquivos utilizados pelo Jasper Reports serão armazenados na pasta Reports. Assim devemos criar uma folder (não lembra? aqui) dentro da raiz do projeto de nome reports. Agora você deverá copiar para dentro dessa pasta os dois arquivos abaixo:
- relatorioTeste.jrxml (link para download)
- relatorioTeste.jasper (link para download)
Alteração da classe App
A classe App já criada anteriormente pelo Maven, deverá ser alterada, pois não realiza o teste necessário para a geração do PDF via Jasper Reports. As seguintes alterações deverão ser realizadas:
- Acrescentar os imports das linhas 3 a 6;
- Remover a linha System.out.println( “Hello World!” );
- Em seu lugar acrescentar as linhas 15 a 27 do código que servem para criar o relatório no formato PDF;
- Adicionar o throws JRException na linha 13 na declaração do método main;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package br.com.mauda.SeminariosCientificos; import net.sf.jasperreports.engine.JREmptyDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; /** * Hello world! * */ public class App { public static void main(String[] args) throws JRException { //Obtem o valor atual do sistema long inicioContagem = System.currentTimeMillis(); //Compilacao no formato jasper para o jrprint JasperFillManager.fillReportToFile("reports/relatorioTeste.jasper", null, new JREmptyDataSource(1)); System.err.println("Tempo de compilacao jasper -> jrprint: " + (System.currentTimeMillis() - inicioContagem)); //Reinicia o contador inicioContagem = System.currentTimeMillis(); //Geracao do PDF JasperExportManager.exportReportToPdfFile("reports/relatorioTeste.jrprint"); System.err.println("Tempo de geracao do PDF: " + (System.currentTimeMillis() - inicioContagem)); } } |
É interessante observar que criamos um arquivo jrprint para podermos gerar o relatório PDF. Como não colocamos a pasta de destino o pdf gerado estará na mesma pasta dos fontes originais, reports. Se você der um refresh (F5) nessa pasta aparecerão os arquivos gerados pela execução dessa classe.
Alteração da classe AppTest
A classe AppTest já criada anteriormente pelo Maven, deverá ser alterada, pois não realiza o teste necessário para gerar o relatório via Jasper Reports. As seguintes alterações deverão ser realizadas:
- Remoção de todos os testes unitários anteriores;
- Acrescentar os imports das linhas 3 a 8;
- Adição do método de teste descrito nas linhas 15 a 30;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package br.com.mauda.SeminariosCientificos; import org.junit.Test; import net.sf.jasperreports.engine.JREmptyDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; /** * Unit test for simple App. */ public class AppTest{ @Test public void teste() throws JRException{ //Obtem o valor atual do sistema long inicioContagem = System.currentTimeMillis(); //Compilacao no formato jasper para o jrprint JasperFillManager.fillReportToFile("reports/relatorioTeste.jasper", null, new JREmptyDataSource(1)); System.err.println("Tempo de compilacao jasper -> jrprint: " + (System.currentTimeMillis() - inicioContagem)); //Reinicia o contador inicioContagem = System.currentTimeMillis(); //Geracao do PDF JasperExportManager.exportReportToPdfFile("reports/relatorioTeste.jrprint"); System.err.println("Tempo de geracao do PDF: " + (System.currentTimeMillis() - inicioContagem)); } } |
Esse teste unitário é basicamente igual ao da classe main. Apenas aqui estamos mostrando as duas formas de realizar a geração. Seja via main ou teste JUnit.
Estado do Projeto
Abaixo na Figura 02, temos as pastas e arquivos que foram criados no projeto. Utilize essa imagem para verificar se seu projeto está parecido com o da figura.
Executando a classe App
Clique na classe App com o botão direito do mouse, vá em run > Java Application e o java irá executar o método main da classe App. Caso esteja tudo certo irá aparecer as seguintes mensagens do console da aplicação:
1 2 |
Tempo de compilacao jasper -> jrprint: 2682 Tempo de geracao do PDF: 650 |
Os tempos de execução para cada item. Lembrando que esse tempo é em milisegundos. Se você observar a pasta reports aparecerão dois novos arquivos um relatorioTeste.jrprint e outro relatorioTeste.pdf. Abrindo o pdf haverão 3 textos:
- Titulo
- Texto do Detail
- Rodape
Executando a classe AppTest
A classe AppTest possui um método de teste para gerar o mesmo pdf da execução acima. Assim as mesmas observações ditas ali valem aqui. Esse teste foi construído para rodar na ferramenta JUnit. Caso não conheça a ferramenta há um tutorial aqui.
finally{
Em posts futuros irei descrever melhor as constraints de validação (annotations) e outros aspectos do Bean Validation
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Wesley says
Cara vc me salvou kkkk estou a 2 dias tentando gerar um teste 😀
Mauda says
Olá Wesley, tudo bom?
Que bom que foi de grande ajuda!
Precisando estamos aqui!
Obrigado pelo feedback!
Luciano Mendel says
Muito bacana seu artigo, parabéns.
Mauda says
Olá Luciano, tudo bom?
Obrigado pelo feedback!
Precisando estamos por aqui!
Obrigado!