使用JSF导出Excel时出现问题
-
21-08-2019 - |
题
我正在使用 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}"/>
谢谢,
谭
解决方案
我建议你把这个代码到它自己的servlet。你试图短路JSF通常的寿命周期,虽然你也许能找到一个方法来做到这一点,它可能会更简单,甚至可能更清洁,以简单地做一个新的Servlet负责处理该XLS文件,并让它做自己的事。你可以把合适的对象到会话暂时从你的动作按钮,引导他们到servlet,抓住他们在servlet,然后从会议中删除。
其他提示
我专门针对 ICEFaces 实现发布了一篇博文 这里.
使用按钮动作的代替的ActionListener
为我工作
不隶属于 StackOverflow