Python操作Excel有哪些常用库?openpyxl、pandas与xlwings对比

Leo
Leo
发布时间:2026-11-04| 3人浏览过
原创

深入对比Python操作Excel的三大主力库:openpyxl、pandas与xlwings。从底层运行机制、格式与排版、大数据读写性能、宏与公式支持到典型场景选型,帮助开发者做出准确的技术决策。

分类:Python自动化 / 数据处理 阅读时间:约10分钟 适用版本:Python 3.8+
Python操作Excel有哪些常用库?openpyxl、pandas与xlwings对比
图0:Python 操作 Excel 的三大核心库定位概览

使用 Python 操作 Excel 时,最常接触的三个库是 openpyxl、pandas 和 xlwings。它们并不是互相替代的竞品,而是服务于截然不同的技术场景:openpyxl 专注于在无需安装 Office 的环境下精细读写 .xlsx 文件的内容与样式;pandas 专注于海量表格数据的批量抽取、清洗与向量化统计计算;xlwings 则直接通过操作系统接口驱动本地安装的 Excel 桌面软件,擅长处理 VBA 宏调用、公式实时重算和人机交互。选择的关键在于分清业务诉求是“做精美格式排版”、“搞批量数据分析”还是“控桌面办公软件”。

一、底层运作机制与技术架构差异

理解三个库的核心差异,首先要看它们在操作系统和文件层面是如何工作的。很多初学者在服务器上部署脚本时报错,或者在写出数据时发现原有样式全部丢失,根源都在于没有弄清底层的操作方式。

  • openpyxl:纯 Python 实现的 XML 包解构器。现代 .xlsx 文件本质上是一个遵循 OpenXML 标准的压缩包(ZIP 文件),内部由数个存储数据、样式、工作表关系的 XML 文档构成。openpyxl 通过解包、解析并重构这些 XML 节点来修改文件,因此它完全不需要宿主机安装 Microsoft Office 或 WPS,可以无缝运行在 Linux 服务器、Docker 容器或云计算函数中。
  • pandas:以内存二维表 DataFrame 为核心的数据引擎。pandas 本身并不直接实现底层 Excel 文件协议的编解码,而是将 Excel 文件视为数据输入源,借由 openpyxl、calamine 或 xlrd 等底层引擎将数据灌入内存结构 DataFrame,完成矩阵运算后再写出。它的目标是数据内容本身,默认忽略或抹去字体、单元格底色、边框等视觉排版信息。
  • xlwings:基于 COM/AppleScript 的桌面进程桥接器。在 Windows 上通过 COM 接口、在 macOS 上通过 AppleScript,xlwings 将 Python 指令实时传递给正在运行的 EXCEL.EXE 或 Excel 应用实例。它操作的是真实的 Excel 桌面软件,所有公式由 Excel 自带的计算引擎即时演算,宏代码也能原生触发,但这也意味着它必须依赖客户端桌面操作系统与预装的 Office 软件,无法运行在标准的无头(Headless)Linux 容器中。
Python操作Excel有哪些常用库?openpyxl、pandas与xlwings对比
图1:三大库技术架构与底层交互对象拓扑图

二、核心特性与能力维度横向对比

为了在不同业务需求下快速匹配适用的库,我们可以从环境依赖、排版与样式、性能表现、高级功能支持等六个核心维度进行综合评定。

评估维度 openpyxl pandas xlwings
环境依赖 仅依赖 Python 解释器,全平台通用 仅依赖 Python 与底层引擎,全平台通用 依赖 Windows / macOS 且必须预装 Excel 桌面版
样式与排版 全面支持:字体、填充色、边框、合并单元格、条件格式、行高列宽 极弱:默认只输出纯数据,原生无样式控制(需借 Styler 或第三方工具) 全面支持:通过驱动 Excel 实现所有格式设置,所见即所得
大数据读写性能 中等。默认全量加载 DOM;支持 read_only / write_only 流式处理大文件 极高:采用 C 优化与内存向量化计算,批量数据清洗速度最快 较低。跨进程 COM 通信开销大,频繁单单元格读写时耗时显著,需批量范围读写
公式计算行为 只能写入公式字符串;无法计算结果,读取时需依赖 Excel 之前的缓存值 写入后仅为字符串;读取时取缓存结果或丢弃公式仅保留值 原生实时重算:由本地 Excel 内核负责计算,可随时读取计算后新值
VBA 宏与交互 支持保留 .xlsm 中的宏代码,但无法执行宏 不支持宏执行与交互 完美支持:随时调用宏子程序(Sub)与自定义函数(UDF)
图表与透视表 可创建基本内置图表与透视表定义,排版要求高 不支持原生 Excel 图表生成(但可配合 Matplotlib 输出图片插入) 直接调用 Excel 图表引擎与原生透视表,生成效果与手动操作一致
Python操作Excel有哪些常用库?openpyxl、pandas与xlwings对比
图2:三大库核心功能与运行特征对照矩阵

