有两个问题。
第一个问题是
<p:commandButton>默认情况下发送的Ajax请求。此请求由Javascript代码触发。但是,Javascript无法对包含文件下载的响应进行任何操作。由于安全限制,Javascript无法生成“
另存为” 对话框或其他内容。该响应基本上被完全忽略。
您需要添加
ajax="false"来
<p:commandButton>关闭Ajax,以便该按钮触发正常的同步HTTP请求,或者您需要将其替换为standard
<h:commandButton>。
<p:commandButton ajax="false" ... />
要么
<h:commandButton ... />
第二个问题是您的servlet根本不将Excel文件写入响应,而是写入存储在服务器工作目录中的本地文件。基本上,HTTP响应不包含 任何内容
。您需要传递
HttpServletResponse#getOutputStream()给该
WorkBook#write()方法。
workbook.write(response.getOutputStream());
毫无关系,我想知道servlet在这里有什么用。您是否想在JSF之外重用它?如果不是这样,您根本不必调度到servlet,而只需在bean的action方法中执行相同的代码即可。空
catch块也不是很好。我只是将其声明为
throwsin方法或至少将其重新抛出为
newFacesException(e)。
*根据您似乎对servlet完全不感兴趣的注释进行 *更新 。这是一个小小的重写,说明了如何使用JSF操作方法以编程方式发送Excel文件。
public void getReportData() throws IOException { HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet(); HSSFRow row = sheet.createRow(0); HSSFCell cell = row.createCell(0); cell.setCellValue(0.0); FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); externalContext.setResponseContentType("application/vnd.ms-excel"); externalContext.setResponseHeader("Content-Disposition", "attachment; filename="my.xls""); workbook.write(externalContext.getResponseOutputStream()); facesContext.responseComplete();}


