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

Cur*_*urt 6 java excel jsf richfaces apache-poi

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

  • 我看到PrimeFaces有"出口商特色" http://www.primefaces.org/showcase/ui/exporter.jsf

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

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

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

Bal*_*usC 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.
Run Code Online (Sandbox Code Playgroud)

为了将此作为下载提供给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.
Run Code Online (Sandbox Code Playgroud)

最后,FacesContext#responseComplete()必须调用以防止JSF执行默认导航任务(这只会通过将导航页面的某些HTML输出附加到末尾来破坏Excel文件).

请注意,上面的JSF示例假定JSF 2.x. 如果你实际上使用的JSF 1.x缺少一些便利ExternalContext委托方法,那么你需要抓住raw HttpServletResponseby ExternalContext#getResponse()并对其执行操作.另请参见如何从JSF辅助bean提供文件下载?

  • 只是为了给这个答案添加一些信息,在RichFaces 3.3中你应该使用`<a4j:htmlCommandLink>`来处理这个操作.提供的代码将强制下载,您无法使用ajax请求下载任何文件.假设这个代码在`Bean#toExcel()`上,你应该在你的页面中有这个JSF代码:`<a4j:htmlCommandLink action ="#{bean.toExcel}"target ="_ blank"value ="To Excel"/ >`或类似,取决于需要. (3认同)