2013-01-19 14 views
11

Mam edytowalną <p:dataTable> z <p:cellEditor> i chcę wyeksportować zawartość tej tabeli do formatu PDF przy użyciu <p:dataExporter>.p: dataExporter nie rozpoznaje p: cellEditor

Dołączyłem słoik itext 2.1.7. Mam wyjście w formacie PDF, ale to pokazuje wartości Object#toString() wszystkich <p:cellEditor> komponentów tak:

[email protected] 

Jak mogę wyeksportować wartości wyjściowych <p:cellEditor> zamiast?

+0

Bez pokazywania kodu, obawiam się, że trudno będzie każdemu udzielić pomocy. –

Odpowiedz

11

Urządzenie <p:cellEditor> nie jest rozpoznawane przez standardowe eksportery danych PrimeFaces. Zgłosiłem to wcześniej do facetów z PF jako issue 4013 z przykładem, który nie tylko wspomina o CellEditor, ale także HtmlGraphicImage (używamy obrazów do pokazania stanów logicznych, których alt chcielibyśmy pokazać w PDF/XML/XLS/Raporty CSV).

Najpierw należy utworzyć nową klasę, która rozciąga średnia PDFExporter jak następuje:

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

} 

Następnie, aby go używać, nazywają go programowo zamiast poprzez <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')}" /> 

Z

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

Zapraszam znaleźć tabelę danych przez UIComponent#findComponent() zamiast i ustawić nazwę pliku w jedynej metody działania. Powyższy kod jest tylko przykładowy.

+9

jesteś moim numerem referencyjnym JSF # 1! Jesteś niesamowitym człowiekiem! – fareed

+0

W 99% wszystkich przypadków Balus ma właściwą odpowiedź. To rozwiązanie działa również w ExcelExporter. Ale mam problem z uruchomieniem tego vorka CSVExporter – Przemek

+0

@Przemek: ich "CSVExporter' ma w niektórych wersjach rzeczywiście błąd, ale nie jest to związane z konkretnym pytaniem. – BalusC

3

Zgadzam się, uważam, że takie podejście pozwala dostosować zachowanie eksportera jako najbardziej elastyczne i najmniej bolesne.

Ktoś zainteresowany wykorzystaniem metod preProcessor/postProcessor z tym? Oto przykład, jak to zrobić.

odważyłem się nieznacznie zmodyfikować metodę z odpowiedzi powyżej:

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

} 

I to jak go używać na swojej stronie (ponownie, po prostu zmodyfikowany powyższy przykład):

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

Zauważ, że NIE MA ZASTRZEŻONYCH EL STATEMENTÓW (to i tak nie jest dozwolone), ostatnie dwa argumenty są prostymi łańcuchami zawierającymi wyrażenia EL.

+0

Dziękuję, że działało bardzo dobrze. Nigdy bym tego nie zgadł. – ihebiheb

Powiązane problemy