2009-06-30 113 views
1

我正在使用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}"/> 

感谢,

回答

0

我建议你把这个代码到它自己的servlet。您试图缩短JSF的正常生命周期,并且尽管您可能会找到一种方法来实现它,但只需制作一个处理此XLS文件的新servlet并让它执行就可能更简单,甚至更简洁它自己的东西。您可以将适当的对象临时从您的操作按钮放入会话中,将它们指向servlet,将它们抓在servlet中,然后将它们从会话中删除。

+0

这似乎是不错的选择。你能给我一个关于如何处理这个问题的代码或链接吗?使用上面的代码我可以看到FireBug,我可以看到响应正文包含Excel文件,内容类型是application/vnd.ms-excel,但不会弹出它供下载。我相信如果我将它作为单独的servlet并转发到该servlet,它可能会完成这项工作。谢谢! – Tam 2009-07-07 18:54:43

0

我已经发布了专门针对ICEFaces实现here的博客文章。

0

使用按键操作而不是ActionListener的

为我工作