p: dataexporters不能识别p: cellitor



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

我已经包含了文本2.1.7 jar。我得到PDF格式的输出,但它显示了所有<p:cellEditor>组件的Object#toString()值,如下所示:
org.primefaces.component.celleditor.CellEditor@1bd59e1

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

<p:cellEditor>确实不能被PrimeFaces标准数据导出器识别。我以前向PF人员报告过这个问题,作为4013号问题,其中有一个例子,不仅提到了CellEditor,还提到了HtmlGraphicImage(我们使用图像来显示布尔状态,我们希望在PDF/XML/XLS/CSV报告中显示其alt)。

首先,创建一个扩展标准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()查找数据表,并仅设置filename in action方法。以上代码只是示例性的。

我同意,我也发现这种自定义出口商行为的方法是最灵活和最不痛苦的。

有人有兴趣使用preProcessor/postProcessor方法吗?下面是一个如何做到这一点的例子。

我敢根据上面的答案稍微修改一下方法:

public void exportPDF(DataTable table, String filename, 
        String preProcessor, String postProcessor) throws IOException {
    FacesContext context = FacesContext.getCurrentInstance();
    ExpressionFactory factory = context.getApplication().getExpressionFactory();
    MethodExpression preProcessorME = factory.createMethodExpression(
        context.getELContext(), preProcessor, null, new Class[] {Object.class});
    MethodExpression postProcessorME = factory.createMethodExpression(
        context.getELContext(), postProcessor, null, new Class[] {Object.class});
    Exporter exporter = new ExtendedPDFExporter();
    exporter.export(context, table, filename, false, false, "UTF-8", 
        preProcessorMe, postProcessorME);
    context.responseComplete();
}

在你的页面中是这样使用的(同样,我只是修改了上面的例子):

<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', 
    '#{yourBean.preProcessPDF}', '#{yourBean.postProcessPDF}')}" />

注意没有嵌套的EL语句(无论如何是不允许的),最后两个参数是包含EL表达式的简单字符串。

最新更新