You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动