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

如何用Apache POI彻底删除Excel(XLS)文件中的整行?

解决Apache POI删除XLS行且保留格式的问题

你遇到的问题很常见:removeRow()只会清空行内容,不会删除行的位置;而默认的shiftRows()会复制源行样式到目标行,导致格式混乱。下面是针对Apache POI 5.2.3的解决方案,能彻底删除行同时保留后续行的原有格式:

核心思路

  1. 先用removeRow()清空目标行的内容
  2. 调用shiftRows()将目标行之后的所有行上移1行,关键是通过参数控制不复制行样式和行高

修改后的代码

替换你原来的else分支代码:

else {
    // 假设你的sheet是HSSFSheet(对应XLS格式),如果是XLSX则换成XSSFSheet
    HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0);
    int rowIndexToDelete = 30; // 要删除的行索引(对应原第31行)
    
    // 清空目标行内容
    Row rowToDelete = sheet.getRow(rowIndexToDelete);
    if (rowToDelete != null) {
        sheet.removeRow(rowToDelete);
    }
    
    int lastRowNum = sheet.getLastRowNum();
    // 只有当目标行不是最后一行时,才需要上移后续行
    if (rowIndexToDelete < lastRowNum) {
        // shiftRows参数说明:
        // startRow: 要移动的起始行索引
        // endRow: 要移动的结束行索引
        // n: 移动行数(负数表示上移)
        // copyRowHeight: false表示不复制源行的行高到目标行
        // resetOriginalRowHeight: true表示重置被移动行的原行高
        sheet.shiftRows(rowIndexToDelete + 1, lastRowNum, -1, false, true);
    }
}

关键说明

  • shiftRows的最后两个参数是解决格式问题的核心:copyRowHeight=false避免后续行继承被移动行的行高,resetOriginalRowHeight=true确保原行的行高被重置,不会留下空白占位。
  • 如果你的文件是XLSX格式,只需将HSSFSheet替换为XSSFSheet即可,代码逻辑完全一致。
  • 若目标行包含合并单元格,需要额外遍历合并区域,调整合并区域的行索引(比如将合并区域的起始/结束行减1),否则合并单元格的位置会错乱。

内容的提问来源于stack exchange,提问作者Knuckles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:17:04