在Python 中使用 openpyxl 和 pandas 处理 Excel 多工作表的实战对比,我会从核心功能、适用场景、代码示例和优缺点四个维度,帮你清晰掌握这两个工具的差异和最佳使用方式。

一、核心背景与适用场景

工具核心定位多工作表处理优势适用场景
openpyxl专注 Excel 文件的底层操作精细控制单元格 / 样式 / 公式,支持读写多工作表需修改 Excel 样式、公式,或精细操作单元格
pandas数据处理与分析快速读取 / 写入 / 合并多工作表,数据清洗分析批量处理数据、数据分析、多表数据整合

二、实战对比:核心操作代码示例

以下以 “读取多工作表 + 写入多工作表” 为核心场景,对比两者的实现方式(准备一个包含Sheet1Sheet2的 Excel 文件test.xlsx)。

前置准备

安装依赖:

bash

pip install openpyxl pandas
场景 1:读取多工作表数据
1. openpyxl 实现(逐表逐单元格读取)

python

from openpyxl import load_workbook

# 加载Excel文件(只读模式提升性能)
wb = load_workbook("test.xlsx", read_only=True)

# 1. 获取所有工作表名称
sheet_names = wb.sheetnames
print("所有工作表:", sheet_names)  # 输出:['Sheet1', 'Sheet2']

# 2. 遍历读取每个工作表的数据
for sheet_name in sheet_names:
    ws = wb[sheet_name]
    print(f"\n=== 读取工作表:{sheet_name} ===")
    # 逐行读取数据(跳过表头)
    for row in ws.iter_rows(min_row=2, values_only=True):  # values_only=True只取值,不返回单元格对象
        if any(row):  # 跳过空行
            print(row)

# 关闭工作簿
wb.close()
2. pandas 实现(批量读取多工作表)

python

import pandas as pd

# 方式1:读取所有工作表(返回字典,key=表名,value=DataFrame)
df_dict = pd.read_excel("test.xlsx", sheet_name=None)  # sheet_name=None表示读取所有表
print("所有工作表:", list(df_dict.keys()))  # 输出:['Sheet1', 'Sheet2']

# 遍历每个工作表的数据
for sheet_name, df in df_dict.items():
    print(f"\n=== 读取工作表:{sheet_name} ===")
    print(df.head())  # 快速查看前5行数据

# 方式2:指定读取部分工作表
df_specific = pd.read_excel("test.xlsx", sheet_name=["Sheet1"])  # 只读取Sheet1
场景 2:写入多工作表数据
1. openpyxl 实现(创建 / 写入多工作表)

python

from openpyxl import Workbook
from openpyxl.styles import Font, Alignment

# 创建新工作簿
wb = Workbook()

# 删除默认的Sheet
wb.remove(wb.active)

# 定义要写入的数据
data1 = [["姓名", "年龄", "城市"], ["张三", 25, "北京"], ["李四", 30, "上海"]]
data2 = [["商品", "价格", "库存"], ["手机", 2999, 100], ["电脑", 5999, 50]]

# 写入Sheet1并设置样式
ws1 = wb.create_sheet(title="Sheet1")
for row in data1:
    ws1.append(row)
# 设置表头样式(加粗、居中)
header_font = Font(bold=True)
header_align = Alignment(horizontal="center")
for cell in ws1[1]:  # 第一行是表头
    cell.font = header_font
    cell.alignment = header_align

# 写入Sheet2
ws2 = wb.create_sheet(title="Sheet2")
for row in data2:
    ws2.append(row)

# 保存文件
wb.save("output_openpyxl.xlsx")
wb.close()
2. pandas 实现(批量写入多工作表)

python

import pandas as pd

# 定义要写入的数据(DataFrame格式)
df1 = pd.DataFrame({
    "姓名": ["张三", "李四"],
    "年龄": [25, 30],
    "城市": ["北京", "上海"]
})
df2 = pd.DataFrame({
    "商品": ["手机", "电脑"],
    "价格": [2999, 5999],
    "库存": [100, 50]
})

