p:Column 复合元素不会在 p:DataExporter 中导出
Posted
技术标签:
【中文标题】p:Column 复合元素不会在 p:DataExporter 中导出【英文标题】:p:Column composite element wont export in p:DataExporter 【发布时间】:2013-12-16 01:27:04 【问题描述】:我在尝试导出包含某些列的 DataTable 时遇到问题,DataTable 和 Column 组件都是复合元素,如下所示:
自定义 dataTable XHTML (v:dataTable):
<cc:interface>
<cc:attribute name="value" required="true" />
<cc:attribute name="selectionMode" default="multiple" />
<cc:attribute name="selectionBean" />
<cc:attribute name="selectionProperty" />
<cc:facet name="header" />
</cc:interface>
<cc:implementation>
<p:dataTable id="teste" var="tableItem" value="#cc.attrs.value"
selection="#cc.attrs.selectionBean[cc.attrs.selectionProperty]"
rowKey="#tableItem.id" rowsPerPageTemplate="15, 30, 45"
paginator="true" rows="15"
emptyMessage="#messages['dataTable.emptyMessage']">
<cc:insertChildren />
<f:facet name="footer">
<p:commandButton value="#messages['dataTable.exportExcel']"
ajax="false">
<p:dataExporter type="xls" target="teste" fileName="export" />
</p:commandButton>`enter code here`
</f:facet>
</p:dataTable>
</cc:implementation>
自定义列 XHTML (v:dataColumn):
<cc:interface
componentType="com.example.VDataColumn">
<cc:attribute name="value" />
</cc:interface>
<cc:implementation>
<c:choose>
<c:when test="#cc.childCount gt 0">
<cc:insertChildren />
</c:when>
<c:otherwise>
<h:outputText value="#cc.attrs.value" />
</c:otherwise>
</c:choose>
</cc:implementation>
Column 组件是 org.primefaces.component.column.Column 类的扩展:
package com.example.component;
import javax.faces.component.FacesComponent;
import javax.faces.component.NamingContainer;
import javax.faces.component.UINamingContainer;
import org.primefaces.component.column.Column;
@FacesComponent("com.example.VDataColumn")
public class VDataColumn extends Column implements NamingContainer
@Override
public String getFamily()
return UINamingContainer.COMPONENT_FAMILY;
DataTable 和 Column 使用如下:
<v:dataTable
value="#testController.resultList"
selectionBean="#testController"
selectionProperty="selectedList" selectionMode="multiple">
<p:column value="#tableItem.id" headerText="ID" />
<v:dataColumn value="#tableItem.code" headerText="Code" />
<v:dataColumn value="#tableItem.nome" headerText="Name" />
<v:dataColumn value="#tableItem.desc" headerText="Desc" />
</v:dataTable>
当我尝试使用组件内的 dataExporter 导出 dataTable 时,我在 XLS 文件中只得到一列,而且它只是 p:column。
调试primefaces DataExporter 类,我注意到DataTable 对象在getChildren() 方法中包含4 个对象,1 个Column 和3 个VDataColumn,只有Column 对象本身包含子对象。
有人遇到同样的问题吗?我正在使用 Primefaces 4.0
【问题讨论】:
【参考方案1】:我在使用自定义组件时遇到了同样的问题。我们通过扩展导出器并为组件使用自定义验证来解决。
if (component instanceof UINamingContainer)
UINamingContainer uiNamingContainer = (UINamingContainer) component;
UIComponent panel = uiNamingContainer.getFacet(UIComponent.COMPOSITE_FACET_NAME);
Collection<UIComponent> children = panel.getChildren();
for (UIComponent uiComponent : children)
if (uiComponent instanceof javax.faces.component.html.HtmlOutputText)
try
uiNamingContainer.encodeBegin(context);
return super.exportValue(context, uiComponent);
catch (IOException e)
LOGGER.error(e);
finally
try
uiNamingContainer.encodeEnd(context);
catch (IOException e)
LOGGER.error(e);
【讨论】:
此更改适用于哪个版本?请将其添加到答案中。以上是关于p:Column 复合元素不会在 p:DataExporter 中导出的主要内容,如果未能解决你的问题,请参考以下文章