Python Excel删除行和列:delete_rows与delete_cols用法
用openpyxl的delete_rows、delete_cols按位置删除指定行列,或按条件批量删除符合条件的行,附完整代码。
场景痛点
表里混着测试数据、空行、不要的列,手动选中删容易漏,删错位置又麻烦。用 openpyxl 的 delete_rows、delete_cols,按行号列号删,或者按条件扫一遍把不要的行挑出来批量删,一次到位。
用到的库
pip install openpyxl
完整代码
from openpyxl import load_workbook
def demo_delete(file_path: str) -> None:
wb = load_workbook(file_path)
ws = wb.active
# 1) 直接删第 5 行
ws.delete_rows(idx=5, amount=1)
# 2) 删 B 列
# ws.delete_cols(idx=2, amount=1)
# 3) 按条件批量删行:状态为"测试"的行删掉
# 从下往上删,避免行号变化导致漏删
header = [c.value for c in ws[1]]
status_col = header.index("状态") + 1 if "状态" in header else None
if status_col:
to_delete = []
for row in range(2, ws.max_row + 1):
val = ws.cell(row=row, column=status_col).value
if val == "测试":
to_delete.append(row)
# 从大到小删,行号才不会错乱
for row_idx in sorted(to_delete, reverse=True):
ws.delete_rows(idx=row_idx, amount=1)
print(f"已删除 {len(to_delete)} 行测试数据")
# 4) 删掉"备注"列
if "备注" in header:
remark_col = header.index("备注") + 1
ws.delete_cols(idx=remark_col, amount=1)
wb.save(file_path)
print("删除完成")
if __name__ == "__main__":
demo_delete(r"D:\reports\销售明细.xlsx")
代码讲解
ws.delete_rows(idx=5, amount=1)删除第 5 行,下面的行自动上移。ws.delete_cols(idx=2, amount=1)删除第 2 列(B 列),右边的列自动左移。- 关键技巧:按条件批量删行时,先把要删的行号收集到
to_delete,再从大到小删。如果从小到大删,删掉第 3 行后,原来的第 4 行变成第 3 行,下次循环按行号走就会漏删。 - 删列同理:先按列名找到列号再删,比写死 B 列抗结构变化。
- 删完后
ws.max_row、ws.max_column会自动更新,不需要手动维护。
运行结果
打开文件,第 5 行被删除;所有状态为「测试」的行被清掉;「备注」列被整列删除;剩余数据自动上移左移,不留空洞。
注意事项
- 删除操作不可逆,正式跑之前先备份文件。
- 从下往上删行(
reverse=True)是避免行号错乱的标准做法,别写成从小到大。 - 删列后,后面列号都会变,多个删列操作也要从右往左做,否则列号会指错。
- 合并单元格、图表、数据透视表引用被删行列后可能出错,复杂表删完要打开看一眼。
- 删大量行(几百上千行)时 openpyxl 性能一般,更建议用 pandas 读成 DataFrame 过滤后重写。

更新时间:2026-09-15 09:09:21
上一篇:Python Excel导出CSV格式 UTF-8带BOM