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 中导出的主要内容,如果未能解决你的问题,请参考以下文章

复合图层(硬件加速)

在复合类型数组中搜索元素

GO语言学习——复合数据类型 数组

如何在 EJB3 中使用非关键复合元素?

CSS基础知识二复合选择器元素显示模式背景三大特性注释

css的复合选择器