p:dataExporter 导出所有数据表,而不仅仅是目标数据表组件

问题描述 投票:0回答:0

我正在从数据库中查询数据,并在单独的 中为每个结果呈现结果。我正在使用一个带有多个 来保存这个结果列表。每个结果都在一个单独的选项卡下,并使用 显示其值。我使用 自定义了选项卡标题,每个标题都包含一个 和一个 组件,以帮助我导出(以 xls 格式)相关 中的 。在每个 组件中,我都针对包含在其标题所在的关联选项卡中的 。当我尝试使用其选项卡中的 以 xls 格式导出任何一个 时,它会为其中的每个 创建一个工作表 而不仅仅是它的目标 .

primefaces 中的 组件利用Apache POI 库将 导出为不同的格式。我正在尝试调试 xls 格式的问题。似乎预期的行为是每个 组件在触发时应该创建一个单独的 HSSFWorkbook 和一个代表目标 HSSFSheet。这是正在发生的事情,

  • 当我尝试通过在服务器端函数中隐式传递的对象查看 的后处理器中的 HSSFWorkbook 的状态时,我注意到该工作簿包含多张工作表, 中的每个
  • 一张
  • 下载的xls文件中每个sheet的名称等于
  • 的id
  • facelets 文件(不是客户端 id,它包含 accordionPanel 的所有信息和前面的选项卡,使 唯一)加上索引 1,2,3 表示选项卡位置。
  • 当我查看 primefaces 中负责导出 的实际 DataTableExcelExporter 类时,我注意到创建这些工作表的 doExport 函数被调用了不止一次,每个 调用一次,而不仅仅是 所针对的 组件。
  • 现在我可以在后处理器服务器端回调中操作 HSSFSheets,并删除不需要的工作表,但我认为这不是正确的方法。另外,我还使用了一个 csv 导出器,该导出器的结果是每个 的信息都集中在一个文件中。
  • 当我从查询中获得具有相同名称的结果的工作表命名冲突时,我查找了错误链,并且似乎组件将任何事件(如点击)广播到其周围和内部组件,所以正在考虑这是否可能是问题的根本原因。

小脸

             <p:accordionPanel class="search-results-panel" id="searchResultsPanel" rendered="true" multiple="true" value="#{deepBean.searchResults}" var="searchResult">
                    <p:tab closable="true" id="tab#{deepBean.searchResults.indexOf(searchResult)}">
                        <f:facet name="title">
                            <p:outputPanel class="search-results-tab-grid">
                                <p:outputLabel value="#{searchResult.searchName}" 
                                               style="margin-right: 20px;"
                                               class="search-results-tab-name"/>
                                <p:outputPanel class="search-results-tab-num">
                                    <p:outputLabel value="#{searchResult.data.size()}" class="number-records" style="font-size: 1.5em; padding-right: 10px;"/>
                                    <p:outputLabel value=" Records"/>
                                </p:outputPanel>
                                <p:outputPanel class="search-results-tab-exports">
                                    <p:commandButton value="xls" process="@this">
                                        <f:setPropertyActionListener value="#{deepBean.searchResults.indexOf(searchResult)}" target="#{deepBean.searchResultToExport}"/>
                                        <p:dataExporter type="xls" target="#{deepBean.getExportDatatableId(searchResult)}" 
                                                        fileName="#{searchResult.searchName}-results" 
                                                        postProcessor="#{deepBean.preProcessDoc}"/>
                                    </p:commandButton> 
                                    <p:commandButton value="csv" process="@this">
                                        <p:dataExporter type="csv" target="#{deepBean.getExportDatatableId(searchResult)}" 
                                                        fileName="#{searchResult.searchName}-results" />
                                    </p:commandButton>
                                    <p:commandButton value="pdf" process="@this">
                                        <p:dataExporter type="pdf" target="#{deepBean.getExportDatatableId(searchResult)}" 
                                                        fileName="#{searchResult.searchName}-results" />
                                    </p:commandButton>
                                    <p:commandButton value="txt" process="@this">
                                        <p:dataExporter type="txt" target="#{deepBean.getExportDatatableId(searchResult)}" 
                                                        fileName="#{searchResult.searchName}-results" />
                                    </p:commandButton>
                                </p:outputPanel>
                            </p:outputPanel>
                        </f:facet>
                        <p:dataTable value="#{searchResult.data}" 
                                     rowIndexVar="rowIdx"
                                     emptyMessage="Run a Search to Populate this"
                                     scrollRows="10"
                                     var="resultsMap"
                                     scrollable="true"
                                     scrollHeight="400"
                                     style="overflow-x: auto"
                                     >
                            <f:facet name="header">
                                <h:outputText value="#{searchResult.searchName}-results"/>
                            </f:facet>
                            <p:columns value="#{searchResult.resultColumns}" 
                                       var="columnName"
                                       headerText="#{columnName}"
                                       width="auto"
                                       style="white-space: nowrap; text-align: center;"
                                       filterable="true"
                                       filterMatchMode="contains"
                                       sortable="true"
                                       >
                                <f:facet name="filter">

                                </f:facet>
                                <h:outputText value="#{resultsMap.get(columnName)}"/>
                            </p:columns>
                            <f:facet name="footer">
                                <p:outputLabel value="Returned #{searchResult.data.size()} results"/>
                            </f:facet>
                        </p:dataTable>
                    </p:tab>
                </p:accordionPanel>

