使用JSF导出到Excel时出现问题

时间:2009-06-30 04:53:03

标签: java jsf icefaces export-to-excel

我正在使用JSF / ICEFaces。页面是ICEFaces然而我正在使用JSF数据表,因为ICEFaces出于某种原因性能较慢。无论如何,与ICEFaces数据表不同,JSF表并没有出口到excel,所以我写的是我自己的。我决定使用Apache POI如下。代码执行得很好,但我没有看到弹出来保存excel文件。我错过了什么吗?

    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}"/>

谢谢,

3 个答案:

答案 0 :(得分:0)

我建议你把这段代码拉到自己的servlet中。你试图缩短JSF通常的生命周期,虽然你可能找到了一种方法,但是简单地创建一个处理这个XLS文件并让它做的新servlet可能更简单甚至更简洁它自己的东西。您可以从操作按钮临时将适当的对象放入会话中,将它们定向到servlet,在servlet中抓取它们,然后将它们从会话中删除。

答案 1 :(得分:0)

我发布了一篇专门针对ICEFaces实施的博客文章here

答案 2 :(得分:0)

使用按钮操作代替Actionlistener

为我工作