Apache POI读取Excel含逗号单元格时保留逗号的技术问询
解决Apache POI读取Excel时
1,2被转为1.2的问题 这问题我之前处理过,核心是Excel的自动格式识别把你输入的1,2当成了欧洲格式的十进制数字(逗号作为小数点),而不是文本内容。结合你的场景(A2是正常小数、A3是多值列表),给你一套可行的解决方案:
先明确问题根源
Excel会根据系统区域设置自动识别单元格内容类型:如果你的系统默认用逗号做小数点分隔符,输入1,2时Excel会自动把它标记为数字格式,存储为1.2的数值,POI读取时自然会解析成数字,导致原逗号丢失。而A3的多值列表(比如a,b,c)因为包含非数字字符,会被识别为文本,所以读取正常;A2的带小数点的数则符合数字格式,读取也没问题。
解决方案分步走
1. 先从Excel端确保单元格是文本格式
这是最根本的一步,避免Excel自动转换内容:
- 单个单元格处理:选中A1单元格,右键→「设置单元格格式」→选择「文本」,然后重新输入
1,2 - 批量处理:如果有大量类似单元格,可以用Excel的「分列」功能,选择「文本」格式完成转换;或者用公式
=TEXT(A1,"@")生成文本格式的内容,再复制为值。
2. 在POI读取时强制读取原始文本内容
即使Excel端设置了文本格式,有时候POI还是会按数字解析,这时候需要针对性处理:
修改你的读取代码,增加对数字类型单元格的特殊判断,优先读取原始内容:
try { FileInputStream fileInStream = new FileInputStream(xlsxFile); XSSFWorkbook workBook = new XSSFWorkbook(fileInStream); XSSFSheet sheet = workBook.getSheetAt(sheetIdx); FormulaEvaluator evaluator = workBook.getCreationHelper().createFormulaEvaluator(); DataFormatter dataFormatter = new DataFormatter(); for (Row row : sheet) { String[] rowData = new String[100]; for (int i = 0; i < 100; i++) { Cell cell = row.getCell(i); if (cell == null) { rowData[i] = ""; continue; } String cellValue; if (cell.getCellType() == CellType.FORMULA) { cellValue = dataFormatter.formatCellValue(cell, evaluator); } else { // 特殊处理:判断是否是数字类型但实际应为文本的情况 if (cell.getCellType() == CellType.NUMERIC) { // 获取单元格的格式字符串,判断是否是文本格式(@是文本格式的标识) CellStyle cellStyle = cell.getCellStyle(); String formatStr = cellStyle.getDataFormatString(); if ("@".equals(formatStr)) { // 强制读取文本内容 cellValue = cell.getStringCellValue(); } else { // 正常格式化数字(比如A2的带小数点的数) cellValue = dataFormatter.formatCellValue(cell); } } else { cellValue = dataFormatter.formatCellValue(cell); } } rowData[i] = cellValue; } data.add(rowData); } } catch (IOException e) { e.printStackTrace(); }
如果上面的格式判断还不够,你可以直接用getRawValue()方法获取单元格存储的原始字符串,跳过Excel的格式转换:
// 在数字类型判断里替换成这个 if (cell.getCellType() == CellType.NUMERIC) { // getRawValue()返回单元格的原始存储内容 cellValue = cell.getRawValue(); // 注意:如果是真正的小数(比如A2的123.45),getRawValue()会返回"123.45",符合需求;如果是文本型的1,2,会返回"1,2" }
3. 调整Excel的区域设置(避免自动转换)
如果你的系统区域默认用逗号做小数点,Excel会自动把1,2当成数字,可以临时修改Excel的设置:
打开Excel → 文件 → 选项 → 高级 → 找到「编辑自定义列表」区域 → 取消勾选「使用系统分隔符」→ 把「十进制分隔符」设为
.,「千位分隔符」设为,→ 确定
这样Excel就不会把1,2当成数字,而是直接识别为文本。
总结
优先确保Excel单元格设置为文本格式,再配合POI的针对性读取逻辑,就能完美保留A1单元格的逗号,同时不影响A2、A3的正常读取。
内容的提问来源于stack exchange,提问作者DWK