Primefaces DataTableExcelExport doExport 函数

@Override
    public void doExport(FacesContext context, DataTable table, ExportConfiguration exportConfiguration, int index) throws IOException {
        String sheetName = getSheetName(context, table);
        if (sheetName == null) {
            sheetName = table.getId() + (index + 1);
        }

        sheetName = WorkbookUtil.createSafeSheetName(sheetName);
        if ("empty".equals(sheetName) || "null".equals(sheetName)) {
            sheetName = "Sheet (" + (index + 1) + ")";
        }

        ExcelOptions options = (ExcelOptions) exportConfiguration.getOptions();
        if (options == null) {
            stronglyTypedCells = true;
        }
        else {
            stronglyTypedCells = options.isStronglyTypedCells();
        }
        Sheet sheet = createSheet(wb, sheetName, options);
        applyOptions(wb, table, sheet, options);
        exportTable(context, table, sheet, exportConfiguration);

        if (options == null || options.isAutoSizeColumn()) {
            short colIndex = 0;
            for (UIColumn col : table.getColumns()) {
                if (col instanceof DynamicColumn) {
                    ((DynamicColumn) col).applyStatelessModel();
                }

                if (col.isRendered() && col.isExportable()) {
                    sheet.autoSizeColumn(colIndex);
                    colIndex++;
                }
            }
        }
    }

错误

SEVERE:   The workbook already contains a sheet named 'test-search-results'
java.lang.IllegalArgumentException: The workbook already contains a sheet named 'test-search-results'
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.createSheet(HSSFWorkbook.java:939)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.createSheet(HSSFWorkbook.java:124)
    at org.primefaces.component.datatable.export.DataTableExcelExporter.createSheet(DataTableExcelExporter.java:394)
    at org.primefaces.component.datatable.export.DataTableExcelExporter.doExport(DataTableExcelExporter.java:93)
    at org.primefaces.component.datatable.export.DataTableExporter$DataTableVisitCallBack.visit(DataTableExporter.java:365)
    at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:127)
    at org.primefaces.component.api.UIData.visitTree(UIData.java:691)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1468)
    at org.primefaces.component.api.UITabPanel.visitTree(UITabPanel.java:1006)
    at org.primefaces.component.datatable.export.DataTableExporter$DataTableVisitCallBack.lambda$invoke$0(DataTableExporter.java:384)
    at org.primefaces.util.ComponentUtils.invokeOnClosestIteratorParent(ComponentUtils.java:530)
    at org.primefaces.component.datatable.export.DataTableExporter$DataTableVisitCallBack.invoke(DataTableExporter.java:382)
    at org.primefaces.component.datatable.export.DataTableExporter.export(DataTableExporter.java:326)
    at org.primefaces.component.export.DataExporter.processAction(DataExporter.java:165)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:72)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:490)
    at javax.faces.component.UICommand.broadcast(UICommand.java:211)
    at org.primefaces.component.api.UITabPanel.broadcast(UITabPanel.java:1197)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:847)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1396)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:58)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:76)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:177)
    at javax.faces.webapp.FacesServlet.executeLifecyle(FacesServlet.java:707)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:451)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1637)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:331)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
    at org.glassfish.tyrus.servlet.TyrusServletFilter.doFilter(TyrusServletFilter.java:282)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:253)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:211)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:257)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:757)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:577)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:158)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:371)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:238)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:520)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:217)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:182)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:156)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:218)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:95)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:260)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:177)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:109)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:88)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:53)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:524)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:89)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:94)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:33)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:114)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:569)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:549)
    at java.base/java.lang.Thread.run(Thread.java:834)
jsf primefaces apache-poi
© www.soinside.com 2019 - 2024. All rights reserved.