2013-10-04 27 views
0

我試圖使用Primefaces的dataExporter組件將數據表中的值導出到Excel。使用Primefaces將可編輯數據表導出到Excel只顯示標題

我使用的是primefaces 3.5和jsf 2.2;

我的DataTable,並commandlink是以下幾點:

<p:dataTable id="tableTemp" binding="#{ledgerComplMB.tableTemp}" value="#{ledgerComplMB.listaTemp}" 
     var="q" emptyMessage="No Registry" paginator="true" rows="10" 
     rowsPerPageTemplate="10,50,200,500" 
     paginatorTemplate=" {CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
     scrollable="true" scrollWidth="100%" scrollRows="10" 
     filteredValue="#{ledgerComplMB.listaTempFilter}" 
     filterDelay="1500" resizableColumns="true" editable="true"> 

<f:facet name="header"> 
    <p:commandButton id="btGravar" icon="ui-icon-disk" 
        value="Write data" actionListener="#{ledgerComplMB.gravar}" 
        disabled="${empty ledgerComplMB.listaTemp}" style="width:200px;" /> 

    <p:commandButton id="btLimpar" value="Clean data" 
        actionListener="#{ledgerComplMB.limpar}" icon="ui-icon-trash" 
        disabled="${empty ledgerComplMB.listaTemp}" 
        style="width:200px;font-weight: bold;margin-left: 20px"/> 

    <br /> 
    <h:outputText 
     value="Total: #{fn:length(ledgerComplMB.listaTemp)}" 
     rendered="#{not empty ledgerComplMB.listaTemp}" /> 
</f:facet> 

<p:ajax event="rowEdit" 
     oncomplete="dlgConfirma.show()" update=":form:dialogConfirmacao" /> 

<p:column exportable="false" style="width:30px"> 
    <p:rowEditor /> 
     </p:column> 

<p:column filterBy="#{q.ledger.accountNumber}" filterMatchMode="exact" style="width:100px"> 
    <f:facet name="header">AccountNumber</f:facet> 
    <h:outputText value="#{q.ledger.accountNumber}" /> 
</p:column> 

<p:column filterBy="#{q.ledger.vendor}" filterMatchMode="exact" style="width:100px"> 
    <f:facet name="header">Vendor</f:facet>          
    <p:cellEditor> 
     <f:facet name="output"> 
      <h:outputText value="#{q.ledger.vendor}" /> 
     </f:facet> 
     <f:facet name="input"> 
      <p:inputText value="#{q.ledger.vendor}" /> 
     </f:facet> 
    </p:cellEditor> 
</p:column> 

</p:dataTable> 


<p:commandLink id="exp1" ajax="false"> 
     <p:graphicImage library="img" name="pdf.png" /> 
<p:dataExporter type="xlsx" target="tableTemp" fileName="#{ledgerComplMB.retornaDataExport}" /> 

當我只請求頭值顯示出口。

回答

0

我找到的唯一解決方案是讓您自己的類擴展出口商並覆蓋方法 protected String exportValue(FacesContext context, UIComponent component)

您應該只添加到現有的代碼下面幾行:

else if (component instanceof CellEditor) { 
return exportValue(context, ((CellEditor) component).getFacet("output")); 
} 

這是因爲CellEditor的是輸不出去的。我還沒有檢查它是否仍然是PrimeFaces 4.0中的問題。 這是由BalusC repported作爲一個問題issue4013在出口的情況下,以Excel文件這裏是我寫的,它workse(這是類,它擴展ExcelExporter):

@Override 
protected String exportValue(FacesContext context, UIComponent component) { 
     if (component instanceof HtmlCommandLink) { // support for PrimeFaces 
                // and standard 
                // HtmlCommandLink 
      HtmlCommandLink link = (HtmlCommandLink) component; 
      Object value = link.getValue(); 

      if (value != null) { 
       return String.valueOf(value); 
      } else { 
       // export first value holder 
       for (UIComponent child : link.getChildren()) { 
        //if (child instanceof ValueHolder) { 
         return exportValue(context, child); 
        //} 
       } 

       return ""; 
      } 
     } else if (component instanceof CellEditor) { // Handle in-cell editable datatables 
      return exportValue(context, 
        ((CellEditor) component).getFacet("output")); 
     } else if (component instanceof ValueHolder) { 

      if (component instanceof EditableValueHolder) { 
       Object submittedValue = ((EditableValueHolder) component) 
         .getSubmittedValue(); 
       if (submittedValue != null) { 
        return submittedValue.toString(); 
       } 
      } 

      ValueHolder valueHolder = (ValueHolder) component; 
      Object value = valueHolder.getValue(); 
      if (value == null) 
       return ""; 

      // first ask the converter 
      if (valueHolder.getConverter() != null) { 
       return valueHolder.getConverter().getAsString(context, 
         component, value); 
      } 
      // Try to guess 
      else { 
       ValueExpression expr = component.getValueExpression("value"); 
       if (expr != null) { 
        Class<?> valueType = expr.getType(context.getELContext()); 
        if (valueType != null) { 
         Converter converterForType = context.getApplication() 
           .createConverter(valueType); 

         if (converterForType != null) 
          return converterForType.getAsString(context, 
            component, value); 
        } 
       } 
      } 

      // No converter found just return the value as string 
      return value.toString(); 
     } else { 
      // This would get the plain texts on UIInstructions when using 
      // Facelets 
      String value = component.toString(); 

      if (value != null) 
       return value.trim(); 
      else 
       return ""; 
     } 

} 
+0

我試過這個方法之前,但不成功的,因爲該方法中的dataTable只有一行。但是,在xhtml中,它有很多行。 – Rodolfo

+0

哪種方法只有一行? –

+0

該方法是org.primefaces.component.export包中的ExcelExporter類的exportAll(FacesContext上下文,DataTable表,Sheet工作表)。 – Rodolfo

相關問題