Relatorio JasperReport

32 respostas
A

Ola, estou gerando um relatorio de produtos, ele abre normalmento quando compilo no netbeans 7.1porém quando mando limpar e construir,
o arquivo .jar nao puxa os relatorios e não da mensagem de erro nem nada fica como se o jButton nao tivesse nenhum evento.
Como faço para o arquivo .jar puxe os relatorios?

public class CriaConexao {
    static Connection con = null;
    public static Connection conectar() {
        try {
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/banco", "root", "****");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
        return con;
    }
   public static void geraRelatorio(String arquivo) throws JRException, SQLException, ClassNotFoundException {
     HashMap map = new HashMap();
       JasperReport report = (JasperReport) JRLoader.loadObject(arquivo) ;
       JasperPrint imprimir = JasperFillManager.fillReport(report, map, conectar()); 
       JasperViewer jrviewer = new JasperViewer(imprimir, false);
        jrviewer.setVisible(true);
    
   }
    
}
metodo do evento:
private void mostrarRelatorio() {
        try{
           System.out.print(getClass().getClassLoader().getResource("Relatorio/RelatorioDeProdutos.jrxml").getPath());
        CriaConexao.geraRelatorio(getClass().getClassLoader().getResource("Relatorio/RelatorioDeProdutos.jasper").getPath());
        }catch(Exception e){
            System.out.println(e);
        }
    }

32 Respostas

S

Olha,

Eu quando desenvolvo softwares com relatório, gero o .jar mas é necessário além de gera-lo, copiar a pasta onde está o relatório ou relatório (se não estiver em pasta nenhuma.)

É preciso ainda colocar o .jar e a pasta(ou relatório) dentro do mesmo diretório.

F

primeiro, abre o teu jar e verifica se tem na raiz, o diretório “Relatorio”.
Se tiver, tenta esse código:

JasperPrint impressao = null;
InputStream is = this.getClass().getResourceAsStream("/Relatorio/RelatorioDeProdutos.jasper");
impressao = JasperFillManager.fillReport(is, parametros, ds);
JRViewer viewer = new JRViewer(impressao);
viewer.setVisible(true);

Fernando

A

Ola, tem o diretorio sim na raiz, mais esse codigo ae nao funcionou nao. mais muito obrigado se tiver outra sugestao por favor posta ae!
grato.

F

dah um System.out.println is, e verifica se o valor é null…se for, realmente não está encontrando o arquivo…

S

eu gero relatórios de forma bem simples assim:

Tenho uma classe chamada Relatorio que recebe os parametros enviados pela página principal.

/**
 *
 * @author Sandro Softwares 28/01/2012
 */
public class Relatorio {

    private Connection conexao;

    public Relatorio() throws SQLException {
        this.conexao = CriaConexao.getConexao();
    }

//passo o caminho do diretório do relatório e o nome do relatório
      public void gerarRelatorio(String caminhoJasper, String nomeRelatorio) throws JRException, SQLException, ClassNotFoundException {

        JasperPrint rel = null;

        try {

            HashMap parametros = new HashMap();
            String arquivoJasper = caminhoJasper;

            rel = JasperFillManager.fillReport(arquivoJasper, parametros, conexao);
            JasperViewer.setDefaultLookAndFeelDecorated(false);
// JasperViewer.viewReport(rel);
            JasperViewer j = new JasperViewer(rel, true);
            JDialog v = new JDialog(new javax.swing.JFrame(), nomeRelatorio, true);
            v.setSize(900, 700);
            v.setLocationRelativeTo(null);
            v.getContentPane().add(j.getContentPane());
            v.setVisible(true);
            }
        } catch (final JRException e) {
            JOptionPane.showMessageDialog(null, "Relatório não encontrado!", "Relatório", JOptionPane.ERROR_MESSAGE);
            System.out.println(e);
        }
    }

Na tela principal faço (dentro do actionperformed)

try {
            caminhoJasper = "relatorios\\relatorio.jasper";
            nomeRelatorio = "Relatório";
            Relatorio relatorio = new Relatorio();
            relatorio.gerarRelatorio(caminhoJasper, nomeRelatorio);

        } catch (Exception ex) {
            System.out.println("problema boleto. Erro: " + ex + "\n\n");
        }

sendo que aqui, caminhoJasper e nomeRelatorio são Strings definidas para escopo de Classe.

testa ai pra ver!
(está chamando o relatório num JDialog)

Sandro

S

só mais uma sugestão:

aprJava, é bom separar as classes por funções:

Ex: se a função da classe é conectar, faz uma exclusiva pra isso e quando for conectar em algum ponto da aplicação chama essa classe.

Então poderia ficar assim:

public class CriaConexao {  
    static Connection con = null;  
    public static Connection conectar() {  
        try {  
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/banco", "root", "****");  
        } catch (SQLException e) {  
            System.out.println(e.getMessage());  
        }  
return con;
}
      }

Em outra classe (que agora terá a função de gerar relatórios) vc define a configuração e quando for gerar os relatorios vc chama a classe:

pelo seu exemplo:

public class Relatorio {  
  
