我有一个生成Excel文件并输出为byte []的Jasper报告,我希望该文件在浏览器中显示为下载,但此刻它只是将原始代码打印到浏览器。
代码的相关部分如下所示,这是从AJAX请求启动的(页面已经加载):
JasperReport jasperReport;
JasperPrint jasperPrint;
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
byte[] excel = null;
FacesContext facesContext = FacesContext.getCurrentInstance();
try {
ArrayList<SwimDataReport> dataList = getData();
if(dataList!=null){
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(dataList, false);
jasperReport = JasperCompileManager.compileReport(reportFile.getPath());
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
JRXlsExporter exporter = new JRXlsExporter();
ByteArrayOutputStream xlsReport = new ByteArrayOutputStream();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, xlsReport);
exporter.exportReport();
excel = xlsReport.toByteArray();
response.reset();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment; filename=\"Export.xls\"");
xlsReport.close();
OutputStream ouputStream = response.getOutputStream();
ouputStream.write(excel);
ouputStream.close();
facesContext.responseComplete();
this.cleanUp();
}else{
return;
}
} catch (JRException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
我出错的任何想法?
答案 0 :(得分:1)
看来您无法从AJAX请求下载文件,因此我使用了h:commandButton来触发下载。
答案 1 :(得分:0)
答案 2 :(得分:0)
尝试使用a4j:htmlCommandLink
触发下载请求,并在代码中提供target="_NEW"
。
答案 3 :(得分:0)
Excel文件的内容类型为:
用于BIFF .xls文件: application / vnd.ms-excel
for Excel2007及更高版本.xlsx文件: application / vnd.openxmlformats-officedocument.spreadsheetml.sheet
Insted of: &#34;内容配置&#34;,&#34;附件;文件名= <强> \&#34; Export.xls \&#34; 强>&#34;
尝试使用: &#34;内容配置&#34;,&#34;附件;文件名= <强> Export.xls 强>&#34;