PrimeFaces 12 DataExporter导出XLS小数格式异常问题求助
PrimeFaces 12 DataExporter导出XLS小数格式错误解决方案
升级PrimeFaces 12后,使用DataExporter导出XLS文件时出现小数格式异常,例如50.00被显示为5,000。本地Win10环境问题已解决,但服务器端仍存在该问题,可尝试以下方案:
问题根源
该异常本质是千位分隔符与小数点符号混淆:pt-BR locale下,小数点应为逗号(,),千位分隔符为点(.),但服务器端可能因Locale配置缺失、DecimalFormat初始化未指定Locale,导致格式解析逻辑错误。
具体修复步骤
显式指定DecimalFormat的Locale符号
避免依赖服务器默认Locale,手动配置pt-BR的格式符号,确保格式规则统一:@PostConstruct public void init() { excelOpt = new ExcelOptions(); // 保留原有样式配置 excelOpt.setFacetBgColor("#F88017"); excelOpt.setFacetFontSize("10"); excelOpt.setFacetFontColor("#0000ff"); excelOpt.setFacetFontStyle("BOLD"); excelOpt.setCellFontColor("#00ff00"); excelOpt.setCellFontSize("8"); excelOpt.setStronglyTypedCells(true); // 修正数字格式:显式定义pt-BR的分隔符 DecimalFormatSymbols brSymbols = new DecimalFormatSymbols(new Locale("pt", "BR")); brSymbols.setDecimalSeparator(','); brSymbols.setGroupingSeparator('.'); DecimalFormat numberFormat = new DecimalFormat("#,##0.00", brSymbols); excelOpt.setNumberFormat(numberFormat); // 货币格式保持显式Locale初始化 excelOpt.setCurrencyFormat((DecimalFormat) DecimalFormat.getCurrencyInstance(new Locale("pt", "BR"))); }确保服务器端Locale支持
- 若服务器为Linux系统,需安装pt-BR语言包(以Ubuntu为例):
sudo apt-get install language-pack-pt sudo locale-gen pt_BR.UTF-8 - 可在JVM启动参数中强制指定默认Locale,避免服务器全局Locale影响:
-Duser.language=pt -Duser.region=BR
- 若服务器为Linux系统,需安装pt-BR语言包(以Ubuntu为例):
验证数据类型一致性
确认totalGeral字段为Number类型(如BigDecimal、Double),而非字符串类型。setStronglyTypedCells(true)会基于数据类型导出,若字段为字符串则会直接按文本处理,导致格式配置失效。移除页面端冗余转换(可选)
页面中<f:convertNumber>仅负责前端显示,不影响导出逻辑,若已通过ExcelOptions统一配置导出格式,可考虑移除该转换,避免潜在冲突:<!-- 移除<f:convertNumber>,导出格式由ExcelOptions控制 --> <h:outputText value="#{ordemServico.totalGeral}" />
内容的提问来源于stack exchange,提问作者Suena Batista
相关产品推荐
相关产品推荐

