Python 自动化 Excel 删除行 / 列 / 工作表


Python 自动化 Excel 删除行 / 列 / 工作表

Python 自动化 Excel 删除行 / 列 / 工作表详细教程

在处理Excel文件时,删除不需要的行、列或者工作表是非常常见的操作。无论是清理无效数据、删除空行空列,还是裁剪多余的工作表,Python都能轻松实现。本文将详细介绍各种删除场景的实现方法,包含完整代码示例和注意事项。


一、环境准备

1.1 安装依赖库

bash
pip install openpyxl pandas

1.2 重要注意事项

⚠️ 删除操作不可逆,一定要先备份文件!

1. 删除前务必复制一份原文件,避免误删重要数据

2. 不要直接在原文件上操作,建议在副本上删除,确认无误后再替换原文件

3. 删除行时要注意顺序,应该从下往上删,避免删除行后索引错乱

4. 包含公式、引用的表格删除行/列后可能导致公式错误,删除后要检查验证


二、删除工作表

2.1 删除指定名称的工作表

python
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 删除多个工作表

python
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 按索引删除工作表

python
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 删除所有工作表,保留指定工作表

python
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 删除空工作表

python
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 删除指定列

python
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 按列名删除列

python
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 删除空列

python
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删除列更简单高效:

python
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 删除指定行

python
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 删除空行

python
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的员工

python
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:删除特定部门的员工

python
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:删除重复行

python
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:删除包含特定关键词的行

python
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删除行更简单,适合批量处理:

python
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 删除指定范围的行

python
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 删除表头以外的所有行

python
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 根据多条件删除行

python
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文件中的指定行

python
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 删除隐藏的行和列

python
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 删除行后数据错乱

问题:删除了几行后,后面的数据不对了

原因:从上往下删除行,删除前面的行后,后面的行号会变化,导致漏删或者删错

解决方案

永远从下往上删除行,从右往左删除列,这样不会影响未处理的行号/列号
python
# 正确写法:从最大行开始往1遍历
for row in range(ws.max_row, 0, -1):
    # 处理逻辑
    pass

6.2 删除后文件变大

问题:删除了很多内容,文件反而变大了

原因:openpyxl删除行/列后,不会释放空间,有很多残留的样式信息

解决方案

新建一个工作簿,把需要的内容复制过去,比直接删除更干净
python
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 删除带合并单元格的行出错

问题:删除包含合并单元格的行后,合并单元格格式错乱

解决方案

删除前先处理合并单元格,或者使用pandas读取数据再重新保存(pandas会自动拆分合并单元格)
python
import pandas as pd
# 用pandas读取会自动展开合并单元格
df = pd.read_excel("带合并单元格的文件.xlsx")
# 删除行
df = df.drop([0, 1, 2])
# 重新保存
df.to_excel("删除后文件.xlsx", index=False)

6.4 大文件删除速度慢

问题:几十万行的文件删除行速度很慢

解决方案

用pandas处理,速度比openpyxl快10倍以上
如果不需要保留格式,优先用pandas
只保留需要的行,不要一行一行删

6.5 删除后公式引用错误

问题:删除行/列后,公式出现#REF!错误

解决方案

删除前先把公式转换成数值,避免引用错误
python
# 先读取所有公式的计算结果,保存为数值
wb = load_workbook("带公式的文件.xlsx", data_only=True)
# 处理删除操作
# 或者删除后重新设置正确的公式

七、最佳实践

1. 先备份再操作:删除操作不可逆,任何删除前先备份原文件

2. 小范围测试:批量删除前先测试1-2个文件,确认删除逻辑正确

3. 注意删除顺序:删行从下往上,删列从右往左,避免索引错乱

4. 验证结果:删除完成后一定要打开文件检查,确认没有删错数据

5. 日志记录:批量删除时记录删除的行号、内容,方便后续核查

6. 复杂场景用pandas:数据量大、条件复杂时优先用pandas,更简单高效

7. 重要数据双验证:删除重要数据前,先导出要删除的内容到单独文件,确认无误后再执行删除

通过以上方法,你可以灵活应对各种删除场景,无论是简单的行列删除还是复杂的条件删除,都能高效准确地完成。记住删除前一定要备份,避免数据丢失!

© 版权声明

相关文章

暂无评论

none
暂无评论...