проблема при экспорте в Excel с JSF - PullRequest
1 голос
/ 30 июня 2009

Я использую 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}"/>

Спасибо

Tam

Ответы [ 3 ]

0 голосов
/ 19 сентября 2009

Я опубликовал пост в блоге специально для реализации ICEFaces здесь .

0 голосов
/ 03 августа 2011

Использовать действие кнопки вместо Actionlistener

работал для меня

0 голосов
/ 30 июня 2009

Я бы посоветовал вам вытащить этот код в свой собственный сервлет. Вы пытаетесь замкнуть обычный жизненный цикл JSF, и, хотя вы сможете найти способ сделать это, возможно, будет проще и, возможно, даже чище просто создать новый сервлет, который обрабатывает этот файл XLS и позволяет ему своя вещь. Вы можете временно разместить соответствующие объекты в сеансе с помощью кнопки действия, направить их в сервлет, захватить их в сервлете и затем удалить их из сеанса.

...