我正在使用JSF/ICEFaces。该页面是ICEFaces,但是我使用的是JSF数据表,因为ICEFaces出于某种原因性能低下。无论如何,与ICEFaces数据表不同,JSF表格不会导出到excel,所以我正在写我自己的。我决定使用如下的Apache POI。代码执行得很好,但我没有看到弹出来保存excel文件。我错过了什么吗?导出为JSF时出现问题
public void ExportWithPoi(ActionEvent e) throws IOException{
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
// ArrayList<PerfStatBean> statFilterResults;
Iterator<PerfStatBean> statsIterator = statFilterResults.iterator();
int i=0;
HSSFRow row;
row = sheet.createRow((short)0);
row.createCell((short)0).setCellValue("Current Application ID");
row.createCell((short)1).setCellValue("Event Name");
row.createCell((short)2).setCellValue("Generic Method Name");
while(statsIterator.hasNext()){
i++;
row = sheet.createRow((short)i);
PerfStatBean perfBean = statsIterator.next();
row.createCell((short)0).setCellValue(perfBean.getCurrent_appl_id());
row.createCell((short)1).setCellValue(perfBean.getCurrent_appl_id());
row.createCell((short)2).setCellValue(perfBean.getGeneric_method_name());
}
HttpServletResponse res = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
res.setContentType("application/vnd.ms-excel");
res.setHeader("Content-disposition", "attachment; filename=PerfCollector.xls");
try {
ServletOutputStream out = res.getOutputStream();
wb.write(out);
out.flush();
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
FacesContext faces = FacesContext.getCurrentInstance();
faces.responseComplete();
}
和Excel按钮:
<h:commandButton id="excelBtn"
rendered="#{statsDisplayAndFilter.renderNextBtn}"
image="./xmlhttp/css/rime/css-images/excel.png"
actionListener="#{statsDisplayAndFilter.ExportWithPoi}"/>
感谢,
担
这似乎是不错的选择。你能给我一个关于如何处理这个问题的代码或链接吗?使用上面的代码我可以看到FireBug,我可以看到响应正文包含Excel文件,内容类型是application/vnd.ms-excel,但不会弹出它供下载。我相信如果我将它作为单独的servlet并转发到该servlet,它可能会完成这项工作。谢谢! – Tam 2009-07-07 18:54:43