    private Connection conexao;  
  
    public Relatorio() throws SQLException {  
        this.conexao = CriaConexao.conectar();  //mudei aqui o nome do método para ficar igual ao seu.
    }  
  
//passo o caminho do diretório do relatório e o nome do relatório  
      public void gerarRelatorio(String caminhoJasper, String nomeRelatorio) throws JRException, SQLException, ClassNotFoundException {  
  
        JasperPrint rel = null;  
  
        try {  
  
            HashMap parametros = new HashMap();  
            String arquivoJasper = caminhoJasper;  
  
            rel = JasperFillManager.fillReport(arquivoJasper, parametros, conexao);  
            JasperViewer.setDefaultLookAndFeelDecorated(false);  
// JasperViewer.viewReport(rel);  
            JasperViewer j = new JasperViewer(rel, true);  
            JDialog v = new JDialog(new javax.swing.JFrame(), nomeRelatorio, true);  
            v.setSize(900, 700);  
            v.setLocationRelativeTo(null);  
            v.getContentPane().add(j.getContentPane());  
            v.setVisible(true);  
            }  
        } catch (final JRException e) {  
            JOptionPane.showMessageDialog(null, "Relatório não encontrado!", "Relatório", JOptionPane.ERROR_MESSAGE);  
            System.out.println(e);  
        }  
    }
A

vou testar aqui e volto pra falar se deu certo. agradeco des de ja!

A
e ae SandroSoftwares! fiz igual vc sugeriu cara, so que to apanhando em uma coisa aqui creio que e muito simples so que ja mim estressei tanto com isso q ta.... separei as classes:class para conexao
public class CriaConexao {

    static Connection con = null;

