【问题标题】:p:Column composite element wont export in p:DataExporterp:Column 复合元素不会在 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

【问题讨论】:

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


    【解决方案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);
                        }
                    }
                }
            }
        }
    

    【讨论】:

    • 此更改适用于哪个版本?请将其添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    相关资源
    最近更新 更多