2013-01-19 11 views
11

Possiedo un <p:dataTable> modificabile con <p:cellEditor> e voglio esportare il contenuto di quella tabella in formato PDF utilizzando <p:dataExporter>.p: dataExporter non riconosce p: cellEditor

Ho incluso lo itext 2.1.7 jar. Ho avuto l'output in PDF, ma mostra i valori di tutte le Object#toString()<p:cellEditor> componenti in questo modo:

[email protected] 

Come faccio a esportare i valori di uscita al posto del <p:cellEditor>?

+0

Senza mostrare alcun codice, temo che sarà difficile per chiunque fornire aiuto. –

risposta

11

Lo <p:cellEditor> non viene riconosciuto dagli esportatori di dati standard PrimeFaces. Ho già segnalato questo ai ragazzi PF come issue 4013 con un esempio che non menziona solo CellEditor, ma anche HtmlGraphicImage (stiamo usando le immagini per mostrare gli stati booleani, di cui ci piacerebbe mostrare alt in PDF/XML/XLS/Rapporti CSV).

In primo luogo, creare una nuova classe che estende lo standard PDFExporter piace segue:

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); 
     } 
    } 

} 

Quindi, per utilizzarlo, lo chiamano a livello di codice, invece di via <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')}" /> 

Con

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(); 
} 

Sentitevi liberi di trovare la tabella dei dati da UIComponent#findComponent(), invece, e per impostare il nome del file in un solo metodo di azione. Il codice sopra è solo esemplare.

+9

sei il mio riferimento JSF n. 1! Sei un uomo fantastico! – fareed

+0

Nel 99% dei casi Balus ha la risposta giusta. Questa soluzione funziona anche per ExcelExporter. Ma ho un problema nel far funzionare questo con CSVExporter – Przemek

+0

@Przemek: il loro 'CSVExporter' ha in alcune versioni un bug, ma questo non è ulteriormente collegato alla domanda concreta. – BalusC

3

Sono d'accordo, trovo anche questo approccio per personalizzare il comportamento dell'Esportatore il più flessibile e meno doloroso.

Chiunque sia interessato a utilizzando i preprocessore/Postprocessor metodi con questo? Ecco un esempio su come farlo.

ho osato modificare leggermente il metodo della risposta di cui sopra:

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(); 

} 

e questo è come lo si utilizza nella tua pagina (di nuovo, ho appena modificato l'esempio precedente):

<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}')}" /> 

Si noti che NON CI SONO NESSUN DICHIARAZIONI NESTATE (che non è comunque consentito), gli ultimi due argomenti sono stringhe semplici contenenti espressioni EL.

+0

Grazie, ha funzionato molto bene. Non l'avrei mai indovinato. – ihebiheb