三、典型代码示例与具体操作

下面通过三个独立的实操任务,分别展示每个库最擅长的编码方式与常见注意点。所有示例均在 Python 3 环境下经过验证。

1. openpyxl:生成带有自定义样式与边框的业务报表

当需求是输出一份直接发送给管理层或客户的周报时,居中对齐、表头着色、粗边框和单元格合并是必不可少的。

import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

# 1. 创建工作簿与工作表
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "销售汇总"

# 2. 合并顶部大标题并设置样式
ws.merge_cells("A1:C1")
title_cell = ws["A1"]
title_cell.value = "2026年第一季度区域销售简报"
title_cell.font = Font(name="Microsoft YaHei", size=14, bold=True, color="FFFFFF")
title_cell.fill = PatternFill(start_color="6487A5", end_color="6487A5", fill_type="solid")
title_cell.alignment = Alignment(horizontal="center", vertical="center")
ws.row_dimensions[1].height = 36

# 3. 填充表头数据
headers = ["大区名称", "目标金额 (万元)", "达成金额 (万元)"]
ws.append(headers)

# 表头行样式设置
thin_border = Border(
    left=Side(style='thin', color='D0D7DE'),
    right=Side(style='thin', color='D0D7DE'),
    top=Side(style='thin', color='D0D7DE'),
    bottom=Side(style='thin', color='D0D7DE')
)

for col_num in range(1, 4):
    cell = ws.cell(row=2, column=col_num)
    cell.font = Font(name="Microsoft YaHei", size=11, bold=True)
    cell.fill = PatternFill(start_color="F2F4F8", end_color="F2F4F8", fill_type="solid")
    cell.alignment = Alignment(horizontal="center", vertical="center")
    cell.border = thin_border

# 4. 追加数据行
rows_data = [
    ["华东区", 120, 138],
    ["华南区", 100, 95],
    ["华北区", 90, 92]
]
for row in rows_data:
    ws.append(row)

# 5. 调整列宽以避免内容被遮挡
ws.column_dimensions["A"].width = 18
ws.column_dimensions["B"].width = 20
ws.column_dimensions["C"].width = 20

# 保存生成的文件
wb.save("sales_report_styled.xlsx")
避坑要点: 使用 openpyxl 写入公式(如 ws['C5'] = "=SUM(C2:C4)")时,它只将公式字符串写入 XML,不会计算数值。如果随后立即用代码以 data_only=True 重新读取该单元格,返回值会是 None,因为公式结果必须先由真实的 Microsoft Excel 打开并保存后,才会写进缓存区。

2. pandas:多表数据批量读取、过滤与分组汇总

面对几万行交易流水时,使用单元格逐个遍历的性能极低。pandas 借助底层高效的 C 语言扩展,可实现毫秒级的行列筛选与分组统计。

import pandas as pd

# 1. 快速读取 Excel 文件指定 Sheet
# 内部默认调用 openpyxl 或 calamine 引擎
df = pd.read_excel("raw_transactions.xlsx", sheet_name="明细数据")

# 2. 检查数据类型并进行矢量化清洗
# 过滤退款订单,只保留状态为“已完成”的记录
valid_df = df[df["order_status"] == "已完成"].copy()

# 转换交易时间列为日期格式
valid_df["pay_time"] = pd.to_datetime(valid_df["pay_time"])

