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

时间:2012-11-02 16:20:01

标签: java excel jsf richfaces apache-poi

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

  • 我看到PrimeFaces有“导出功能”http://www.primefaces.org/showcase/ui/exporter.jsf

  • 我希望能够通过使用PrimeFaces,但使用richFaces(版本3.3.3)来做类似的事情......(我想在某些时候迁移到RichFaces 4)未来但我现在仍然坚持使用3.3.3

  • 我已经读过可以使用http://poi.apache.org/建立自己的,但我不知道从哪里开始实现这样的事情......

有关如何最好地执行所需出口和示例的任何想法将非常感谢!

2 个答案:

答案 0 :(得分:10)

在JSF中使用POI与在普通Java中使用POI没有什么不同。只需拥有代表每条记录的项目集合。您必须已经拥有它,因为您正在使用也需要此类集合的数据表。您只需迭代完全相同的集合即可在POI中创建Excel工作表。

这是一个启动示例,其中itemsList<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。您还需要设置响应内容类型(以便浏览器知道要与之关联的应用程序)和响应内容处置(以便它作为附件打开并且它具有有效的文件名)。

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缺少几个方便的ExternalContext委托方法,那么你需要通过ExternalContext#getResponse()获取原始HttpServletResponse并对其执行操作。另请参阅How to provide a file download from a JSF backing bean?

答案 1 :(得分:-2)

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