使用Apache POI的addMergedRegion时出现“不可读内容”错误求助
Apache POI addMergedRegion 导致Excel不可读内容的原因及解决办法
问题原因
你的代码存在两个核心问题,触发了Excel的格式校验错误:
- 重复添加合并区域:循环中每一次迭代都调用
addMergedRegion,哪怕当前仍处于连续相同值的区间内,这会导致同一个合并范围被多次重复添加,Excel会识别为无效定义。 - 创建无效合并范围:初始状态下
a=i、b=i,此时a+1 = i+1,b=i,生成的CellRangeAddress是起始行大于结束行的非法范围(比如(i+1, i, 1, 1)),Excel不允许这种合并定义,直接触发格式错误。
Excel在恢复时会自动清理这些无效的合并项,所以最终你看到的合并效果符合预期,但修复提示说明原始文件存在格式瑕疵。
解决办法
调整逻辑,仅在遇到不同值或循环结束时执行合并操作,同时确保合并范围的起始行≤结束行:
修正后的代码示例
int startRow = primrowCountSplice; // 遍历行,从起始行到最后一行 for (int i = primrowCountSplice; i < primrowCount; i++) { // 如果是最后一行,或者当前行与下一行的值不同 if (i == primrowCount - 1 || !spreadsheet.getRow(i).getCell(1).getStringCellValue() .equals(spreadsheet.getRow(i+1).getCell(1).getStringCellValue())) { // 仅当起始行 < 当前行时才合并(避免单行合并的无效操作) if (startRow < i) { spreadsheet.addMergedRegion(new CellRangeAddress(startRow, i, 1, 1)); } // 更新起始行为下一行,准备下一组连续相同值的行 startRow = i + 1; } }
关键优化点
- 仅在需要分割连续区间时才执行合并,避免重复添加
- 跳过单行合并的无效操作(单行无需合并)
- 处理循环结束时的最后一组连续行
- 确保合并范围的起始行始终≤结束行,符合Excel的格式要求
内容的提问来源于stack exchange,提问作者prathibha
相关产品推荐
相关产品推荐

