Pergunta

Eu estou usando JSF / ICEFaces. A página é ICEFaces no entanto eu estou usando a tabela de dados JSF porque ICEFaces teve um desempenho lento por algum motivo. De qualquer forma, ao contrário dos ICEFaces tabela de dados, a tabela JSF não vem com exportação para Excel então eu estou escrevendo minha própria. Eu decidi usar o Apache POI como abaixo. Os executa código bem, mas eu não vejo aparecer para salvar o arquivo excel. Estou faltando alguma coisa?

    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 o botão excel é:

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

Obrigado,

Tam

Foi útil?

Solução

Eu sugiro que você puxa este código em seu próprio servlet. Você está tentando ciclo de vida habitual de JSF curto-circuito e, enquanto você pode ser capaz de encontrar uma maneira de fazê-lo, ele provavelmente seria mais simples e, possivelmente, ainda mais limpa do que simplesmente fazer um novo servlet que lida com este arquivo XLS e deixá-lo fazer sua própria coisa. Você pode colocar os objetos apropriados em sessão temporariamente de seu botão de ação, encaminhá-los para o servlet, agarrá-los no servlet e, em seguida, removê-los da sessão.

Outras dicas

Tenho postado um post especificamente para uma implementação ICEFaces aqui .

Use a ação botão em vez de ActionListener

funcionou para mim

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top