【问题标题】:p:dataExporter not exporting headers of p:columnGroupp:dataExporter 不导出 p:columnGroup 的标题
【发布时间】:2018-01-02 12:31:30
【问题描述】:

我在标签中使用 p:columngroup。标题和值显示在网页中,但不会导出到 Excel。值已正确导出到 Excel,但导出后标题行为空白。

以下是 XHTML 代码:

<ui:composition template="../templates/pwpMenuLayoutTemplate.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:jc="http://jcoe.ford.com/jsfcore"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <f:metadata>
        <jc:preRenderView bean="#{profileCreationBean}" pageTitle="" />
    </f:metadata>
    <ui:define name="windowTitle">#{bundle['label.menu.attendance.summary.clockinout']}</ui:define>
    <h:head>
    <h:outputStylesheet library="css" name="styles.app.css"  />     
    </h:head>
    <ui:define name="content">
        <h:form id="asmReportForm"  prependId="false">
            <h1><h:outputFormat style="font-family: AntennaCond" value="#{bundle['label.menu.attendance.summary.clockinout']}">
            </h:outputFormat></h1>
            <p:messages id="messages" globalOnly="true" />
                      <h:commandLink
                            value="#{bundle['lable.dataExporter.exportExcel']}"
                            styleClass="excel-link" width="50" height="50">
                            <p:dataExporter target="clockinoutid" type="xls"
                                fileName="ClockinOutReport">
                            </p:dataExporter>
                      </h:commandLink>          

                <p:dataTable var="emp" id="clockinoutid" value="#{clockinOutReportBean.listEmpBO1}" >                   

                        <p:columnGroup type="header">
                        <p:row>
                        <p:column style="width:50px" rowspan="2">
                              <f:facet name="header">
                                 <h:outputText value="GPID" />
                            </f:facet>
                        </p:column>
                        <p:column style="width:100px" rowspan="2">
                         <f:facet name="header">
                                 <h:outputText value="Name" />
                            </f:facet>
                        </p:column>
                        <p:column style="width:50px" rowspan="2" >
                         <f:facet name="header">
                                 <h:outputText value="CDSID" />
                            </f:facet>
                        </p:column>
                        <p:column style="width:50px" rowspan="2" >
                        <f:facet name="header">
                                 <h:outputText value="Designation" />
                            </f:facet>
                         </p:column>
                        <c:forEach items="#{clockinOutReportBean.dates}" var="id">
                            <p:column style="width:100px" colspan="2" >
                            <f:facet name="header">
                                 <h:outputText value="#{id}" />
                            </f:facet>
                            </p:column>
                        </c:forEach>
                        <p:column style="width:50px" rowspan="2">
                        <f:facet name="header">
                                 <h:outputText value="Team Leader" />
                            </f:facet>
                        </p:column>
                        <p:column style="width:50px" rowspan="2">
                        <f:facet name="header">
                                 <h:outputText value="Process Coach" />
                            </f:facet>
                        </p:column>
                        <p:column style="width:50px" rowspan="2">
                            <f:facet name="header">
                                 <h:outputText value="Team Manager" />
                            </f:facet>
                         </p:column>
                        <p:column style="width:50px" rowspan="2" >
                        <f:facet name="header">
                                 <h:outputText value="Area Manager" />
                            </f:facet>
                        </p:column>
                        <p:column style="width:150px" colspan = "#{clockinOutReportBean.leavecount}">
                        <f:facet name="header">
                                 <h:outputText value="Leaves" />
                            </f:facet>
                        </p:column>
                        </p:row>

                        <p:row>
                            <c:forEach items="#{clockinOutReportBean.dates}" var="id">
                                <p:column style="width:25px" rowspan="1" >
                                <f:facet name="header">
                                 <h:outputText value="In" />
                            </f:facet>
                            </p:column>
                                <p:column style="width:25px" rowspan="1" >
                                <f:facet name="header">
                                 <h:outputText value="Out" />
                            </f:facet>
                            </p:column>
                            </c:forEach>
                            <c:forEach items="#{clockinOutReportBean.leaveNames}" var="id">
                                <p:column style="width:25px" rowspan="1" >
                                <f:facet name="header">
                                 <h:outputText value="#{id}" />
                            </f:facet>
                            </p:column>
                            </c:forEach>
                         </p:row>

                        </p:columnGroup>


                        <p:column>
                              <h:outputText value="#{emp.gpid}" />
                        </p:column>

                        <p:column>
                                 <h:outputText value="#{emp.name}" />
                        </p:column>

                        <p:column>
                                 <h:outputText value="#{emp.cdsid}" />
                         </p:column>

                        <p:column>
                                 <h:outputText value="#{emp.empPositionTitle}" />
                         </p:column> 

                         <c:forEach items="#{clockinOutReportBean.dates}" var="id">
                            <p:column>
                                <h:outputText value="#{emp.swipelist[id].swipeinTime}" />
                            </p:column>
                            <p:column>
                                <h:outputText value="#{emp.swipelist[id].swipeoutTime}" />
                            </p:column>
                        </c:forEach>

                         <p:column>
                                 <h:outputText value="#{emp.teamLeader}" />
                         </p:column> 

                         <p:column>
                                 <h:outputText value="#{emp.processCoach}" />
                         </p:column> 

                         <p:column>
                                 <h:outputText value="#{emp.teamManager}" />
                         </p:column> 

                         <p:column>
                                 <h:outputText value="#{emp.areaManager}" />
                         </p:column> 

                        <p:columns var="id" value="#{clockinOutReportBean.leaveNames}">
                                <h:outputText value="#{emp.leaveList[id].value}" />
                        </p:columns>

                    </p:dataTable>      


        </h:form>
    </ui:define>
