Inicial > programação, programação JSF > Tutorial: Técnicas de Geração de Relatórios com JasperReports / iReport

Tutorial: Técnicas de Geração de Relatórios com JasperReports / iReport

Uma abordagem utilizando a ferramenta de design iReport

Por diversas vezes tenho me deparado com pessoas no CEJUG e em diversos fóruns Java com dificuldades na geração de relatórios com o JasperReports ou na utilização do iReport como ferramenta visual de diagramação dos documentos.

Foi então que tive a idéia de disponibilizar esse tutorial no meu blog que mostra como criar relatórios no iReport através de três técnicas: passando uma conexão com o banco de dados, passando um ResultSet (encapsulado na classe JRResultSetDataSource) e passando uma lista de objetos (encapsulada na classe JRBeanCollectionDataSource).

Além da demostração de como gerar os relatórios, mostro também o código Java correspondente de cada método, dou algumas dicas para modificar os textFields dos relatórios e outras de utilização do próprio iReport.

Resolvi também disponibilizar a aplicação que criei em JSF no formato zip e war. Bom proveito a todos.

Clique aqui para baixar o PDF do tutorial.

Clique aqui para baixar o projeto do Eclipse compactado (zip).
Clique aqui para baixar o projeto no formato war.

Anúncios
  1. 14/02/2009 às 15:09

    Agora da para ter uma boa noção de como iniciar os estudos com IReport, tenho certeza que será de grande valia para muitas pessoas que necessitam criar relatórios.

    Fiquei feliz que em seu primeiro post, você veio com todas as forças e poderes, para demonstrar um conteúdo tão necessário.

    Esta de Parabens.

    • 14/02/2009 às 17:37

      Ythalo, obrigado pelo seu comentário. O desafio agora é continuar atualizando o conteúdo.

  2. 16/02/2009 às 14:33

    Parabéns pela iniciativa Pablo! Gostei do tutorial!

    • 16/02/2009 às 14:54

      Oi Loiane. Dei uma olhada no seu site também. Muito legal. Parabéns pela formatura.

  3. Eduardo
    16/02/2009 às 21:39

    Excepcional!!!!!!!!

    Muito obrigado!

  4. Adilson
    20/02/2009 às 19:17

    Que bom ter pessoas que compartilham seus conhecimentos

  5. Anderson
    24/04/2009 às 10:45

    Olá Pablo, realmente dos materiais que conheço este é o mais atual e também o mais completo. Estou tentando aplicar a meu projeto mas tenho um erro. Vou postar aki para você me dar uma dica.

    Segue:

    private String getContextPath() {
    HttpSession session = (HttpSession)
    FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    return session.getServletContext().getContextPath();
    }

    A linha return session.getServletContext().getContextPath(); acusa erro no método getContextPath(). E o eclipse pede para eu fazer a seguinte modificação:

    return ((RelatorioUsuario) session.getServletContext()).getContextPath();

    Só que quando eu rodo o projeto uma exceção é lançada em tempo de execução:

    java.lang.ClassCastException: org.mortbay.jetty.servlet.Context$SContext cannot
    be cast to br.com.projetobase.report.RelatorioUsuario
    at br.com.projetobase.report.RelatorioUsuario.getContextPath(RelatorioUs
    uario.java:104)
    at br.com.projetobase.report.RelatorioUsuario.preenchePdf(RelatorioUsuar
    io.java:79)
    at br.com.projetobase.report.RelatorioUsuario.geraRelatorio(RelatorioUsu
    ario.java:38)
    at br.com.projetobase.bean.UsuarioBean.relatorioGeral(UsuarioBean.java:3
    22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    Eu entendo que não da para converter uma String retornada em um UsuarioBean, como posso resolver isto?

    • 24/04/2009 às 14:45

      Olá Anderson. O método getContextPath serve para retornar o nome da aplicação no container e ajuda a encontrar o local do relatório na aplicação.

      O erro do seu projeto é que deve estar sendo realizado um import incorreto.Isso pode ser verificado pelo trace da exception, onde diz que org.mortbay.jetty.servlet.Context não pode ser convertido em RelatorioUsuario. Na verdade, esse método getServletContext é para retornar um ServletContext, do pacote javax.servlet.

      O que você deve fazer é tirar esse cast e verificar se a classe HttpSession utilizada no método é do pacote javax.servlet.http.

      Qualquer coisa, pode escrever no meu e-mail que fica melhor: pablonobrega2004@gmail.com

      Abraço.

  6. Anderson
    24/04/2009 às 15:52

    Pablo funcionou sim, mas não foi o pacote errado e sim a lib do pacote javax.servlet q estava errado. É pra ser a versão 2.5 e estava a 2.4.

    Grato!

  7. mario
    15/01/2010 às 15:13

    kem pode ajudar s.f.f.

    tenho o seguinte código para gerar o relatório na minha aplicação e o rela´torio só vem com o cabeçalho.

    código:
    long start = System.currentTimeMillis();
    Map hm= new HashMap();
    java.io.InputStream is = JRLoader.getLocationInputStream(“c:\\reports\\northwind.xml”);
    Document document = JRXmlUtils.parse(is);
    hm.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, document);
    hm.put(JRXPathQueryExecuterFactory.XML_DATE_PATTERN, “yyyy-MM-dd”);
    hm.put(JRXPathQueryExecuterFactory.XML_NUMBER_PATTERN, “#,##0.##”);
    hm.put(JRXPathQueryExecuterFactory.XML_LOCALE, Locale.ENGLISH);
    hm.put(JRParameter.REPORT_LOCALE, Locale.US);

    JasperFillManager.fillReportToFile(“c:\\reports\\CustomersReport.jasper”, hm);
    System.err.println(“Tempo de preechimento : ” + (System.currentTimeMillis() – start));

    JasperExportManager.exportReportToPdfFile(“c:\\reports\\CustomersReport.jrprint”);
    System.err.println(“Tempo de geração do PDF : ” + (System.currentTimeMillis() – start));

    agradecia a ajuda pois estou já desesperado
    obrigado

  8. Kleber Cardoso
    19/02/2010 às 11:48

    Pessoal, baixei o arquivo compactado e importei no eclipse, corrigi o import das libs do apache, só que não está abrindo a página. Erro 404.
    Alguem pode ajudar??
    Agradeço.

    • 19/02/2010 às 16:11

      Olá Kleber. Corrigi algumas coisas no projeto e agora se você baixar novamente vai dar certo. É que aqui na minha máquina meu Tomcat tinha uns jar’s a mais. Não esqueça de criar a base de dados no MySQL para poder simular a passagem dos dados para o JasperReports. O script de criação está no próprio projeto, na pasta ‘script_banco’. O banco deve se chamar academico. Qualquer dúvida, pode entrar em contato.

  9. Everton Coimbra de Araújo
    24/03/2010 às 22:31

    Olá Pablo, tudo bem ?
    Pablo, estou com um erro louco e não encontro saída. Verifique seu tutorial e não tem exemplo sobre EJBQL. Veja, criei um relatório com EJBQL e quando chamo o relatório recebo as exceções abaixo:

    net.sf.jasperreports.engine.JRException: Error retrieving field value from bean :
    e
    Caused by: java.lang.NoSuchMethodException: Unknown property ” on class ‘class pojo.Cliente’

    Na última dá para ver que parece que ele tem no relatório um campo vazio, mas procurei por este campo no xml do relatório e não encontrei..

    Poderia me ajudar?

    Abraços e obrigado

    • 24/03/2010 às 23:11

      Olá Everton. Uma possível causa para o problema é você estar usando o jar errado na sua aplicação. Por exemplo: você pode ter criado o seu relatório na versão 3.7.1 do iReport e está usando o jar do jasperreports da versão 3.0. Um detalhe: nas últimas versões, o jasper reports precisa do jar do Groovy, que pode ser obtido no próprio diretório do iReport.

      Abraço.

  10. 29/06/2010 às 19:51

    Muito bom tutorial Pablo.

  11. juniorsatanas
    16/09/2010 às 11:24

    Rapadura do ceará e foda deixa o cara potente ! parabéns UECE só tem fera !

  12. Rauan
    24/01/2011 às 20:47

    pessoal quero uma ajuda,sou novato em java e queria saber o inicio desse código pq estou sofrendo muito atrás de tutoriais que ensine a gerar relatório eu pesso 100000000… ajuda.
    Obrigado pela atenção

  13. Eduardo
    03/02/2011 às 09:27

    Olá Pablo, Gostei muito do seu Tutorial mas estou com dificuldades de fazer o projeto funcionar. Está apresentando um erro do import do HttpSession. Será que está faltando algum driver?

    • 03/02/2011 às 09:45

      Eduardo, o seu projeto é Desktop ou Web? A apostila é baseada em JSF. Se o seu projeto for Struts, Desktop ou JSP+Servlets, a forma de você conseguir o diretório onde está algum recurso (executada pelo método getDiretorioReal(String diretorio)) e de conseguir o contexto (executada pelo método getContextPath()) é diferente. Responde aí que eu posso te ajudar a substituir esses códigos. Abraço.

  14. Leiliane
    20/06/2011 às 14:34

    olá Pablo, sou iniciante no ireports e tenho uma duvida, estou fazendo um relatório que tem dois subs nele. só que esses subs podem ou não ter valores, mas eu gostaria que mesmo que não tivesse que eles aparecessem, vc poderia me dar uma sugestão?

    • 20/06/2011 às 15:06

      Oi Leiliane. Nesse caso, acho que a melhor opção é passar um parâmetro do relatório principal para o subrelatório e exibí-lo nesse subrelatório. Você pode passar, por exemplo, uma String com o cabeçalho do subrelatório.

  15. Leiliane
    27/06/2011 às 10:24

    Olá Pablo.
    Eu criei um parâmetro no meu relatório master com o titulo do meu subrelatório
    quando eu coloquei o sub no master eu disse que o parametro nele era o mesmo que o master.Mas não funcionou!
    hehe

    estou fazendo algo de errado?
    se o sub tiver valores ele funciona, se não tiver não funciona. =/

    grata desde já
    Leiliane

  16. Thiago
    18/07/2011 às 21:08

    Muito bom o material!
    Me responde uma pergunta, o que é mais rápido?Fazer o relatório passando objeto ou passando a conexão e deixando o relatório executar a query?
    Obrigado.

    • 18/07/2011 às 23:10

      Passando a conexão normalmente é mais rápido. Mas isso é bem relativo. Se você já tiver, por exemplo, o objeto já carregado em memória e apenas passá-lo para o relatório, provavelmente será mais rápido do que abrir conexão com o banco, fazer a consulta e preencher o relatório.

  17. Calixto
    29/07/2011 às 16:12

    Muito bom o tutorial !Parabens!

  18. 11/03/2014 às 13:21

    Paulo Dantas :
    Pablo, muito bom seu tutorial, alias funciona perfeitamente.
    Eu estava precisando fazer um manual onde eu recebo informações, cada uma das paginas são diferentes, uma é o titulo a outra o índice e as outras ao contexto.
    Como eu faço para criar um relatório deste tipo? Ou seja com mais de uma pagina diferente? Como eu faço para criar uma nova pagina que faça parte do manual? Procurei na comunidade do iReport mas não achei nada que me ajudasse, ou talvez até tenha (mas como não sei ler inglês) mas eu não consegui achar.
    Poderia me ajudar por favor dando uma dica de como criar esta nova pagina que seja a sequencia da anterior?

    Tem um detalhe, quando eu referencio o mesmo campo no footer ele mostra outro valor e não o mesmo do corpo do relatório, e eu quero que repita o valor. Como eu faço para aparecer o mesmo?

    • 12/03/2014 às 20:39

      Paulo, uma solução seria colocar dois subrelatórios com o conteúdo do tamanho de uma página no title do relatório principal. O primeiro para o título e o outro para o índice. Não entendi bem o que você chama de contexto. Seria o detail, ou seja, o conteúdo dinâmico do relatório em si? Vou te mandar o exemplo que construí aqui na minha máquina, que deve ajudar.

      Sobre o valor do footer, você precisa detalhar mais o que está sendo colocado lá. É uma soma, a contagem das páginas, uma variável incrementada automaticamente?

      Aguardo retorno.

  19. 07/05/2014 às 16:40

    Parabens cara, muito bom o material, me tire uma duvida. Quero trabalhar apenas passando list. E posso passar no JRBeanCollectionDataSource ds = new
    JRBeanCollectionDataSource(alunos); mais de um tipo de objeto?
    Passar por exemplo list de alunos e professores?

    • 13/05/2014 às 08:36

      Jonathas, aluno tem relacionamento com professor? Por exemplo: você quer mostrar os alunos de um determinado professor, é isso? Se for, você pode passar uma lista de professor, com cada objeto professor tendo uma lista de alunos. Dê uma olhada em agrupamento de dados no JasperReport para solucionar esse problema.

      • 13/05/2014 às 11:15

        Mais ou menos isso. Ja deu uma ideia..vlw mano abraço

  20. Elano da Hora
    12/05/2014 às 18:51

    Pablo. Muito obrigado por disponibilizar esse tutorial. depois de muito bater cabeça
    na internet. conseguir gerar relatório com ireport graças a sua ajuda.

  21. Fabiano Rios
    02/12/2015 às 12:12

    Pablo, antes de mais nada, parabéns pelo material (ajuda muito quem apanha do Java, enquanto aprendizado).

    Tentei baixar o zip das formas de geração do relatório, porém, não consegui encontrar o arquivo. Você conseguiria enviar por email ou republicá-lo?

    Abs e obrigado….

    • 02/12/2015 às 16:56

      Fabiano,

      Links atualizados. Lembrando que este tutorial está bastante defasado, pois se baseia no JasperReports 3.

  1. 03/01/2011 às 23:29

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: