我在我的Bean中生成一个exportList:
public void exportExcel() throws WriteException {
try {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=\"hours.xls\";");
OutputStream out = response.getOutputStream();
WorkbookSettings ws = new WorkbookSettings();
ws.setLocale(new Locale("de", "DE"));
WritableWorkbook workbook = Workbook.createWorkbook(out, ws);
WritableSheet sheet = workbook.createSheet("Sheet1", 0);
sheet.addCell(new Label(0, 0, "ID", bold));
int row = 1;
for (Hour hour : this.listHours) {
sheet.addCell(new Label(0, row, String.valueOf(hour.getId())));
row++;
}
SheetFormatter.setOptimalColumnWidth(sheet);
workbook.write();
workbook.close();
response.flushBuffer();
context.responseComplete();
context.addMessage(null, new FacesMessage("Liste Exportiert"));
}
catch (Exception e) {
}
}
在我的页面中,我在p:commandButton
中调用方法 <p:commandButton value="#{msg.export}" update="growl"
immediate="true" action="#{hoursView.exportExcel()}" />
我的页面不会打开excel-List ...如果添加属性ajax =“false”它可以工作但是更新将不会执行...
有关信息,我的Bean是SessionScoped,如果这会产生一些差异
答案 0 :(得分:2)
您的第一个错误是您尝试使用ajax下载文件。那是不可能的。 Ajax由JavaScript代码执行,由于安全原因,没有设施强制“另存为”对话和/或将检索到的响应写入本地磁盘文件系统。否则,这将打开各种令人讨厌的安全漏洞可能性的大门。
因此,使用ajax="false"
是绝对必要的。
您的第二个错误是您尝试将不同的回复混合到一个响应中。那是不可能的。您只能返回文件下载或ajax更新,而不能同时返回两者。要检索两个不同的响应,您基本上需要让客户端发送两个不同的请求。您可以按如下方式处理:
window.location=url;
让JavaScript在URL上调用新的GET请求。