</ui:composition>

所有数据都正确导出。但是在excel中看不到标题。有人可以帮忙吗?

【问题讨论】:

标签: jsf primefaces


【解决方案1】:

一种解决方法是添加带有style="display: none;" 的列以避免在屏幕上重复,但对于导出,虽然未显示columnGroup,但带有display: none 的列是。

【讨论】:

    【解决方案2】:

    您可以通过向数据区域中的列添加另一个 headerText 属性来解决此问题。您的标题部分和数据部分将具有相同的属性。

    看起来像这样:

    <p:dataTable .. >
      <p:columnGroup type="header"> 
         <p:row>
         <p:column style="width:50px" rowspan="2">
             <f:facet name="header">
                  <h:outputText value="GPID" />
              </f:facet>
          </p:column>
        ......
      </p:columnGroup>
      <!-- Data area -->
      <p:column headerText="GPID">
        <h:outputText value="#{emp.gpid}" />
      </p:column>
    

    【讨论】:

      【解决方案3】:

      如果您知道Apache POI 用于工作簿的自定义布局,默认情况下不提供p:dataExporter 可以使用postProcessor 属性。

      <p:dataExporter postProcessor="#{backendBean.postProcessXLS}" type="xls" target="tableId" fileName="x"  />
      

      然后按以下方式将此postProcessXLS 方法添加到后端bean。

       public void postProcessXLS(Object document) {
          HSSFWorkbook wb = (HSSFWorkbook) document;
          HSSFSheet sheet = wb.getSheetAt(0);
          // TO-DO: change layout of the sheet or add or remove any sheet to workbook
       }
      

      【讨论】:

      • 不幸的是,如果我没记错的话,这不是上述问题的解决方案,因为这是应该(=只能)在处理期间完成的事情,而不是之前或之后通过预处理或后处理
      • 是的。这是一个替代方案。默认情况下,dataexporter 不为 xls 提供自定义模板或列。
      • 但是,如果它们一开始还没有,如何在后期处理中将页眉添加到工作表中呢?我知道您可以在之后更改各种外观和感觉,但是您是否可以访问原始数据表以从那里添加缺少的标题?您在代码中的“注释”没有提供任何提示,而该部分是最关键的部分
      • 我删除了工作表并重新创建了它。
      • 如此有效地创建了自己的导出器?您再次完全“解析”了数据表并添加了所有内容,包括列组的标题?为什么不简单地覆盖(扩展)基本导出器。在我看来更容易。如果您认为您的解决方案更简单,请展示您为获取列组标题所做的工作,如果更简单,您将获得我的支持(和奖励)
      猜你喜欢
      • 1970-01-01
      • 2013-05-19
      • 2013-12-16
      • 1970-01-01
      • 2015-11-21
      • 2016-01-04
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      相关资源
      最近更新 更多