我想将<rich:dataTable>或<rich:extendedDataTable>的内容导出到excel。
任何想法,如何最好地预先形成期望的出口和例子,将不胜感激!
发布于 2012-11-02 16:50:08
在JSF中使用POI与在普通Java中使用POI并没有什么区别。只需要一组表示每条记录的项。您必须已经使用了它,因为您使用的是datatable,它也接受这样的集合。您只需迭代完全相同的集合,就可以在POI中创建excel工作表。
下面是一个启动示例,其中items是您在datatable中也使用的一个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示例假设JSF2.x。如果您实际使用的是JSF1.x,它缺少几个方便的ExternalContext委托方法,那么您需要通过ExternalContext#getResponse()获取原始的HttpServletResponse并在其上执行操作。另见如何从JSF后台bean提供文件下载?
发布于 2014-09-19 13:35:47
我还需要这个功能,所以我使用primefaces dataExporter组件并将其修改为与Richfaces一起使用。我还添加了导出collapsibleSubTable内部表的功能。Primefaces和Richfaces是开源的,请随意改进它。包含源和示例的包:捆绑
https://stackoverflow.com/questions/13199185
复制相似问题