![](/img/trans.png)
[英]Export to Excel (Java List, HtmlDataTable, rich:dataTable)
[英]How to export rich:dataTable to excel
我想将<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/构建自己的,但我不知道从哪里开始实现这样的东西......
任何关于如何最好地预先形成所需出口和示例的想法将不胜感激!
在JSF中使用POI与在普通Java中使用POI没有什么不同。 只需拥有代表每条记录的项目集合。 您必须已经拥有它,因为您正在使用也需要此类集合的数据表。 您只需迭代完全相同的集合即可在POI中创建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
。 您还需要设置响应内容类型(以便浏览器知道要与其关联的应用程序)和响应内容处置(以便将其作为附件打开并且它具有有效的文件名)。
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
并对其执行操作。 另请参见如何从JSF辅助bean提供文件下载?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.