p:dataExporter无法识别p:cellEditor

时间:2013-01-19 05:23:33

标签: jsf primefaces datatable data-export

我有一个可编辑的<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>的输出值?

2 个答案:

答案 0 :(得分:12)

PrimeFaces标准数据导出器确实无法识别<p:cellEditor>。 我之前向PF人员报告了issue 4013,其中不仅提到了CellEditor,还提到了HtmlGraphicImage(我们使用图像来显示布尔状态,其{{1}我们想在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(); } 随意查找数据表,并仅在操作方法中设置文件名。上面的代码只是示例性的。

答案 1 :(得分:4)

我同意,我也发现这种方法可以将Exporter行为定制为最灵活,最不痛苦的。

有兴趣使用 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表达式的简单字符串。