PrimeFaces 12版本DataExporter导出XLS文件无列标题问题
PrimeFaces 12 DataExporter导出XLS无列标题问题解决
升级PrimeFaces到12版本后,使用DataExporter导出XLS文件时会出现列标题缺失的情况,以下是针对性的解决办法:
问题原因
PrimeFaces 12对DataExporter的列标题解析逻辑做了调整,默认情况下,若列的<f:facet name="header">内嵌套了<h:outputText>这类组件,导出时无法自动提取组件内的文本内容,导致标题为空。
解决办法
方法1:改用column的headerText属性(推荐)
直接在<p:column>上通过headerText设置标题,替代facet写法,这种方式能被DataExporter正确识别:
<p:column width="50" style="text-align: center" sortBy="#{ordemServico.codigoOs}" filterMatchMode="contains" filterBy="#{ordemServico.codigoOs}" headerText="Número"> <h:outputText value="#{ordemServico.codigoOs}"/> </p:column>
方法2:检查ExcelOptions配置
若你使用了自定义的ExcelOptions,确认是否误设置了跳过标题的参数,确保setSkipHeader为false:
ExcelOptions excelOpt = new ExcelOptions(); excelOpt.setSkipHeader(false); // 禁用跳过标题,默认值为false,若之前自定义过需检查 // 其他配置项...
方法3:自定义Exporter处理复杂header facet
如果必须保留header facet内的复杂组件结构,可以自定义ExcelExporter,重写列标题提取逻辑:
public class CustomExcelExporter extends ExcelExporter { @Override protected String getColumnHeader(UIColumn column) { Facet headerFacet = column.getFacet("header"); // 处理HtmlOutputText组件 if (headerFacet instanceof HtmlOutputText) { return ((HtmlOutputText) headerFacet).getValue().toString(); } // 处理通用UIOutput组件 if (headerFacet instanceof UIOutput) { return ((UIOutput) headerFacet).getValue().toString(); } return super.getColumnHeader(column); } }
页面中使用自定义Exporter:
<p:dataExporter type="xls" target="datatableOrdemServico" fileName="Ordens de Servico" exporter="#{dataExporterCustomizedView.customExcelExporter}" options="#{dataExporterCustomizedView.excelOpt}"/>
额外注意
检查你的dataExporter标签的type属性,示例代码中写的是csv,若要导出XLS需改为xls或xlsx。
内容的提问来源于stack exchange,提问作者Suena Batista
相关产品推荐
相关产品推荐

