Python 自动化 Excel 删除行 / 列 / 工作表详细教程
在处理Excel文件时,删除不需要的行、列或者工作表是非常常见的操作。无论是清理无效数据、删除空行空列,还是裁剪多余的工作表,Python都能轻松实现。本文将详细介绍各种删除场景的实现方法,包含完整代码示例和注意事项。
一、环境准备
1.1 安装依赖库
pip install openpyxl pandas
1.2 重要注意事项
⚠️ 删除操作不可逆,一定要先备份文件!
1. 删除前务必复制一份原文件,避免误删重要数据
2. 不要直接在原文件上操作,建议在副本上删除,确认无误后再替换原文件
3. 删除行时要注意顺序,应该从下往上删,避免删除行后索引错乱
4. 包含公式、引用的表格删除行/列后可能导致公式错误,删除后要检查验证
二、删除工作表
2.1 删除指定名称的工作表
from openpyxl import load_workbook
wb = load_workbook("多工作表文件.xlsx")
# 查看所有工作表名称
print("当前工作表:", wb.sheetnames)
# 删除指定名称的工作表
if "临时表" in wb.sheetnames:
del wb["临时表"]
print("✅ 工作表'临时表'已删除")
else:
print("⚠️ 工作表'临时表'不存在")
# 保存修改
wb.save("多工作表文件_删除后.xlsx")
2.2 删除多个工作表
from openpyxl import load_workbook
wb = load_workbook("多工作表文件.xlsx")
# 要删除的工作表列表
sheets_to_delete = ["临时表1", "临时表2", "草稿表"]
for sheet_name in sheets_to_delete:
if sheet_name in wb.sheetnames:
del wb[sheet_name]
print(f"✅ 已删除工作表:{sheet_name}")
wb.save("多工作表文件_删除多个.xlsx")
2.3 按索引删除工作表
from openpyxl import load_workbook
wb = load_workbook("多工作表文件.xlsx")
# 删除第一个工作表(索引从0开始)
if len(wb.worksheets) > 0:
first_sheet = wb.worksheets[0]
del wb[first_sheet.title]
print(f"✅ 已删除第一个工作表:{first_sheet.title}")
# 删除最后一个工作表
if len(wb.worksheets) > 0:
last_sheet = wb.worksheets[-1]
del wb[last_sheet.title]
print(f"✅ 已删除最后一个工作表:{last_sheet.title}")
wb.save("多工作表文件_按索引删除.xlsx")
2.4 删除所有工作表,保留指定工作表
from openpyxl import load_workbook
wb = load_workbook("多工作表文件.xlsx")
# 要保留的工作表
keep_sheets = ["销售数据", "员工信息"]
# 收集要删除的工作表(遍历的时候不能直接删,会导致索引错乱)
sheets_to_delete = [sheet for sheet in wb.sheetnames if sheet not in keep_sheets]
for sheet_name in sheets_to_delete:
del wb[sheet_name]
print(f"✅ 已删除工作表:{sheet_name}")
wb.save("多工作表文件_保留指定.xlsx")
2.5 删除空工作表
from openpyxl import load_workbook
wb = load_workbook("多工作表文件.xlsx")
sheets_to_delete = []
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
# 判断是否为空工作表:max_row=1且max_column=1且A1单元格为空
if ws.max_row == 1 and ws.max_column == 1 and ws["A1"].value is None:
sheets_to_delete.append(sheet_name)
for sheet_name in sheets_to_delete:
del wb[sheet_name]
print(f"✅ 已删除空工作表:{sheet_name}")
wb.save("多工作表文件_删除空表.xlsx")
三、删除列
3.1 删除指定列
from openpyxl import load_workbook
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 删除第5列(绩效列)
ws.delete_cols(5) # 参数是列号,从1开始
print("✅ 已删除第5列(绩效列)")
# 删除多列:从第3列开始,删除2列(即删除第3、4列)
ws.delete_cols(3, 2) # 第一个参数是起始列号,第二个参数是删除的列数
print("✅ 已删除第3、4列")
wb.save("员工信息_删除列.xlsx")
3.2 按列名删除列
from openpyxl import load_workbook
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 要删除的列名
columns_to_delete = ["绩效", "备注"]
# 先获取表头行(第一行)的列名和列号对应关系
header = {}
for col in range(1, ws.max_column + 1):
col_name = ws.cell(row=1, column=col).value
if col_name:
header[col_name] = col
# 注意:删除列要从右往左删,避免删除前面的列导致后面的列号变化
for col_name in reversed(columns_to_delete):
if col_name in header:
col_idx = header[col_name]
ws.delete_cols(col_idx)
print(f"✅ 已删除列:{col_name}")
else:
print(f"⚠️ 列不存在:{col_name}")
wb.save("员工信息_按列名删除.xlsx")
3.3 删除空列
from openpyxl import load_workbook
wb = load_workbook("数据文件.xlsx")
ws = wb.active
# 从右往左检查每列是否为空
for col in range(ws.max_column, 0, -1):
is_empty = True
for row in range(1, ws.max_row + 1):
if ws.cell(row=row, column=col).value is not None:
is_empty = False
break
if is_empty:
ws.delete_cols(col)
print(f"✅ 已删除空列:第{col}列")
wb.save("数据文件_删除空列.xlsx")
3.4 使用pandas删除列
pandas删除列更简单高效:
import pandas as pd
df = pd.read_excel("员工信息.xlsx")
# 删除指定列
df = df.drop(columns=["绩效", "备注"])
print("✅ 已删除绩效、备注列")
# 按索引删除列,删除第2、3列
df = df.drop(df.columns[[1, 2]], axis=1)
print("✅ 已删除第2、3列")
# 删除所有空列
df = df.dropna(axis=1, how="all")
print("✅ 已删除所有空列")
df.to_excel("员工信息_pandas删除列.xlsx", index=False)
四、删除行
删除行是最常用的操作,注意要从下往上删,避免索引错乱。
4.1 删除指定行
from openpyxl import load_workbook
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 删除第3行
ws.delete_rows(3) # 参数是行号,从1开始
print("✅ 已删除第3行")
# 删除多行:从第2行开始,删除3行(即删除第2、3、4行)
ws.delete_rows(2, 3) # 第一个参数是起始行号,第二个参数是删除的行数
print("✅ 已删除第2、3、4行")
wb.save("员工信息_删除行.xlsx")
4.2 删除空行
from openpyxl import load_workbook
wb = load_workbook("数据文件.xlsx")
ws = wb.active
# 从下往上检查每一行是否为空
for row in range(ws.max_row, 0, -1):
is_empty = True
for col in range(1, ws.max_column + 1):
if ws.cell(row=row, column=col).value is not None:
is_empty = False
break
if is_empty:
ws.delete_rows(row)
print(f"✅ 已删除空行:第{row}行")
wb.save("数据文件_删除空行.xlsx")
4.3 按条件删除行
这是最常用的场景,比如删除不符合条件的数据。
示例1:删除工资低于10000的员工
from openpyxl import load_workbook
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 从下往上遍历(跳过表头)
for row in range(ws.max_row, 1, -1):
salary = ws.cell(row=row, column=4).value # D列是工资
if isinstance(salary, (int, float)) and salary < 10000:
ws.delete_rows(row)
print(f"✅ 已删除第{row}行:工资低于10000")
wb.save("员工信息_删除低工资.xlsx")
示例2:删除特定部门的员工
from openpyxl import load_workbook
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 要删除的部门
delete_departments = ["实习生", "外包"]
for row in range(ws.max_row, 1, -1):
department = ws.cell(row=row, column=2).value # B列是部门
if department in delete_departments:
ws.delete_rows(row)
print(f"✅ 已删除第{row}行:部门{department}")
wb.save("员工信息_删除指定部门.xlsx")
示例3:删除重复行
from openpyxl import load_workbook
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 记录已出现的员工姓名
seen_names = set()
for row in range(ws.max_row, 1, -1):
name = ws.cell(row=row, column=1).value # A列是姓名
if name in seen_names:
ws.delete_rows(row)
print(f"✅ 已删除重复行:{name}")
else:
seen_names.add(name)
wb.save("员工信息_删除重复行.xlsx")
示例4:删除包含特定关键词的行
from openpyxl import load_workbook
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
# 删除备注列包含"离职"字样的行
for row in range(ws.max_row, 1, -1):
remark = ws.cell(row=row, column=6).value # F列是备注
if remark and "离职" in str(remark):
ws.delete_rows(row)
print(f"✅ 已删除第{row}行:包含离职关键词")
wb.save("员工信息_删除离职人员.xlsx")
4.4 使用pandas删除行
pandas删除行更简单,适合批量处理:
import pandas as pd
df = pd.read_excel("员工信息.xlsx")
# 删除指定行,删除第0、2行(索引从0开始)
df = df.drop([0, 2])
print("✅ 已删除第1、3行")
# 按条件删除:删除工资低于10000的
df = df[df["工资"] >= 10000]
print("✅ 已删除工资低于10000的行")
# 删除空行
df = df.dropna(axis=0, how="all")
print("✅ 已删除空行")
# 删除重复行,根据姓名字段去重
df = df.drop_duplicates(subset=["姓名"], keep="first")
print("✅ 已删除重复行")
df.to_excel("员工信息_pandas删除行.xlsx", index=False)
五、高级删除技巧
5.1 删除指定范围的行
from openpyxl import load_workbook
wb = load_workbook("销售数据.xlsx")
ws = wb.active
# 删除第10行到第20行(包含两端)
start_row = 10
end_row = 20
rows_to_delete = end_row - start_row + 1
ws.delete_rows(start_row, rows_to_delete)
print(f"✅ 已删除第{start_row}到{end_row}行,共{rows_to_delete}行")
wb.save("销售数据_删除范围行.xlsx")
5.2 删除表头以外的所有行
from openpyxl import load_workbook
wb = load_workbook("数据模板.xlsx")
ws = wb.active
# 保留表头(第一行),删除其他所有行
if ws.max_row > 1:
ws.delete_rows(2, ws.max_row - 1)
print("✅ 已删除表头以外的所有行")
wb.save("数据模板_清空数据.xlsx")
5.3 根据多条件删除行
from openpyxl import load_workbook
from datetime import datetime
wb = load_workbook("员工信息.xlsx")
ws = wb["员工表"]
current_year = datetime.now().year
# 删除入职不满1年且绩效为C的员工
for row in range(ws.max_row, 1, -1):
hire_date = ws.cell(row=row, column=3).value # C列入职日期
performance = ws.cell(row=row, column=5).value # E列绩效
if isinstance(hire_date, str):
hire_year = int(hire_date.split("-")[0])
else:
hire_year = hire_date.year
work_years = current_year - hire_year
if work_years < 1 and performance == "C":
ws.delete_rows(row)
print(f"✅ 已删除第{row}行:入职不满1年且绩效为C")
wb.save("员工信息_多条件删除.xlsx")
5.4 批量删除多个Excel文件中的指定行
import os
from openpyxl import load_workbook
folder_path = "月度报表/"
# 每个文件都删除前3行(表头说明行)
rows_to_delete = 3
for filename in os.listdir(folder_path):
if filename.endswith((".xlsx", ".xls")) and not filename.startswith("~$"):
file_path = os.path.join(folder_path, filename)
print(f"正在处理:{filename}")
wb = load_workbook(file_path)
ws = wb.active
if ws.max_row > rows_to_delete:
ws.delete_rows(1, rows_to_delete)
wb.save(file_path)
print(f"✅ 已删除前{rows_to_delete}行")
else:
print("⚠️ 文件行数不足,跳过")
print("✅ 批量处理完成!")
5.5 删除隐藏的行和列
from openpyxl import load_workbook
wb = load_workbook("带隐藏行的文件.xlsx")
ws = wb.active
# 删除隐藏行(从下往上)
for row in range(ws.max_row, 0, -1):
if ws.row_dimensions[row].hidden:
ws.delete_rows(row)
print(f"✅ 已删除隐藏行:第{row}行")
# 删除隐藏列(从右往左)
for col in range(ws.max_column, 0, -1):
if ws.column_dimensions[chr(64 + col)].hidden:
ws.delete_cols(col)
print(f"✅ 已删除隐藏列:第{col}列")
wb.save("文件_删除隐藏行列.xlsx")
六、常见问题与解决方案
6.1 删除行后数据错乱
问题:删除了几行后,后面的数据不对了
原因:从上往下删除行,删除前面的行后,后面的行号会变化,导致漏删或者删错
解决方案:
# 正确写法:从最大行开始往1遍历
for row in range(ws.max_row, 0, -1):
# 处理逻辑
pass
6.2 删除后文件变大
问题:删除了很多内容,文件反而变大了
原因:openpyxl删除行/列后,不会释放空间,有很多残留的样式信息
解决方案:
from openpyxl import load_workbook, Workbook
wb_old = load_workbook("大文件.xlsx")
ws_old = wb_old.active
wb_new = Workbook()
ws_new = wb_new.active
# 复制需要的内容
for row in ws_old.iter_rows(values_only=True):
ws_new.append(row)
wb_new.save("清理后文件.xlsx")
6.3 删除带合并单元格的行出错
问题:删除包含合并单元格的行后,合并单元格格式错乱
解决方案:
import pandas as pd
# 用pandas读取会自动展开合并单元格
df = pd.read_excel("带合并单元格的文件.xlsx")
# 删除行
df = df.drop([0, 1, 2])
# 重新保存
df.to_excel("删除后文件.xlsx", index=False)
6.4 大文件删除速度慢
问题:几十万行的文件删除行速度很慢
解决方案:
6.5 删除后公式引用错误
问题:删除行/列后,公式出现#REF!错误
解决方案:
# 先读取所有公式的计算结果,保存为数值
wb = load_workbook("带公式的文件.xlsx", data_only=True)
# 处理删除操作
# 或者删除后重新设置正确的公式
七、最佳实践
1. 先备份再操作:删除操作不可逆,任何删除前先备份原文件
2. 小范围测试:批量删除前先测试1-2个文件,确认删除逻辑正确
3. 注意删除顺序:删行从下往上,删列从右往左,避免索引错乱
4. 验证结果:删除完成后一定要打开文件检查,确认没有删错数据
5. 日志记录:批量删除时记录删除的行号、内容,方便后续核查
6. 复杂场景用pandas:数据量大、条件复杂时优先用pandas,更简单高效
7. 重要数据双验证:删除重要数据前,先导出要删除的内容到单独文件,确认无误后再执行删除
通过以上方法,你可以灵活应对各种删除场景,无论是简单的行列删除还是复杂的条件删除,都能高效准确地完成。记住删除前一定要备份,避免数据丢失!