# 创建Excel写入器
with pd.ExcelWriter("output_pandas.xlsx", engine="openpyxl") as writer:
    # 写入Sheet1
    df1.to_excel(writer, sheet_name="Sheet1", index=False)
    # 写入Sheet2
    df2.to_excel(writer, sheet_name="Sheet2", index=False)

# 无需手动关闭,with语句自动处理
场景 3:修改现有工作表数据
1. openpyxl(精准修改单元格)

python

from openpyxl import load_workbook

wb = load_workbook("test.xlsx")
ws = wb["Sheet1"]

# 修改指定单元格(如Sheet1的B2单元格,年龄改为26)
ws["B2"] = 26
# 添加公式(C3单元格计算B2+B3)
ws["C3"] = "=B2+B3"

wb.save("test_modified_openpyxl.xlsx")
wb.close()
2. pandas(批量修改数据后重写)

python

import pandas as pd

# 读取Sheet1
df = pd.read_excel("test.xlsx", sheet_name="Sheet1")
# 修改数据(年龄列全部+1)
df["年龄"] = df["年龄"] + 1

# 重写回原工作表(需覆盖或新增)
with pd.ExcelWriter("test_modified_pandas.xlsx", engine="openpyxl", mode="a", if_sheet_exists="replace") as writer:
    df.to_excel(writer, sheet_name="Sheet1", index=False)

三、核心差异对比表

特性openpyxlpandas
数据读取方式逐单元格 / 逐行读取,灵活但繁琐批量读取为 DataFrame,高效简洁
样式 / 公式支持完全支持(字体、颜色、公式、合并单元格)几乎不支持(仅能读写值,无样式控制)
数据处理能力弱(需手动遍历处理)强(筛选、分组、聚合、合并等)
性能(大数据)差(逐行读取慢)优(向量化操作,处理百万行数据快)
学习成本低(专注 Excel 操作,逻辑简单)中(需掌握 DataFrame 基本操作)
文件格式支持仅.xlsx(不支持.xls)支持.xlsx/.xls(需配合 xlrd)
写入方式支持增量写入、精准修改需整体重写(增量需借助 ExcelWriter)

四、实战选型建议

  1. 选 openpyxl 的场景

    • 需要修改 Excel 的样式(字体、颜色、边框)、添加 / 修改公式;
    • 只需读取 / 修改少量单元格数据,无需复杂分析;
    • 需对 Excel 文件进行精细化操作(如合并单元格、插入图片)。
  2. 选 pandas 的场景

    • 批量读取 / 写入多工作表数据,进行数据清洗、筛选、统计;
    • 多工作表数据整合(如合并 Sheet1 和 Sheet2 的相同字段);
    • 处理大数据量(万行级以上),追求效率;
    • 需结合其他数据分析库(如 matplotlib、numpy)做可视化 / 建模。
  3. 混合使用场景

    • 先用 pandas 处理数据(清洗、计算),再用 openpyxl 设置样式;
    • 示例:

      python

      import pandas as pd
      from openpyxl import load_workbook
      
      # 1. pandas处理数据
      df = pd.read_excel("test.xlsx", sheet_name="Sheet1")
      df["年龄"] = df["年龄"] + 1
      
      # 2. 写入Excel
      df.to_excel("temp.xlsx", sheet_name="Sheet1", index=False)
      
      # 3. openpyxl设置样式
      wb = load_workbook("temp.xlsx")
      ws = wb["Sheet1"]
      ws["A1"].font = Font(bold=True)
      wb.save("final.xlsx")
      

总结

  1. openpyxl 是 Excel 文件的 “精细化操作工具”,优势在样式、公式、单元格级别的控制,适合 Excel 格式定制;
  2. pandas 是数据处理的 “高效工具”,优势在批量数据读取、分析、整合,适合数据层面的处理;
  3. 实战中可根据需求选择:纯数据处理选 pandas,需格式定制选 openpyxl,复杂场景可混合使用两者。

更多推荐