XSSFWorkbook#write()导致空响应

时间:2012-03-16 15:30:44

标签: jsf-2 apache-poi

我正在尝试让我的JSF导出电子表格以供下载。我正在使用Apache的POI库来编写Excel文档。代码运行时,我在警告框中收到以下错误:

emptyResponse: An empty response was received from the server.

生成电子表格并导出到OutputStream的方法如下(为简单起见,我已重命名了类,方法等)。

private void generateSpreadsheet(Object object) throws Exception {
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();

    String fileName = object.getProperty() + ".xlsx";
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName +"\"");
    OutputStream os = response.getOutputStream();

    Workbook wb = new XSSFWorkbook();
    Sheet sheet = wb.createSheet("Sheet 1");
    Row row = sheet.createRow(0);
    Cell cell = row.createCell(0);
    cell.setCellValue("test");
    wb.write(os);

    os.flush();
    os.close();
    FacesContext.getCurrentInstance().responseComplete();
}

非常感谢任何建议,谢谢。

1 个答案:

答案 0 :(得分:3)

  

如果它有所不同,我在调用此方法的表单提交上使用AJAX(<f:ajax>标记)。

绝对不同。您可以通过Ajax 下载文件。 Ajax由JavaScript代码执行。但JavaScript无法强制另存为对话框或执行与文件的mime类型相关联的平台默认应用程序(幸运的是,这可能是一个主要的安全/入侵问题)。此外,JSF Ajax API期望指定结构中的XML响应符合JSF规范。当您发送完整的Excel文件时,整个Ajax响应将被JSF Ajax API忽略为不可理解的垃圾。

您需要发送正常的同步请求。从命令链接/按钮中删除<f:ajax>标记。如果下载以attachment发送,则当前页面将保持不变。