如何像PrimeFaces DataTable一样导出PrimeFaces Extensions Sheet数据?
PrimeFaces Extensions Sheet 数据导出方案
PrimeFaces原生的p:dataExporter仅支持DataTable组件,直接用于Sheet会抛出类型转换异常,以下是可行的实现方案:
方法一:手动实现Excel导出(推荐)
通过Sheet组件的API获取数据,结合Apache POI生成Excel文件,这是最灵活的方案。
1. 前台代码
<p:commandButton value="XLS" styleClass="mr-2 mb-2" action="#{sheetExportBean.exportToXls}" ajax="false" /> <!-- 将Sheet组件绑定到后台Bean --> <pe:sheet id="sheet" binding="#{sheetExportBean.sheetComponent}" value="#{yourBean.rows}" var="row"> <!-- 你的列定义 --> </pe:sheet>
2. 后台Bean导出逻辑
import org.primefaces.extensions.component.sheet.Sheet; import org.primefaces.extensions.model.sheet.SheetRow; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; public class SheetExportBean { // 绑定页面的Sheet组件 private Sheet sheetComponent; public void exportToXls() throws IOException { List<SheetRow> rows = sheetComponent.getRows(); if (rows == null || rows.isEmpty()) { return; } // 创建Excel工作簿 Workbook workbook = new XSSFWorkbook(); org.apache.poi.ss.usermodel.Sheet excelSheet = workbook.createSheet("部门数据"); // 设置表头样式 CellStyle headerStyle = workbook.createCellStyle(); Font headerFont = workbook.createFont(); headerFont.setBold(true); headerStyle.setFont(headerFont); // 写入表头(根据你的Sheet列名调整) Row headerRow = excelSheet.createRow(0); String[] headers = {"ID", "部门名称", "部门描述"}; for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); cell.setCellStyle(headerStyle); } // 写入数据行 int rowNum = 1; for (SheetRow sheetRow : rows) { // 替换为你的业务实体类 Department dept = (Department) sheetRow.getData(); Row dataRow = excelSheet.createRow(rowNum++); dataRow.createCell(0).setCellValue(dept.getId()); dataRow.createCell(1).setCellValue(dept.getName()); dataRow.createCell(2).setCellValue(dept.getDescription()); } // 自动调整列宽 for (int i = 0; i < headers.length; i++) { excelSheet.autoSizeColumn(i); } // 输出到浏览器 HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Content-Disposition", "attachment; filename=\"department.xlsx\""); workbook.write(response.getOutputStream()); workbook.close(); FacesContext.getCurrentInstance().responseComplete(); } // Getter & Setter public Sheet getSheetComponent() { return sheetComponent; } public void setSheetComponent(Sheet sheetComponent) { this.sheetComponent = sheetComponent; } }
3. Maven依赖配置
确保项目引入Apache POI依赖(PrimeFaces 12兼容POI 4.x):
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency>
方法二:使用内置导出组件(版本限制)
PrimeFaces Extensions 13及以上版本新增了pe:sheetExporter组件,升级后可直接使用:
<p:commandButton value="XLS" styleClass="mr-2 mb-2"> <pe:sheetExporter type="xls" target="mainForm:sheet" fileName="department"/> </p:commandButton>
内容的提问来源于stack exchange,提问作者Samet Dağ
相关产品推荐
相关产品推荐

