Relatório com Parâmetros (Resolvido)

Está dando erro, diz que não existe:

Minha Classe:

package br.com.ralatorios;

import br.com.conexao.ConnectionFactory;
import java.io.File;
import java.io.Serializable;
import java.sql.Connection;
import java.util.HashMap;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.util.JRLoader;

/**
 *
 * @author Administrator
 */
public class RelatorioService implements Serializable {
    private static final long serialVersionUID = 1L;
 
    private static String FOLDER_RELATORIOS = "/br/com/ralatorios";
    private String caminhoArquivoRelatorio = null;
    private JRExporter exporter = null;
    private File arquivoGerado = null;
    
    Connection connection;
 
    public String gerarRelatorio(HashMap parametrosRelatorio,
            String nomeRelatorioJasper, String tipoExportar) throws Exception {
 
        String caminhoRelatorio = this.getClass().getResource(FOLDER_RELATORIOS).getPath();
 
        /* caminho completo até o relatório compilado indicado */
        String caminhoArquivosJasper = caminhoRelatorio + File.separator+nomeRelatorioJasper+".jasper";
 
        /* Faz o carregamento do relatório */
        JasperReport relatorioJasper = (JasperReport) JRLoader.loadObjectFromFile(caminhoArquivosJasper);
 
        /* Carrega o arquivo */
        JasperPrint impressoraJasper = JasperFillManager.fillReport(
                relatorioJasper, parametrosRelatorio, this.connection = new ConnectionFactory().getConnection());
 
        if (tipoExportar.equalsIgnoreCase("pdf")) {
            exporter = new JRPdfExporter();
        } else if (tipoExportar.equalsIgnoreCase("xls")) {
            exporter = new JRXlsExporter();
        }
 
        /* Caminho relatorio exportado */
        caminhoArquivoRelatorio = caminhoRelatorio + File.separator
                + nomeRelatorioJasper + "." + tipoExportar;
 
        /* Criar novo arquivos exportado */
 
        arquivoGerado = new File(caminhoArquivoRelatorio);
 
        /* Prepara a impressão */
        exporter.setParameter(JRExporterParameter.JASPER_PRINT,
                impressoraJasper);
 
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE, arquivoGerado);
 
        /* Excuta a exportação */
        exporter.exportReport();
 
        return caminhoArquivoRelatorio;
    }
}

No meu Botão de Imprimir:

try{
       //Lista com os parametros para o relátorio
                    HashMap params = new HashMap<>();
                     
                    //Passândo parâmetros e convertendo o dados pra ser compativel
                    params.put("data_mapVei", Data_inicial.getText());
 
                    //Invocando a geração do relatório 
                    String file = new RelatorioService().gerarRelatorio(params,"RelMapa","pdf");
                     
                    //Exibindo o relatório na tela para o usuário
                    Desktop.getDesktop().open(new File(file));
                    
   }catch(Exception e){
       System.out.println("ERRO: "+e.getMessage());
   }

O que não existe? Coloca a mensagem de erro completa aí.

1 curtida

ERRO: java.io.FileNotFoundException: C:\Program%20Files\Sistema_Controle\build\classes\br\com\ralatorios\RelMapa.jasper

Alguém para ajudar?

A exceção FileNotFound (arquivo não encontrado) indica que o arquivo não pode ser acessado, no local indicado.
Me pergunto por que você teria um arquivo em program files…

Cara, se você não entendeu a ideia do fórum, é a de que você posta algo e quando alguém tiver tempo, disposição, conhecimento e vontade, responde. Aguarde a sua vez.

Eu sei que a ideia é essa…não precisa me explicar, acredito que duas cabeça pensa mais que uma, por isso postei “alguém para ajudar”. Mas enfim…A Ideia era de esconder a pasta, eu tenho um outro relatório e ele funciona, mas esse em específico não funciona. Vou retirar da pasta program files…

Agradeço a ajuda.

Cara, o problema não é estar na program files, o problema é que o caminho não foi identificado pelo java.
Pode ser por não estar lá, estar faltando algum caractere no path passado ou mesmo permissão de acesso (leitura) dentro desse diretório.
Se quer esconder, por que não coloca dentro do jar, que facilita muito mais?

Ele já está dento de um jar.
É aqui onde faz busca pelo caminho onde o RelMap.jasper está…
Eu estou com o usuário adm da máquina.

private static String FOLDER_RELATORIOS = “/br/com/ralatorios”;

