11

で編集可能<p:dataTable><p:cellEditor>、を使用してそのテーブルの内容を PDF 形式にエクスポートしたいと考えています<p:dataExporter>

itext 2.1.7 jarを含めました。出力は PDF で取得しましたが、次のようObject#toString()にすべてのコンポーネントの値が表示されます。<p:cellEditor>

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

<p:cellEditor>代わりに出力値をエクスポートするにはどうすればよいですか?

4

2 に答える 2

12

<p:cellEditor>実際、PrimeFaces の標準データ エクスポータでは認識されません。私は以前、これを問題 4013として PF 担当者に報告しました。例ではCellEditor、 だけでなく、 ( PDF/XML/XLS/CSV レポートで表示したいHtmlGraphicImageブール値の状態を表示するために画像を使用しています)。 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()、ファイル名をアクションメソッドでのみ設定してください。上記のコードは単なる例です。

于 2013-01-19T11:39:45.027 に答える
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 ステートメントがないことに注意してください(とにかく許可されていません)。最後の 2 つの引数は、EL 式を含む単純な文字列です。

于 2013-04-03T11:15:38.857 に答える