Primefaces仅导出一个可扩展表

时间:2019-03-06 10:36:15

标签: jsf primefaces primefaces-extensions

我正在尝试使用PrimeFaces扩展将视图导出到xlsx。我有一个主表和一个内部有2个表的可扩展行。

导出器对于可扩展行中的第一个dataTable正常工作,但对另一个表则无效。有什么想法吗?

<p:dataTable id="mainTable" var="mainObject" value="#{mainBean.mainList}">
    <p:column exportable="false" width="5%">  
        <p:rowToggler />  
    </p:column>

    <p:column>
        <f:facet name="header">
            <h:outputText value="main column A"/>
        </f:facet>
        <h:outputText value="#{mainObject.columnA}" />
    </p:column>

    <p:column>
        <f:facet name="header">
            <h:outputText value="main column B"/>
        </f:facet>
        <h:outputText value="#{mainObject.columnB}" />
    </p:column>

    <p:rowExpansion>

        <p:datTable id="relatedTableA" var="relatedA" value="#{mainObject.relatedA}">
            <f:facet name="header">
                <h:outputText value="Related A"/>
            </f:facet>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="Related A column A"/>
                </f:facet>
                <h:outputText value="#{relatedA.columnA}" />
            </p:column>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Related A column B"/>
                </f:facet>
                <h:outputText value="#{relatedA.columnB}" />
            </p:column>
        </p:dataTable>

        <p:datTable id="relatedTableB" var="relatedB" value="#{mainObject.relatedB}">
            <f:facet name="header">
                <h:outputText value="Related B"/>
            </f:facet>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="Related B column A"/>
                </f:facet>
                <h:outputText value="#{relatedB.columnA}" />
            </p:column>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Related B column B"/>
                </f:facet>
                <h:outputText value="#{relatedB.columnB}" />
            </p:column>
        </p:dataTable>

    </p:rowExpansion>

</p:dataTable>

<h:commandLink>
   <p:graphicImage url="/resources/images/Excel32.png" width="32"/>
   <pe:exporter type="xlsx" target="mainTable" fileName="fileExport" facetBackground="#AAFFBB" datasetPadding="4" />   
</h:commandLink>

我遵循了本指南:https://www.primefaces.org/showcase-ext/sections/exporter/expandableTable.jsf

在我的应用程序中,视图工作完美。我使用切换,然后显示了2个表。唯一的问题是,它仅导出其中一个可扩展内容。

感谢您的时间。

1 个答案:

答案 0 :(得分:3)

似乎完全不支持。

exporting the row expensions的导出器组件源代码中,他们已经硬编码为仅考虑每行的第一个子元素:

if (rowExpansion.getChildren().get(0) instanceof DataTable) {
    final DataTable childTable = (DataTable) rowExpansion.getChildren().get(0);
    // ...
}

这就是为什么您只在输出中获得第一个子表的原因。

使用customExporter feature,您将有机会扩展ExcelExporter并覆盖似乎对您的问题负责的方法exportCells。然后更改行为以在rowExpansion.getChildren()上循环,而不仅仅是获取第一个元素。

the linked site配置自定义导出程序的常规步骤:

  

第1步:在resouces文件夹下创建一个名为META-INF的文件夹。   META-INF文件夹创建另一个名为services的文件夹。

     

第2步:Creae a   服务名称为“ ExporterFactory”的文件(完整的二进制名称为   服务)。       在这里应该是org.primefaces.extensions.component.exporter.ExporterFactory。

     

步骤3:   在任何地方提供您自己的Exporter工厂的实现者/提供者   在您的项目中。       并将自定义导出器工厂实现的绝对路径复制到ExporterFactory文件中       怎么做:复制DefaultExporterFactory的文件内容并将文件重命名为CustomExporterFactory。复制绝对路径   的org.primefaces.extensions.showcase.util.CustomExporterFactory   ExporterFactory文件。

     

第4步:复制导出器实现并   添加您自己的更改。并调用这些自定义实现(例如   PDFCustomExporter,ExcelCustomExporter)内置   实现(Ex PDFExporter,ExcelExporter)