Domanda

sto usando JSF / ICEfaces. La pagina è ICEfaces però sto usando il datatable JSF perché ICEfaces avuto un rallentamento delle prestazioni per qualche motivo. In ogni caso, a differenza dei ICEfaces DataTable, la tabella JSF non viene fornito con l'esportazione in Excel in modo Sto scrivendo il mio. Ho deciso di usare Apache POI, come di seguito. Il codice viene eseguito bene, ma non vedo pop up per salvare file di Excel. Mi sto perdendo qualcosa?

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

e il pulsante di Excel è:

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

Grazie,

Tam

È stato utile?

Soluzione

Io suggerirei si tira questo codice nel proprio servlet. Stai cercando di consueto ciclo di vita breve di JSF circuito e mentre si potrebbe essere in grado di trovare un modo per farlo, probabilmente sarebbe più semplice e forse anche più pulito di fare semplicemente una nuova servlet che gestisce questo file XLS e lasciar fare la sua cosa. È possibile inserire gli oggetti appropriati in sessione temporaneamente dal pulsante di azione, indirizzarli al servlet, li afferrare nella servlet e poi rimuoverli dalla sessione.

Altri suggerimenti

Ho inviato un post sul blog appositamente per un'implementazione ICEfaces qui .

Con il tasto azione, invece di ActionListener

Ha lavorato per me

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top