String caminhoRelatorio = this.getClass().getResource(FOLDER_RELATORIOS).getPath();
/* caminho completo até o relatório compilado indicado */
String caminhoArquivosJasper = caminhoRelatorio + File.separator+nomeRelatorioJasper+".jasper";

Deu certo!

Retirei da pasta programas files e o relatório abriu.

Obrigado irmão.

Provavelmente, era permissão.
Agora, não faz sentido referenciar um arquivo, dentro de um jar, pelo caminho absoluto. O ideal é pegtar caminho relativo, fica muito mais fácil.

1 curtida

Realmente.

Vou fazer essa melhoria indicada.

Vlw mesmo.

darlan_machado

meu velho…depois de construído o projeto, no .jar, o relatório não gera, mas no netbeans ele funciona. Poderia me ajudar ? Obrigado!

Executou pelo prompt, para ver se apresenta estouro de exceção ao rodar?

Ele dá esse erro:

ERRO: java.io.FileNotFoundException: file:\C:\Users\Administrator\Documen
ema_Controle\dist\Sistema_Controle.jar!\br\com\ralatorios\RelMapa.jasper

E esse arquivo se encontra nesse local?

Se encontra! Ele abre normalmente pelo NetBeans.

Dei um system.ou.print executando pelo NetBeans e ele me dá esse caminho
caminho: /C:/Users/Administrator/Documents/Sistema_Controle/build/classes/br/com/relatorios\RelMapa.pdf

Coloca o código onde você chama o relatório.
Esse segundo, do nb, me parece o caminho onde ele irá salvar o arquivo pronto, não onde ele busca o relatório (pois consta o .pdf no final)

Essa é minha classe para gerar os meus relatórios

private static final String FOLDER_RELATORIOS = "/br/com/relatorios";
private String caminhoArquivoRelatorio = null;
private JRExporter exporter = null;
private File arquivoGerado = null;
Connection connection;

public String gerarRelatorio(HashMap parametrosRelatorio,
    String nomeRelatorioJasper, String tipoExportar) throws Exception {

    String caminhoRelatorio = this.getClass().getResource(FOLDER_RELATORIOS).getPath();

    /* caminho completo até o relatório compilado indicado */
    String caminhoArquivosJasper = caminhoRelatorio + File.separator+nomeRelatorioJasper+".jasper";

    /* Faz o carregamento do relatório */
    JasperReport relatorioJasper = (JasperReport) JRLoader.loadObjectFromFile(caminhoArquivosJasper);

    /* Carrega o arquivo */
    JasperPrint impressoraJasper = JasperFillManager.fillReport(
            relatorioJasper, parametrosRelatorio, this.connection = new ConnectionFactory().getConnection());

    if (tipoExportar.equalsIgnoreCase("pdf")) {
        exporter = new JRPdfExporter();
    } else if (tipoExportar.equalsIgnoreCase("xls")) {
        exporter = new JRXlsExporter();
    }

    /* Caminho relatorio exportado */
    caminhoArquivoRelatorio = caminhoRelatorio + File.separator + nomeRelatorioJasper + "." + tipoExportar;

    /* Criar novo arquivos exportado */

    arquivoGerado = new File(caminhoArquivoRelatorio);
    System.out.println("caminho: "+caminhoArquivoRelatorio);
    /* Prepara a impressão */
    exporter.setParameter(JRExporterParameter.JASPER_PRINT,impressoraJasper);

    exporter.setParameter(JRExporterParameter.OUTPUT_FILE, arquivoGerado);

    /* Excuta a exportação */
    exporter.exportReport();

    return caminhoArquivoRelatorio;
}

E aqui é a ação do meu botão imprimir:

try{
//Lista com os parametros para o relátorio
HashMap params = new HashMap<>();

                //Passândo parâmetros e convertendo o dados pra ser compativel - Parâmetros são gerados no relatório.jasper 
                params.put("data_mapVei", Data_inicial_devolvido.getText());
                params.put("data_mapChe", Data_Final_devolvido.getText());
                params.put("placa_map", txt_placa_devolvido.getText());
                
                //Invocando a geração do relatório 
                String file = new RelatorioService().gerarRelatorio(params,"RelMapa","pdf");
                 
                //Exibindo o relatório na tela para o usuário
                Desktop.getDesktop().open(new File(file));

}catch(Exception e){
System.out.println("ERRO: "+e.getMessage());
}
}

Como eu pensei, você está printando o caminho onde o relatório será criado.

Eu não sei se você digitou esta parte, mas…

Existe uma diferença no path definido na classe com o identificado no erro.