jsf - showcase - p: dataExporter no reconoce p: cellEditor
primefaces showcase (2)
El <p:cellEditor>
hecho no es reconocido por los exportadores de datos estándar PrimeFaces. Anteriormente informé esto a los chicos de PF como el número 4013 con un ejemplo que no solo menciona CellEditor
, sino también HtmlGraphicImage
(estamos usando imágenes para mostrar estados booleanos, cuya alt
queremos mostrar en PDF / XML / XLS / Informes CSV).
Primero, cree una nueva clase que extienda el PDFExporter
estándar de la siguiente manera:
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);
}
}
}
Luego, para usarlo, llámalo programáticamente en lugar de a través de <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();
}
Siéntase libre de encontrar la tabla de datos por UIComponent#findComponent()
lugar y establecer el nombre del archivo en el método de acción solamente. El código anterior es solo ejemplar.
Tengo un <p:dataTable>
con <p:cellEditor>
y quiero exportar el contenido de esa tabla al formato PDF usando <p:dataExporter>
.
He incluido el itext 2.1.7 jar . Obtuve el resultado en PDF pero muestra los valores de Object#toString()
de todos los componentes <p:cellEditor>
manera:
org.primefaces.component.celleditor.CellEditor@1bd59e1
¿Cómo exporto los valores de salida de <p:cellEditor>
lugar?
Estoy de acuerdo, también encuentro que este enfoque para personalizar el comportamiento del Exportador es el más flexible y el menos doloroso.
¿Alguien interesado en usar los métodos preProcessor / postProcessor con esto? Aquí hay un ejemplo de cómo hacer eso.
Me atreví a modificar ligeramente el método de la respuesta anterior:
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();
}
Y así es como lo usas en tu página (de nuevo, acabo de modificar el ejemplo anterior):
<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}'')}" />
Observe que NO HAY NESTED EL STATEMENTS (que no está permitido de todos modos), los dos últimos argumentos son cadenas simples que contienen expresiones EL.