Relatório com IReport

Boa tarde pessoal, estou fazendo um relatório, e salvando em disco (relatório XLS), porém gostaria
que o usuario fizesse download do mesmo, tipo não salvar em disco e sim pedir para fazer o download,
como posso fazer isso?

Segue o código:

           JRBeanCollectionDataSource dados = new JRBeanCollectionDataSource(lista);
            java.net.URL resource = this.getClass().getClassLoader().getResource("../../relatorio/Relatorio.jasper");
            InputStream is = new FileInputStream(resource.getFile());
            Map parameters = new HashMap();
            byte[] bytes = null;
            JasperPrint jasperPrint = JasperFillManager.fillReport(is, parameters, dados);
            JRXlsExporter exporter = new JRXlsExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "c:\relatorio.xls");// SALVANDO EM DISCO

            exporter.exportReport();

Obrigado.

e se vc gerar o arquivo passar ele como resposta.

sua aplicação é web? no caso o servlet(seja ele implementado p/ framework ou não) vc faz a servlet retorna o arquivo.

será q da certo?

att,

Olá Java_Terminator,

Tenho uma aplicação web utilizando JSF e através do trecho de código abaixo, a opção de salvar o relatório é mostrada ao usuário.

FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
ServletOutputStream responseStream = response.getOutputStream();
InputStream caminho = getClass().getResourceAsStream("/relatorio.jrxml");
response.setContentType("application/pdf"); 
//Aqui será definido a caixa de diálogo para salvar o arquivo e o seu nome
response.setHeader("Content-Disposition","attachment; filename=\"relatorio.pdf\"");
                
JasperReport pathReport = JasperCompileManager.compileReport(caminho);
HashMap parametros = new HashMap();
JasperPrint preencher = JasperFillManager.fillReport(pathReport, parametros,new JRBeanCollectionDataSource(lista));
JasperExportManager.exportReportToPdfStream(preencher,responseStream);
responseStream.flush();
responseStream.close();
context.renderResponse();
context.responseComplete();

Você poderá adaptá-lo a sua aplicação, espero que ajude.

Baum pessoal, consegui fazer aqui. Obrigado a todos…

Segue o código abaixo:

            JRBeanCollectionDataSource dados = new JRBeanCollectionDataSource(lista); //LISTA COM OS OBJETOS
            java.net.URL resource = this.getClass().getClassLoader().getResource("../../relatorio/Relatorio.jasper");
            InputStream is = new FileInputStream(resource.getFile());
            Map parameters = new HashMap();
            byte[] bytes = null;
            JasperPrint jasperPrint = JasperFillManager.fillReport(is, parameters, dados);

            String nomeRelatorio = "relatorioTeste";
            response.setContentType("application/x-download");
            response.setHeader("Content-Disposition", "attachment; filename=" + nomeRelatorio + ".xls");
            JRXlsExporter export = new JRXlsExporter();
            OutputStream output = response.getOutputStream();
            export.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint);
            export.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, output);
            export.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
            export.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
            export.setParameter(JRXlsExporterParameter.MAXIMUM_ROWS_PER_SHEET, Integer.decode("65000"));
            export.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
            export.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
            export.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
            export.exportReport();
            output.flush();
            output.close();

att.