You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何像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ğ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:23:15