我正在尝试使用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个表。唯一的问题是它只导出一个可扩展的。
谢谢你的时间。
看来这根本不受支持。
在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:在资源文件夹下创建名为META-INF的文件夹.Below META-INF文件夹创建另一个名为services的文件夹。
步骤2:将名为“ExporterFactory”的文件作为服务创建(服务的完全二进制名称)。这里应该是org.primefaces.extensions.component.exporter.ExporterFactory。
第3步:在项目的任何位置提供您自己的Exporter工厂实施/提供者。并在ExporterFactory文件中复制自定义导出器工厂实现的绝对路径如何操作:复制DefaultExporterFactory的文件内容,并将文件重命名为CustomExporterFactory.Copy ExporterFactory文件中的绝对路径org.primefaces.extensions.showcase.util.CustomExporterFactory。
第4步:复制导出器实现并添加您自己的更改。并调用这些自定义实现(Ex PDFCustomExporter,ExcelCustomExporter)而不是内置的实现(Ex PDFExporter,ExcelExporter)