Primefaces 3.5如何使用dataExporter导出不可见的dataTable行

时间:2014-01-10 15:16:16

标签: java jsf primefaces

我使用的是primefaces 3.5,我有一个p:dataTable,包含一些行和数据,我想将这些数据导出到xls文件中。

我使用了代码:

<p:commandButton id="exportBtn" icon="ui-icon-extlink" styleClass="statisticsMenuButton" ajax="false" title="#{msg.general_export_as_xls}">
    <p:dataExporter type="xls" target="cc-eventListTable-eventList" fileName="statistics"/>
</p:commandButton>

这很好用!

我的问题是,我希望在导出的文件和浏览器dataTable中有不同的单元格文本。

例如在导出的xls文件中,我需要在浏览器数据表中进行其他日期格式化。否则,浏览器单元格中的文本太长了!

我尝试仅为导出的表添加一个render =“false”和exportable =“true”的附加列。但不幸的是它不起作用!

有人知道该怎么做吗?

2 个答案:

答案 0 :(得分:5)

将呈现的标记设置为false,此时它不起作用(它被报告为bug:https://github.com/primefaces-extensions/primefaces-extensions.github.com/issues/209),但您可以使用这样的css来创建它:

 <p:column headerText="#{msg['book.coverType']}" style="display:none;">
         <h:outputText value="#{book.coverType}"/>
</p:column>

另一种解决方案是在托管bean中添加一个post process方法,然后从那里添加列。

public void postProcessXLS(Object document){         log.debug(“post processing Excel”);

    HSSFWorkbook workbook = (HSSFWorkbook) document;

    addCoverType(workbook,book);

}

您可以编写如下方法:

public void addCoverType(HSSFWorkbook workbook, List<Book> books) {

    HSSFSheet sheet = workbook.getSheetAt(0);
    HSSFCell cell = null;

 //row 0 is the header (not automatically added by primefaces)
 //add a fifth cell to each row
    for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
        sheet.getRow(i).createCell(4);
        cell = sheet.getRow(i).getCell(4);
        cell.setCellValue(book.get(i - 1).getCoverType());
    }
    log.debug("cover type added");
}

如果您制作可排序列,订单也会自动受到尊重:-D

答案 1 :(得分:0)

我找到了解决问题的解决方法......

要使我的dataTabe中的单元格文本对于浏览器不可见,我推出了css syle“visibility:hidden;”某些h:outputText。

<p:column styleClass="eventFrom" width="125" sortBy="#{event.dateFrom}">
     <f:facet name="header">
         <h:outputText value="#{msg.general_date}"></h:outputText>
     </f:facet>

     <h:outputText value="#{event.dateFrom}" id="dateFrom">
         <f:convertDateTime type="both" timeZone="#{userManagement.userOptions.timeZone}" pattern="#{msg.time_pattern_ymdhmsM_short}" locale="#{msg.local}" />
     </h:outputText>

     <h:outputText value=" - " id="between" style="visibility:hidden;"></h:outputText>

     <h:outputText value="#{event.dateTo}" id="dateTo" style="visibility:hidden;">
          <f:convertDateTime type="both" timeZone="#{userManagement.userOptions.timeZone}"pattern="#{msg.time_pattern_ymdhmsM_short}" locale="#{msg.local}" />
     </h:outputText>

</p:column>

最好只为dataExporter创建列,但我没有找到解决方案来做到这一点。