【问题标题】:Export editable dataTable to Excel with Primefaces shows only header使用 Primefaces 将可编辑的数据表导出到 Excel 仅显示标题
【发布时间】:2013-10-11 17:20:29
【问题描述】:

我正在尝试使用 Primefaces 的 dataExporter 组件将值从 dataTable 导出到 Excel。

我正在使用 primefaces 3.5 和 jsf 2.2;

我的数据表和命令链接如下:

<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}"  />  

当我请求导出时,只显示标头值。

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

    我找到的唯一解决方案是创建自己的扩展 Exporter 的类并覆盖方法 protected String exportValue(FacesContext context, UIComponent component).

    您应该只在现有代码中添加以下几行:

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

    这是因为 CellEditor 不可导出。我还没有检查它是否仍然是 PrimeFaces 4.0 中的问题。 这被BalusC 报告为问题issue4013 如果导出到 Excel 文件,这是我写的,它可以工作(这是在扩展 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 "";
            }
    
    }
    

    【讨论】:

    • 我之前尝试过这种方法但不成功,因为这种方法中的dataTable只有一行。但是,在 xhtml 中,它有很多行。
    • 哪种方法只有一行?
    • 方法是org.primefaces.component.export包中ExcelExporter类的exportAll(FacesContext context, DataTable table, Sheet sheet)。
    • 我已经用适合我的 excel 报告器扩展更新了我的答案。
    • 如何将 dataTable 传递给方法 exportAll?
    猜你喜欢
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2012-09-16
    相关资源
    最近更新 更多