6

我想导出 a<rich:dataTable><rich:extendedDataTable>excel 的内容。

任何关于如何最好地执行所需导出和示例的想法将不胜感激!

4

2 回答 2

10

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

这是一个启动示例,您也在数据表中使用的itemsa是: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()as 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方法,那么您需要获取原始数据并对其执行操作。另请参阅如何从 JSF 支持 bean 提供文件下载?HttpServletResponseExternalContext#getResponse()

于 2012-11-02T16:50:08.490 回答
-2

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

于 2014-09-19T13:35:47.067 回答