如何将rich:dataTable导出为ex​​cel

我想将<rich:dataTable><rich:extendedDataTable>的内容导出为ex​​cel。

  • 我已经看到PrimeFaces有“出口商function” http://www.primefaces.org/showcase/ui/exporter.jsf

  • 我想只能用PrimeFaces做类似的事情,但是用richFaces(版本3.3.3)…(我想在将来的某个时候迁移到RichFaces 4,但是我坚持3.3 .3现在)

  • 我读过,有可能build立自己的使用http://poi.apache.org/,但我不知道从哪里开始实施这样的事情…

任何关于如何最好地预制所需的出口和例子的想法将不胜感激!

在JSF中使用POI与在普通Java中使用POI并没有什么不同。 只需要收集代表每个logging的项目。 你必须已经拥有它,因为你正在使用一个也需要这样一个集合的数据表。 您只需迭代完全相同的集合即可在POI中创build一个Excel工作表。

下面是一个开始的例子,其中items是一个List<Item> ,你也在数据表中使用:

 Workbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet("sheet title"); int rowIndex = 0; for (Item item : items) { Row row = sheet.createRow(rowIndex++); int columnIndex = 0; row.createCell(columnIndex++).setCellValue(item.getId()); row.createCell(columnIndex++).setCellValue(item.getName()); row.createCell(columnIndex++).setCellValue(item.getValue()); // ... } workbook.write(someOutputStream); // Write the Excel result to some output. 

为了提供这个作为JSF响应的下载,你需要提供ExternalContext#getResponseOutputStream()作为someOutputStream 。 您还需要设置响应内容types(以便浏览器知道与其关联的应用程序)和响应内容处置(以使其作为附件打开并且具有有效的文件名)。

 FacesContext context = FacesContext.getCurrentInstance(); ExternalContext externalContext = context.getExternalContext(); externalContext.responseReset(); externalContext.setResponseContentType("application/vnd.ms-excel"); externalContext.setResponseHeader("Content-Disposition", "attachment;filename=export.xls"); workbook.write(externalContext.getResponseOutputStream()); context.responseComplete(); // Prevent JSF from performing navigation. 

最后,必须调用FacesContext#responseComplete()来防止JSF执行默认的导航任务(只会将导航页面的HTML输出附加到最后),从而导致Excel文件损坏。

请注意,上面的JSF示例假定使用JSF 2.x. 如果实际上使用的JSF 1.x缺less一些便利的ExternalContext委托方法,那么您需要通过ExternalContext#getResponse()获取原始的HttpServletResponse并对其执行操作。 另请参见如何从JSF支持bean提供文件下载?

我也需要这个function,所以我拿了primefaces dataExporter组件,并修改它与Richfaces一起使用它。 我还添加了导出collapsibleSubTable内部表的function。 Primefaces和Richfaces是开源的,随时可以改进。 包含源和例子的包 : bundle