    public static Connection conectar() {
        try {
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/agenda", "root", "root");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
        return con;
    }
class chama relatorio
public class BuscarRelatorio {
  private Connection conexao;    
    
    public BuscarRelatorio() throws SQLException {    
        this.conexao = (Connection) CriaConexao.conectar();  //mudei aqui o nome do método para ficar igual ao seu.  
    }    
    

      public void gerarRelatorio(String caminhoJasper, String nomeRelatorio) throws JRException, SQLException, ClassNotFoundException {    
    
        JasperPrint rel = null;    
    
        try {    
    
            HashMap parametros = new HashMap();    
            String arquivoJasper = caminhoJasper;    
    
            rel = JasperFillManager.fillReport(arquivoJasper, parametros, conexao);    
            JasperViewer.setDefaultLookAndFeelDecorated(false);    
 
            JasperViewer j = new JasperViewer(rel, true);    
            JDialog v = new JDialog(new javax.swing.JFrame(), nomeRelatorio, true);    
            v.setSize(900, 700);    
            v.setLocationRelativeTo(null);    
            v.getContentPane().add(j.getContentPane());    
            v.setVisible(true);    
            }    
         catch (final JRException e) {    
            JOptionPane.showMessageDialog(null, "Relatório não encontrado!", "Relatório", JOptionPane.ERROR_MESSAGE);    
            System.out.println(e);    
        }    
      }}
até aqui tudo ok!no jframe da erro na hora de colocar o caminhoJasper e o nomeRelatorio da erro nao reconhece esse campo e nao consegui intanciar nem importar esses campos. fica pedindo pra criar se puder continuar ajudando agradeço pelo tempo!acitonPerfo
private void mostrarRelatorioPro() {
                     try {  
              gerarRelatorio.caminhoJasper = "Relatorio/RelatorioDeProdutos.jasper"";  
               nomeRelatorio = "RelatórioDeClientes";  
               Relatorio relatorio = new Relatorio();  
               relatorio.gerarRelatorio(caminhoJasper, nomeRelatorio);  
      
           } catch (Exception ex) {  
               System.out.println("problema boleto. Erro: " + ex + "\n\n");  
           }  
        }
fica pedindo criar campo nomeRelatorio em jframe, criar paramentro nomeRelatorio e o mesmo para caminhoJasper. agradeço desde ja.
S

foi o que eu te disse:

vc precisa criar os campos caminhoJasper e nomeRelatório no frame e não dentro da classe relatório.

a classe relatório apenas receberá como parametros mas não são dela...

observe o que fizeste:
gerarRelatorio.caminhoJasper

gerarRelatório é um método. Desse jeito ai dá erro. Se gerar relatório fosse uma classe que tivesse um atributo caminhoJasper que fosse publico, vc conseguiria acessa-lo... mas dessa forma ai não... (mas isso não importa muito aqui não pois, como já disse caminhoJasper e nomeRelatorio não são atributos da classe BuscarRelatorio.)

então para resolver o seu problema faça isso:

Crie duas Strings no início no FRAME e dê o nome de caminhoJasper e nomeRelatorio

String caminhoJasper;
String nomeRelatorio;

agora no seu metodo mostrarRelatorioPro() coloque:

private void mostrarRelatorioPro() {  
                    try {    
              caminhoJasper = "Relatorio\\RelatorioDeProdutos.jasper"";    //coloquei o \\ pois as vezes dá erro se não estiver assim
              nomeRelatorio = "Relatório de Clientes";    //separei os nomes
              BuscarRelatorio relatorio = new BuscarRelatorio(); //vc havia colocado o nome Relatorio, mas você mesmo colocou o nome da sua classe BuscarRelatorio, logo troquei   
              relatorio.gerarRelatorio(caminhoJasper, nomeRelatorio);    
       
          } catch (Exception ex) {    
              System.out.println("problema Relatório Clientes. Erro: " + ex + "\n\n");    
          }    
       }
A

fala SandroSoftwares o eu d novo!! ou da a mensagem da class buscarRelatorio: Relatorio nao encontrado. na saida do netBeans aparece isso talvez ajude a voce ver oque esta acontecendo: run:
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: Relatorio\RelatorioDeProdutos.jasper
CONSTRUÍDO COM SUCESSO (tempo total: 12 segundos)
obrigado pela ajuda.

S

vc colocou o \ no caminho do diretório ou só ???

caminhoJasper = "Relatorio\\RelatorioDeProdutos.jasper"";    //coloquei o \\ pois as vezes dá erro se não estiver assim
A
NAs duas foramas
private void mostrarRelatorioPro() {
        try {
            caminhoJasper = "Relatorio\\RelatorioDeProdutos.jasper";
            nomeRelatorio = "Relatório De Produtos";
            BuscarRelatorio relatorio = new BuscarRelatorio();
            relatorio.gerarRelatorio(caminhoJasper, nomeRelatorio);

        } catch (Exception ex) {
            System.out.println("problema boleto. Erro: " + ex + "\n\n");
        }
    }
private void mostrarRelatorioPro() {
        try {
            caminhoJasper = "Relatorio/RelatorioDeProdutos.jasper";
            nomeRelatorio = "Relatório De Produtos";
            BuscarRelatorio relatorio = new BuscarRelatorio();
            relatorio.gerarRelatorio(caminhoJasper, nomeRelatorio);

        } catch (Exception ex) {
            System.out.println("problema boleto. Erro: " + ex + "\n\n");
        }
    }
as duas com o mesmo resultado! valeu por continuar ajudando.
A

Boas novas SandroSoftwares.!!! coloquei o caminho desde a raiz ae funcionou!!!

caminhoJasper = "C:\\Users\\Tanus\\Documents\\NetBeansProjects\\Agenda\\build\\classes\\Relatorio\\RelatorioDeProdutos.jasper";

isso ae vai dar algum problema futuro ou ta correto?
se voce acha que nao mudarei pra resolvido o estatus do topico.
se sim manda a dica por favor!
Muito obrigado mesmo pelo tempo que perdeu aqui mim ajudando cara, valeu mesmo!

S

rapaz… eu acho que desse jeito vai dar problema sim…

o cliente não vai ter esse mesmo diretório.

a estrutura do meu programa esta assim:

dentro da pasta do programa tenho uma pasta chamada relatorio onde coloco todos eles.

eu simplesmente na hora de chamar chamo colocando:

Relatorios\\boletos\\boleto.jasper

ou seja, tenho uma pasta Relatorios e dentro desta tenho outra pasta chamada boletos e dentro desta tenho finalmente o boleto.jasper

não sei por que com vc não está funcionando…

S

dentro da pasta do seu programa Agenda tem a pasta Relatorios?

E

Amigo sou um pouco iniciante em Java, mas já estudei um pouquinho, vou te dar umas dicas, pois passei pelo mesmo problema, foi muito difícil, não sei se é seu caso, mas para min funcionou muito bem:

1º - Compile o arquivo .jrxml chamando-o de dentro de sua aplicação, não utilize o .jasper .(Tive vários problemas com ele, não conseguia referencia-lo) 2º - Crie pastas de imagens dentro do seu projeto, para você referencia-las no seu relatório, dessa forma você não fica preso ao C:, pois sua aplicação nem sempre vai rodar no mesmo PC. Olha o que eu fiz, funciona perfeitamente pois atende minha necessidade.
HttpServletResponse response = (HttpServletResponse) contexto
						.getExternalContext().getResponse();

ServletOutputStream responseStream = response.getOutputStream();

				String caminhoProjeto = "/RelatorioOmissao.jrxml";
				InputStream caminho = this.getClass().getResourceAsStream(
						caminhoProjeto);
				JasperDesign desgner = JRXmlLoader.load(caminho);
				JasperReport expRelatorio = JasperCompileManager
						.compileReport(desgner);

				byte[] bytes = JasperRunManager.runReportToPdf(expRelatorio,
						null, new JRBeanCollectionDataSource(listaObjOmissao));

				response.setContentType("aplication/pdf");
				response.setContentLength(bytes.length);
				response.setHeader("Content-Disposition","attachment;filename=\"RelatorioOmissao.pdf\"");
				responseStream.write(bytes, 0, bytes.length);
				responseStream.flush();
				responseStream.close();
				contexto.renderResponse();
				contexto.responseComplete();

Funfou legal...

Qualquer coisa estamos ai ....abraçuuu

S

Oi eduardimaa

eu sempre uso o jasper e não tenho problema nenhum…

a questão dele deve ser com relacao ao path… ou algo assim…

E

ok…abraçuuu

A

lugar errado

A

Realmente isso vai dar problema mesmo vou dar mais uma olhada no caminho pra ver se ta tudo certo com o caminho. obrigado
ah! na apresentacao do relatorio nao aparece os botoes de maximizar minimizar so o de fechar tem como coloca-los?
o tamanho deixei do jeito que voce colocou mais tirei e tb nao funcionou testei

v.setComponentOrientation(JDialog......);
v.setComponentZOrder(JDialog....);

quase todos e nao deu certo!
se souber.
grato!

A

Vou olhar os caminho mais atentamente!
Tem como colocar no JDialog os botoes de maximizar e minimizar?
valeu

S

com relação ainda ao caminho:

tenta fazer isso aqui pra ver se pega o path sem precisar passar o caminho completo:

deixe caminhoJasper assim mesmo:

caminhoJasper = "Relatorio\\RelatorioDeProdutos.jasper"";

E no método gerarRelatorio deixe assim logo abaixo da linha String arquivoJasper = caminhoJasper;

String arquivoJasper = caminhoJasper;
File file = new File(caminhoJasper);
                 JOptionPane.showMessageDialog(null, file.getPath()); //vc vai ver o path

                rel = JasperFillManager.fillReport(file.getPath(), parametroMapDadosCabecalho, conexao);

posta ai o resultado

A

no meu tem a pasta relatorio e os arquivos estao la
tb nao to entendendo valeu cara

S

e ai? o path apareceu?

A

Apareceu o Path sim do jeito que ta no codigo. Oque isso quer dizer? grato!

A

aprJava:
Apareceu o Path sim do jeito que ta no codigo. Oque isso quer dizer? grato!
mais nao puxa o relatorio com esse caminho!

S

rapaz, vc na instalação do java configurou variáveis de ambiente corretamente? eu olharia esse tutorial abaixo pra ver se ta tudo certo…

segue um tutorial:

A

Oque eu nao entendo porque com esse codigo ae ele puxava com esse mesmo caminho so nao puxava com o arquivo *.jar
agora com o codigo que voce mim passou ele so puxa se eu colocar o caminho desde a raiz do pc c:…
deve ta faltando algum detalhe no codigo que voce mim passou ou no que eu usava neh!
to postando ae pra voce saber de tudo pra ver se tem uma ideia do que pode ser.
valeu por ta ajudando.

public static void geraRelatorio(String arquivo) throws JRException, SQLException, ClassNotFoundException { HashMap map = new HashMap(); JasperReport report = (JasperReport) JRLoader.loadObject(arquivo) ; JasperPrint imprimir = JasperFillManager.fillReport(report, map, conectar()); JasperViewer jrviewer = new JasperViewer(imprimir, false); jrviewer.setVisible(true); jrviewer.toFront();

aprJava:
aprJava:
Apareceu o Path sim do jeito que ta no codigo. Oque isso quer dizer? grato!
mais nao puxa o relatorio com esse caminho!

S

para que o seu sistema chama atraves do .jar

o seuprograma.jar deve estar no mesmo diretorio da pasta relatorio

ou seja:

copie o .jar com a biblioteca lib e jogue no desktop
depois peque a pasta relatorio copie e jogue no desktop
e executa o .jar

compila o .jar com o código que você postou agora mesmo pra ver se resolve.

A

[b]deu certo cara valeu uhuuu…
obrigado!!!

A

deu certo cara valeu mesmo…
obrigadao!!!

S

:smiley: :smiley: :smiley:
rsrsrs

é sempre assim: Há diversas formas de fazer a mesma coisa… umas mais fáceis, outras mais complicadas…

mas o importante é que conseguiu!!!

Criado 3 de março de 2012
Ultima resposta 6 de mar. de 2012
Respostas 32
Participantes 4