p:列复合元素不会在p:DataExporter中导出

时间:2013-11-29 20:06:16

标签: jsf-2 primefaces datatable custom-component composite

我在尝试使用某些列导出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:列。

调试primefaces DataExporter类,我注意到DataTable对象在getChildren()方法中包含4个对象,一个Column和3个VDataColumn,并且只有Column对象包含子级本身。

有没有人有同样的问题?我正在使用Primefaces 4.0

1 个答案:

答案 0 :(得分:0)

我遇到了与自定义组件相同的问题。我们通过扩展导出器并使用组件的自定义验证来解决。

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