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
相关产品推荐
相关产品推荐

