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.