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); } } }
额外说明
- 合并区域的内容仅需设置在合并区域的起始单元格(
startCol对应的单元格),Excel会自动在整个合并区域内显示该内容,无需给区域内所有单元格赋值。 - 为合并区域内所有单元格应用样式是正确的操作(保证边框、对齐等样式统一),但必须避免重复创建行/单元格导致数据丢失。
- 你手动编写的代码版本未出现问题,是因为仅创建了一次
addressRow = sheet.createRow(1),没有触发行覆盖逻辑,建议后续所有行操作都统一使用"先获取再创建"的逻辑。
内容的提问来源于stack exchange,提问作者Amine FODIL-CHERIF
相关产品推荐
相关产品推荐

