2009-06-30 5 views
1

Ich verwende JSF/ICEFaces. Die Seite ist ICEFaces, aber ich verwende die JSF-Datentabelle, weil ICEFaces aus irgendeinem Grund eine langsame Leistung hatte. Im Gegensatz zu der Datentabelle von ICEFaces enthält die JSF-Tabelle jedoch keinen export-excel, daher schreibe ich meine eigene. Ich entschied mich dafür, Apache POI wie unten zu verwenden. Der Code funktioniert gut, aber ich sehe kein Popup, um die Excel-Datei zu speichern. Fehle ich etwas?Problem beim Exportieren mit 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(); 
    } 

Und die Excel-Taste ist:

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

Danke,

Tam

Antwort

0

Ich würde vorschlagen, dass Sie diesen Code in das eigene Servlet ziehen. Sie versuchen, JSFs üblichen Lebenszyklus kurzzuschließen, und während Sie in der Lage sein könnten, einen Weg zu finden, wäre es wahrscheinlich einfacher und möglicherweise sogar sauberer, einfach ein neues Servlet zu erstellen, das diese XLS-Datei handhabt und es tun lässt seine eigene Sache. Sie können die entsprechenden Objekte vorübergehend über Ihre Aktionsschaltfläche in die Sitzung einfügen, sie an das Servlet weiterleiten, sie im Servlet aufnehmen und sie dann aus der Sitzung entfernen.

+0

, dass eine gute Wahl zu sein scheint. Könnten Sie mir bitte einen Code oder einen Link geben, wie ich damit umgehen soll? Mit meinem Code oben konnte ich sehen, mit FireBug kann ich sehen, dass der Antworttext die Excel-Datei enthält und der Inhaltstyp ist application/vnd.ms-excel, aber es erscheint nicht zum Download. Ich glaube, wenn ich es als separates Servlet habe und an dieses Servlet weiterleite, könnte es den Job machen. Vielen Dank! – Tam

+0

Dies scheint das meiste zu haben, was Sie brauchen und/oder hat Links zu dem, was Sie brauchen: http://www.devx.com/Java/Article/31356 – Drew

0

Ich habe einen Blogbeitrag speziell für eine ICEFaces-Implementierung here.

0

Mit Taste Aktion statt Action

für mich gearbeitet