我有一个带有<p:dataTable>的可编辑<p:cellEditor>,并且我想使用<p:dataExporter>将该表的内容导出为PDF格式。

我已经包括了 itext 2.1.7 jar 。我得到了PDF输出,但它显示了所有Object#toString()组件的<p:cellEditor>值,如下所示:

org.primefaces.component.celleditor.CellEditor@1bd59e1

我该如何导出<p:cellEditor>的输出值呢?

最佳答案

PrimeFaces标准数据导出器确实无法识别<p:cellEditor>
我以前以issue 4013的形式向PF人员报告了此示例,该示例不仅提到了CellEditor,而且还提到了HtmlGraphicImage(我们使用图像来显示 bool 状态,我们希望将其alt显示为PDF/XML/XLS/CSV报告)。

首先,创建一个扩展标准PDFExporter的新类,如下所示:

public class ExtendedPDFExporter extends PDFExporter {

    @Override
    protected String exportValue(FacesContext context, UIComponent component) {
        if (component instanceof CellEditor) {
            return exportValue(context, ((CellEditor) component).getFacet("output"));
        }
        else if (component instanceof HtmlGraphicImage) {
            return (String) component.getAttributes().get("alt");
        }
        else {
            return super.exportValue(context, component);
        }
    }

}

然后,要使用它,请以编程方式而不是通过<p:dataExporter>进行调用。
<p:dataTable binding="#{table}" editable="true" ...>
    <p:column><p:cellEditor>...</p:cellEditor></p:column>
    <p:column><p:cellEditor>...</p:cellEditor></p:column>
    <p:column><p:cellEditor>...</p:cellEditor></p:column>
    <p:column exportable="false"><p:rowEditor /></p:column>
</p:dataTable>
<h:commandLink value="PDF" action="#{bean.exportPDF(table, 'filename')}" />


public void exportPDF(DataTable table, String filename) throws IOException {
    FacesContext context = FacesContext.getCurrentInstance();
    Exporter exporter = new ExtendedPDFExporter();
    exporter.export(context, table, filename, false, false, "UTF-8", null, null);
    context.responseComplete();
}

随意通过UIComponent#findComponent()查找数据表,并仅在操作方法中设置文件名。上面的代码仅是示例性的。

10-06 04:52