p: dataExporter não reconhece p: cellEditor

Eu tenho um editable

com

e eu quero exportar o conteúdo dessa tabela em formato PDF usando

.

Eu incluí o jarro itext 2.1.7 . Eu tenho a saída em PDF, mas mostra os valores de Object#toString() de todos os componentes

assim:

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

Como eu exporto os valores de saída do

vez disso?

O não é de fato reconhecido pelos exportadores de dados padrão PrimeFaces. Eu já relatei isso para os caras da PF como questão 4013 com um exemplo que não apenas menciona o CellEditor , mas também o HtmlGraphicImage (estamos usando imagens para mostrar estados booleanos, cujo alt nós gostaríamos de mostrar em PDF / XML / XLS / Relatórios CSV).

Primeiro, crie uma nova class que estenda o PDFExporter padrão da seguinte forma:

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

Em seguida, para usá-lo, chame-o programaticamente em vez de via .

  ... ... ...    

Com

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

Sinta-se à vontade para encontrar a tabela de dados pelo UIComponent#findComponent() e para definir o nome do arquivo apenas no método de ação. O código acima é apenas exemplar.

Eu concordo, eu também acho essa abordagem para personalizar o comportamento do exportador mais flexível e menos doloroso.

Alguém interessado em usar os methods preProcessor / postProcessor com isso? Aqui está um exemplo de como fazer isso.

Eu ousei modificar ligeiramente o método da resposta acima:

 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 é assim que você o usa na sua página (mais uma vez, acabei de modificar o exemplo acima):

  ... ... ...    

Observe que não existem declarações NESTED (que não é permitido de qualquer maneira), os dois últimos argumentos são strings simples contendo expressões EL.