我的知识记录

Python Excel删除行和列:delete_rows与delete_cols用法

用openpyxl的delete_rows、delete_cols按位置删除指定行列,或按条件批量删除符合条件的行,附完整代码。

场景痛点

表里混着测试数据、空行、不要的列,手动选中删容易漏,删错位置又麻烦。用 openpyxl 的 delete_rowsdelete_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_rowws.max_column 会自动更新,不需要手动维护。

运行结果

打开文件,第 5 行被删除;所有状态为「测试」的行被清掉;「备注」列被整列删除;剩余数据自动上移左移,不留空洞。

注意事项

  • 删除操作不可逆,正式跑之前先备份文件。
  • 从下往上删行(reverse=True)是避免行号错乱的标准做法,别写成从小到大。
  • 删列后,后面列号都会变,多个删列操作也要从右往左做,否则列号会指错。
  • 合并单元格、图表、数据透视表引用被删行列后可能出错,复杂表删完要打开看一眼。
  • 删大量行(几百上千行)时 openpyxl 性能一般,更建议用 pandas 读成 DataFrame 过滤后重写。

Python Excel删除行和列:delete_rows与delete_cols用法

标签:

更新时间:2026-09-15 09:09:21

上一篇:Python Excel导出CSV格式 UTF-8带BOM

下一篇:Python Excel删除空行空列:清理脏数据一键搞定