Python处理Excel多工作表:openpyxl与pandas的实战对比
·
在Python 中使用 openpyxl 和 pandas 处理 Excel 多工作表的实战对比,我会从核心功能、适用场景、代码示例和优缺点四个维度,帮你清晰掌握这两个工具的差异和最佳使用方式。
一、核心背景与适用场景
| 工具 | 核心定位 | 多工作表处理优势 | 适用场景 |
|---|---|---|---|
| openpyxl | 专注 Excel 文件的底层操作 | 精细控制单元格 / 样式 / 公式,支持读写多工作表 | 需修改 Excel 样式、公式,或精细操作单元格 |
| pandas | 数据处理与分析 | 快速读取 / 写入 / 合并多工作表,数据清洗分析 | 批量处理数据、数据分析、多表数据整合 |
二、实战对比:核心操作代码示例
以下以 “读取多工作表 + 写入多工作表” 为核心场景,对比两者的实现方式(准备一个包含Sheet1、Sheet2的 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)
三、核心差异对比表
| 特性 | openpyxl | pandas |
|---|---|---|
| 数据读取方式 | 逐单元格 / 逐行读取,灵活但繁琐 | 批量读取为 DataFrame,高效简洁 |
| 样式 / 公式支持 | 完全支持(字体、颜色、公式、合并单元格) | 几乎不支持(仅能读写值,无样式控制) |
| 数据处理能力 | 弱(需手动遍历处理) | 强(筛选、分组、聚合、合并等) |
| 性能(大数据) | 差(逐行读取慢) | 优(向量化操作,处理百万行数据快) |
| 学习成本 | 低(专注 Excel 操作,逻辑简单) | 中(需掌握 DataFrame 基本操作) |
| 文件格式支持 | 仅.xlsx(不支持.xls) | 支持.xlsx/.xls(需配合 xlrd) |
| 写入方式 | 支持增量写入、精准修改 | 需整体重写(增量需借助 ExcelWriter) |
四、实战选型建议
-
选 openpyxl 的场景:
- 需要修改 Excel 的样式(字体、颜色、边框)、添加 / 修改公式;
- 只需读取 / 修改少量单元格数据,无需复杂分析;
- 需对 Excel 文件进行精细化操作(如合并单元格、插入图片)。
-
选 pandas 的场景:
- 批量读取 / 写入多工作表数据,进行数据清洗、筛选、统计;
- 多工作表数据整合(如合并 Sheet1 和 Sheet2 的相同字段);
- 处理大数据量(万行级以上),追求效率;
- 需结合其他数据分析库(如 matplotlib、numpy)做可视化 / 建模。
-
混合使用场景:
- 先用 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")
总结
- openpyxl 是 Excel 文件的 “精细化操作工具”,优势在样式、公式、单元格级别的控制,适合 Excel 格式定制;
- pandas 是数据处理的 “高效工具”,优势在批量数据读取、分析、整合,适合数据层面的处理;
- 实战中可根据需求选择:纯数据处理选 pandas,需格式定制选 openpyxl,复杂场景可混合使用两者。
更多推荐

所有评论(0)