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

Apache POI相邻合并区域样式问题:首个区域内容消失

Apache POI相邻合并区域导致内容消失的解决方案

你遇到的问题核心是重复创建同一行导致原有单元格数据被覆盖。在你的createMergedRegion方法中,每次调用都会执行Row row = sheet.createRow(rowNumber)——如果该行已经存在(比如第一次调用处理行1创建了行,第二次调用处理同一行时),createRow会直接覆盖原有的行对象,导致之前在该行创建的单元格(比如"PICKUP ADDRESS"所在的单元格)被清空。

修复方案

修改createMergedRegion方法,先尝试获取已存在的行,仅当行不存在时才创建新行;单元格同理,避免重复创建覆盖数据:

private void createMergedRegion(Sheet sheet, int rowNumber, int startCol, int endCol, String cellValue, CellStyle style) {
    sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, startCol, endCol));
    // 先获取已有行,不存在再创建
    Row row = sheet.getRow(rowNumber);
    if (row == null) {
        row = sheet.createRow(rowNumber);
    }
    for (int i = startCol; i <= endCol; i++) {
        // 先获取已有单元格,不存在再创建
        Cell cell = row.getCell(i);
        if (cell == null) {
            cell = row.createCell(i);
        }
        cell.setCellStyle(style);
        if (i == startCol) {
            cell.setCellValue(cellValue);
        }
    }
}

额外说明

  1. 合并区域的内容仅需设置在合并区域的起始单元格(startCol对应的单元格),Excel会自动在整个合并区域内显示该内容,无需给区域内所有单元格赋值。
  2. 为合并区域内所有单元格应用样式是正确的操作(保证边框、对齐等样式统一),但必须避免重复创建行/单元格导致数据丢失。
  3. 你手动编写的代码版本未出现问题,是因为仅创建了一次addressRow = sheet.createRow(1),没有触发行覆盖逻辑,建议后续所有行操作都统一使用"先获取再创建"的逻辑。

内容的提问来源于stack exchange,提问作者Amine FODIL-CHERIF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:56:29