# 3. 按部门和月份做透视聚合
valid_df["month"] = valid_df["pay_time"].dt.to_period("M")
summary = valid_df.groupby(["department", "month"])["amount"].agg(["count", "sum"]).reset_index()
summary.rename(columns={"count": "成交笔数", "sum": "总成交额"}, inplace=True)

# 4. 极速写出到新的 Excel
# 注意:to_excel 默认不保留原模版中的公式与样式
summary.to_excel("transactions_summary.xlsx", sheet_name="部门月度汇总", index=False)
避坑要点: 调用 DataFrame.to_excel() 时,如果目标文件已存在,默认行为是覆盖重建整个文件。如果目标文件中有其他保留排版的工作表,它们将被直接清除。若需追加写入多个工作表,必须使用 pd.ExcelWriter(mode='a', engine='openpyxl')。

3. xlwings:联动本地 Excel 软件、刷新公式与执行 VBA 宏

如果既有业务流程严重依赖已有的 .xlsm 宏模版,或者必须依赖 Excel 复杂插件的即时计算结果,xlwings 是最简便的选择。

import xlwings as xw

# 1. 连接到当前运行的 Excel 进程,或静默后台启动一个新实例
# visible=False 表示在后台静默运行,适合批量跑批
app = xw.App(visible=False, add_book=False)

try:
    # 2. 打开带有复杂公式与宏的业务工作簿
    wb = app.books.open("finance_model_with_vba.xlsm")
    ws = wb.sheets["输入参数"]

    # 3. 批量更新单元格参数(尽量按二维范围写入,避免单个单元格循环)
    ws.range("B3").value = 1500000        # 更新项目预算
    ws.range("B4").value = 0.085          # 更新折现率

    # 4. 调用工作簿中预设的 VBA 宏进行全表级联推演
    run_macro = wb.macro("RunFinancialProjection")
    run_macro()

    # 5. 此时 Excel 已经完成原生计算,直接读取推演结果
    result_sheet = wb.sheets["财务预测结果"]
    npv_value = result_sheet.range("D15").value
    irr_value = result_sheet.range("D16").value
    print(f"计算结果:净现值 NPV={npv_value:.2f}, 内部收益率 IRR={irr_value:.2%}")

    # 6. 保存并导出 PDF 报表(Excel 内置功能)
    wb.to_pdf("finance_report_output.pdf")

finally:
    # 务必在 finally 块中关闭工作簿并退出 app,防止后台遗留僵尸 EXCEL.EXE 进程
    wb.close()
    app.quit()
避坑要点: xlwings 每次读写单元格都要走跨进程 IPC。如果用 for i in range(1000): ws.range(f'A{i}').value = ... 循环一千次,耗时可能长达数秒乃至十几秒。正确的做法是把数据拼成 Python 列表或 NumPy 数组,单次整块写入:ws.range('A1:A1000').value = data_list。

四、选型判断逻辑与决策步骤

面对一个具体的新需求,无需纠结“哪个库更好”,只需按以下步骤一步步排除即可得出最合理的技术选型:

Python操作Excel有哪些常用库?openpyxl、pandas与xlwings对比
图3:根据业务场景与部署环境的技术选型决策流向图

五、总结与工程落地建议

在实际工程落地中,三个库并非非此即彼,许多成熟的数据管道会采用“组合拳”方式:

  • 黄金搭档:pandas 运算 + openpyxl 排版。先用 pandas 读取多个原始表,完成复杂的分组、聚合与清洗计算,然后通过 ExcelWriter(engine='openpyxl') 写入物理文件;随后立即调用 openpyxl.load_workbook() 打开该文件,针对生成的表格应用表头底色、数字千分位格式与边框。这种组合既保证了万级数据的处理吞吐,又保全了最终交付物的排版质感。
  • 桌面运维与既有系统兼容:专精 xlwings。当公司内部已有一套维护多年、逻辑极其繁复的 VBA 资产或金融定价模版时,重写为纯 Python 的迁移成本极高。此时使用 xlwings 在本地静默启动 Excel 传入参数并运行宏,通常是性价比最高且最稳妥的方案。
Python操作Excel有哪些常用库?openpyxl、pandas与xlwings对比
图4:三大常用库最佳定位与工程协同模式全景图

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。