Fala pessoal do GUJ.
Sei que existem outros Tópicos com esse assunto, mas olhei todos que encontrei e não consegui resolver meu problema.
Bem Vamos lá …
Iniciei a pouco tempo a utilização do Jasper em meus relatórios. Eu gero os arquivos da seguinte forma:
/**
* @param relatorioPontoJasper - Nome do arquivo jasper compilado ( o mesmo tem que estar na pasta padrão)
* @param parametros - Map de Parametros
* @param extensao - aceita PDF, RTF e XLS
* @param NomeArquivoSaida - Nome do arquivo de saída
* @throws EsferaException - lança uma exception
*/
public void doPost(String relatorioPontoJasper, Map<String, Object> parametros, String extensao,
String NomeArquivoSaida) throws EsferaException {
con = getConnection();
// Na variavel pathJasper ficara o caminho do diretório para os relatórios compilados (.jasper)
String pathJasper = getRaiz()+"/jasper/";
// Local no disco onde o arquivo será gravado
//System.out.println("JasperUtil.doPost()"+getRaiz());
String path = getRaiz()+"//arquivosRelatatorios//";
if (!new File(path).exists()) { // Verifica se o diretório existe.
(new File(path)).mkdir(); // Cria o diretório
}
try {
// Aqui ele cria o relatório
JasperPrint jasperprint = JasperFillManager.fillReport(pathJasper+ relatorioPontoJasper, parametros, con);
if("pdf".equalsIgnoreCase(extensao) ){
JRPdfExporter exporterPDF = new JRPdfExporter();
exporterPDF.setParameter(JRExporterParameter.JASPER_PRINT, jasperprint);
exporterPDF.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, path+ "/"+NomeArquivoSaida+".pdf");
exporterPDF.exportReport();
//res.sendRedirect(path+ "/"+NomeArquivoSaida+".pdf");
baixarArquivo(path+ "/"+NomeArquivoSaida+".pdf");
//return (path+ "/"+NomeArquivoSaida+".pdf");
}else if("rtf".equalsIgnoreCase(extensao) ){
JRRtfExporter exporterRTF = new JRRtfExporter();
exporterRTF.setParameter(JRExporterParameter.JASPER_PRINT, jasperprint);
exporterRTF.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, path+ "/"+NomeArquivoSaida+".rtf");
exporterRTF.exportReport();
baixarArquivo(path+ "/"+NomeArquivoSaida+".rtf");
//return (path+ "/"+NomeArquivoSaida+".rtf");
}else if("xls".equalsIgnoreCase(extensao) ){
JRXlsExporter exporterXLS = new JRXlsExporter();
exporterXLS.setParameter(JRExporterParameter.JASPER_PRINT, jasperprint);
exporterXLS.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, path+ "/"+NomeArquivoSaida+".xls");
exporterXLS.exportReport();
exporterXLS.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);
baixarArquivo(path+ "/"+NomeArquivoSaida+".xls");
//return (path+ "/"+NomeArquivoSaida+".xls");
}else{
//return null;
}
}catch (Exception e) {
e.printStackTrace();
throw new EsferaException("Erro ao gerar o Relatório");
}
}
Em seguida pego o arquivo gerado e envio para download assim :
// Irá baixar o arquivo
public void baixarArquivo(String urlCompleta) throws EsferaException{
File f = new File(urlCompleta);
EsferaUtils.download(f, this.res);
}
public static void download( File file, HttpServletResponse response ){
try {
download( file.getName(), read( file ), response );
} catch (IOException e) {
e.printStackTrace();
}
}
public static void download( String filename, byte[] content,
HttpServletResponse response ) throws IOException {
response.addHeader( "Content-Disposition", "attachment; filename=" + filename );
response.setContentType( "application/octet-stream" );
if(outStream==null){
outStream = response.getOutputStream();
}
// envia o conteúdo do arquivo para o stream de resposta
try {
outStream.write( content );
outStream.flush();
} finally {
if(outStream!=null) outStream.close();
}
}
Bem eu sempre recebo a exception…
java.lang.IllegalStateException: getOutputStream() has already been called for this response
mas como tem try-catch o código continua sendo executado.
Caso eu esteja gerando o relatório pela primeira vez ele lança a exception, mas funciona normal e o arquivo é baixado corretamente.
Mas caso eu mande gerar o relatório novamente aí dá pau :twisted: gerando um arquivo corrompido que não tem como abrir.
Estava lendo que a maneira correta de fazer o download é atravez de servelet. Mas não sei ao certo como fazer .
Outra coisa … também gostaria que o arquivo não fosse salvo no servidor e que o download fosse feito diretamante (se possivel).
Agradeço a todos que responderem

