Question

I'm using JSF/ICEFaces. The page is ICEFaces however I'm using the JSF datatable because ICEFaces had slow performance for some reason. Anyway, unlike the ICEFaces datatable, the JSF table doesn't come with export to excel so I'm writing my own. I decided to use Apache POI as below. The code executes well but I don't see pop up to save excel file. Am I missing something?

    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();
    }

And the excel button is:

            <h:commandButton id="excelBtn"
               rendered="#{statsDisplayAndFilter.renderNextBtn}"
                image="./xmlhttp/css/rime/css-images/excel.png"
                actionListener="#{statsDisplayAndFilter.ExportWithPoi}"/>

Thanks,

Tam

Was it helpful?

Solution

I'd suggest you pull this code into its own servlet. You're trying to short circuit JSF's usual life-cycle and while you might be able to find a way to do it, it would probably be simpler and possibly even cleaner to simply make a new servlet which handles this XLS file and let it do its own thing. You can place the appropriate objects into session temporarily from your action button, direct them to the servlet, grab them in the servlet and then remove them from session.

OTHER TIPS

I have posted a blog post specifically for an ICEFaces implementation here.

Use button action instead of Actionlistener

Worked for me

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top