You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache POI设置单元格格式时点号自动变为逗号的问题排查

Apache POI设置自定义数字格式时分隔符被替换的原因及解决方法

问题原因

Apache POI的DataFormat.getFormat(String)方法会自动根据JVM默认的区域设置(Locale)对格式字符串进行本地化调整。它将格式串中的逗号(,)视为千分分隔符的通用占位符,点号(.)视为小数点的通用占位符,然后替换为当前Locale对应的实际符号。

你手动在Excel中设置#.##0时,Excel是按字面解析自定义格式;但POI会把你传入的#.##0中的点号识别为小数点占位符,替换成当前Locale的小数点符号(比如逗号),最终生成#,##0格式,和预期不符。

解决方案

要绕过POI的自动本地化替换,直接使用自定义格式的字面解析,有两种可行方法:

方法1:使用DataFormat.putFormat()直接注册格式

通过putFormat()方法直接注册你需要的格式字符串,避免getFormat()的本地化处理:

CellStyle cs = workbook.createCellStyle();
DataFormat df = workbook.createDataFormat();
// 直接注册自定义格式,返回格式索引
short formatIndex = df.putFormat("#.##0");
cs.setDataFormat(formatIndex);
celula.setCellStyle(cs);

方法2:针对XSSF工作簿使用非本地化格式获取(仅适用于XLSX)

如果你使用的是XSSFWorkbook,可以强制关闭本地化解析:

XSSFDataFormat xssfDf = (XSSFDataFormat) workbook.createDataFormat();
// false参数表示不进行本地化转换
short formatIndex = xssfDf.getFormat("#.##0", false);
XSSFCellStyle cs = (XSSFCellStyle) workbook.createCellStyle();
cs.setDataFormat(formatIndex);
celula.setCellStyle(cs);

注意:不推荐通过修改JVM全局Locale来解决,这会影响整个应用的区域行为。

内容的提问来源于stack exchange,提问作者Gustavo Cesário

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:57:33