如何用Apache POI彻底删除Excel(XLS)文件中的整行?
解决Apache POI删除XLS行且保留格式的问题
你遇到的问题很常见:removeRow()只会清空行内容,不会删除行的位置;而默认的shiftRows()会复制源行样式到目标行,导致格式混乱。下面是针对Apache POI 5.2.3的解决方案,能彻底删除行同时保留后续行的原有格式:
核心思路
- 先用
removeRow()清空目标行的内容 - 调用
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
相关产品推荐
相关产品推荐

