2009-06-30 3 views
1

Я использую JSF/ICEFaces. Страница ICEFaces, однако я использую JSF datatable, потому что ICEFaces имели медленную производительность по какой-то причине. Во всяком случае, в отличие от данных ICEFaces, таблица JSF не поставляется с экспортом, поэтому я пишу свой собственный. Я решил использовать Apache POI, как показано ниже. Код работает хорошо, но я не вижу всплывающих окон, чтобы сохранить файл excel. Я что-то упускаю?проблема при экспорте в excel с 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(); 
    } 

И кнопка Эксел:

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

Спасибо,

Tam

ответ

0

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

+0

Это, кажется, хороший выбор. Не могли бы вы дать мне код или ссылку о том, как с этим справиться? С моим кодом выше я мог видеть с помощью FireBug. Я вижу, что тело ответа содержит файл Excel, а тип содержимого - application/vnd.ms-excel, но он не выставляется для загрузки. Я верю, что если у меня это будет отдельный сервлет и перейду на этот сервлет, он может выполнить эту работу. Благодаря! – Tam

+0

Это похоже на то, что вам нужно и/или имеет ссылки на то, что вам нужно: http://www.devx.com/Java/Article/31356 – Drew

0

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

0

Используйте кнопку действия вместо ActionListener

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

Смежные вопросы