Primefaces 仅导出一个可扩展 table
Primefaces exporting only one expandable table
我正在尝试使用 PrimeFaces 扩展将视图导出到 xlsx。我有一个主 table 和一个可扩展行,里面有 2 tables。
导出器对可扩展行中的第一个数据表工作正常,但对另一个数据表不工作。有什么想法吗?
<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 tables。唯一的问题是它只导出一个可扩展项。
感谢您的宝贵时间。
看来这根本不支持。
在导出器组件源代码中,当涉及到 exporting the row expensions 时,他们已经硬编码为仅考虑每个行的第一个子项 Expansion:
if (rowExpansion.getChildren().get(0) instanceof DataTable) {
final DataTable childTable = (DataTable) rowExpansion.getChildren().get(0);
// ...
}
这就是为什么你在输出中只得到第一个子table。
使用 customExporter feature 您有机会扩展 ExcelExporter
并覆盖方法 exportCells
,这似乎是您问题的原因。然后更改行为以在 rowExpansion.getChildren()
上执行循环,而不是仅获取第一个元素。
从 the linked site 配置自定义导出器的一般步骤:
Step 1: Create a folder named META-INF under resouces folder.Below
META-INF folder create another folder called services.
Step 2: Creae a
file with the name "ExporterFactory" as a service(Fully binary name of
the service).
Here it should be org.primefaces.extensions.component.exporter.ExporterFactory.
Step 3:
Provide your own implementaions/providers of Exporter factory anywhere
in your project.
And copy the absolute path of custom exporter factory implementation in the ExporterFactory file
How to do : Copy the file content of DefaultExporterFactory and rename the file as CustomExporterFactory.Copy the absolute path
org.primefaces.extensions.showcase.util.CustomExporterFactory in
ExporterFactory file.
Step 4: Copy the exporter implementations and
add your own changes.And call these custom implementations(Ex
PDFCustomExporter,ExcelCustomExporter) instead built-in
implmentations(Ex PDFExporter,ExcelExporter)
我正在尝试使用 PrimeFaces 扩展将视图导出到 xlsx。我有一个主 table 和一个可扩展行,里面有 2 tables。
导出器对可扩展行中的第一个数据表工作正常,但对另一个数据表不工作。有什么想法吗?
<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 tables。唯一的问题是它只导出一个可扩展项。
感谢您的宝贵时间。
看来这根本不支持。
在导出器组件源代码中,当涉及到 exporting the row expensions 时,他们已经硬编码为仅考虑每个行的第一个子项 Expansion:
if (rowExpansion.getChildren().get(0) instanceof DataTable) {
final DataTable childTable = (DataTable) rowExpansion.getChildren().get(0);
// ...
}
这就是为什么你在输出中只得到第一个子table。
使用 customExporter feature 您有机会扩展 ExcelExporter
并覆盖方法 exportCells
,这似乎是您问题的原因。然后更改行为以在 rowExpansion.getChildren()
上执行循环,而不是仅获取第一个元素。
从 the linked site 配置自定义导出器的一般步骤:
Step 1: Create a folder named META-INF under resouces folder.Below META-INF folder create another folder called services.
Step 2: Creae a file with the name "ExporterFactory" as a service(Fully binary name of the service). Here it should be org.primefaces.extensions.component.exporter.ExporterFactory.
Step 3: Provide your own implementaions/providers of Exporter factory anywhere in your project. And copy the absolute path of custom exporter factory implementation in the ExporterFactory file How to do : Copy the file content of DefaultExporterFactory and rename the file as CustomExporterFactory.Copy the absolute path org.primefaces.extensions.showcase.util.CustomExporterFactory in ExporterFactory file.
Step 4: Copy the exporter implementations and add your own changes.And call these custom implementations(Ex PDFCustomExporter,ExcelCustomExporter) instead built-in implmentations(Ex PDFExporter,ExcelExporter)