【问题标题】:Primefaces exporting only one expandable tablePrimefaces 仅导出一个可扩展表
【发布时间】:2019-03-06 10:36:15
【问题描述】:

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

导出器对可扩展行中的第一个数据表工作正常,但对另一个数据表却不行。有什么想法吗?

<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 个表。唯一的问题是它只导出了一个展开式。

感谢您的宝贵时间。

【问题讨论】:

    标签: jsf primefaces primefaces-extensions


    【解决方案1】:

    似乎根本不支持。

    在导出器组件源代码中,当涉及到exporting the row expensions 时,它们已硬编码为仅考虑每个 rowExpansion 的第一个子项:

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

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

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

    the linked site 配置自定义导出器的一般步骤:

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

    第 2 步:创建一个 名称为“ExporterFactory”的文件作为服务(完全二进制名称 服务)。 这里应该是 org.primefaces.extensions.component.exporter.ExporterFactory。

    第 3 步: 在任何地方提供您自己的出口商工厂的实施/供应商 在你的项目中。 并复制ExporterFactory文件中自定义exporter factory实现的绝对路径 操作方法:复制DefaultExporterFactory的文件内容并将文件重命名为CustomExporterFactory。复制绝对路径 org.primefaces.extensions.showcase.util.CustomExporterFactory 在 ExporterFactory 文件。

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

    【讨论】:

    • 我以为我必须使用自定义导出器功能,但你知道.. 寄予厚望.. 感谢您的快速回复。
    猜你喜欢
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多