Python操作Excel选哪个库?openpyxl、pandas与xlwings对比指南

一只小鹿
一只小鹿
发布时间:2026-11-03| 12人浏览过
原创

详细对比openpyxl、pandas与xlwings三个Python操作Excel的主流库,从读写能力、格式控制、自动化场景等维度帮你选出最合适的工具。

用Python处理Excel时,openpyxl、pandas和xlwings是最常被提到的三个库。它们能力各有侧重:openpyxl擅长精确控制单元格和格式,pandas擅长批量数据分析与转换,xlwings则打通了Python与运行中的Excel应用程序。选哪个取决于你的核心需求——读写格式、分析数据还是驱动Excel自动化。本文从安装、基本用法到典型场景逐一对比,帮你做出判断。

三个库分别解决什么问题

openpyxl——直接操作 .xlsx 文件

openpyxl把 .xlsx 文件当作一个XML压缩包来读写,不需要安装Excel软件。它能精确控制每个单元格的值、字体、边框、填充色、合并区域、条件格式甚至图表。适合需要生成带有复杂样式的报表、模板填充、批量修改格式的场景。

pandas——面向数据的读写与分析

pandas的核心是DataFrame,它把Excel工作表视为一张二维表来处理。读取时自动识别表头和数据类型,之后可以做筛选、分组、合并、统计等操作,最后写回Excel或其他格式。pandas不关心单元格的字体颜色,它关心的是数据本身。适合从Excel提取数据、清洗转换、批量汇总的场景。

xlwings——与运行中的Excel交互

xlwings通过COM(Windows)或AppleScript(macOS)与正在运行的Excel应用通信。它可以读写单元格、调用VBA宏、刷新数据透视表、操控图表,甚至用Python函数替代VBA。适合需要保留Excel原有宏和公式、需要与用户交互的自动化场景。必须本机安装Excel。

Python操作Excel选哪个库?openpyxl、pandas与xlwings对比指南
图1 三个库的定位与核心区别

安装与基本读写

三个库都通过pip安装:

pip install openpyxl
pip install pandas openpyxl   # pandas读写xlsx需要openpyxl作为引擎
pip install xlwings

pandas本身不包含Excel读写引擎。读写 .xlsx 时,它默认调用openpyxl;读 .xls 旧格式时需要安装xlrd。所以即使只用pandas处理Excel,也要装openpyxl。

openpyxl:逐单元格读写

from openpyxl import load_workbook

wb = load_workbook("sales.xlsx")
ws = wb.active

# 读取A1单元格
print(ws["A1"].value)

# 写入B2单元格
ws["B2"] = 1200

# 遍历指定范围
for row in ws.iter_rows(min_row=2, max_col=3, values_only=True):
    print(row)

wb.save("sales_modified.xlsx")

openpyxl按单元格坐标操作,读取后得到的是Python原生类型(字符串、数字、日期等)。写入时同样逐个赋值或按行批量写入。保存时会生成新的 .xlsx 文件(或覆盖原文件)。

pandas:整表读入 DataFrame

import pandas as pd

df = pd.read_excel("sales.xlsx", sheet_name="Sheet1")

# 查看前5行
print(df.head())

# 筛选销售额大于1000的行
high_sales = df[df["销售额"] > 1000]

# 写回Excel
high_sales.to_excel("high_sales.xlsx", index=False)

pandas把整张工作表读成DataFrame,列名默认取自第一行。之后可以用布尔索引、groupby、merge等操作处理数据。to_excel()写出时不保留原文件的格式。

xlwings:操作正在打开的Excel

import xlwings as xw

# 连接到正在运行的Excel(或启动新实例)
wb = xw.Book("sales.xlsx")
ws = wb.sheets["Sheet1"]

# 读取区域
data = ws.range("A1:C10").value
print(data)

# 写入
ws.range("D1").value = "状态"
ws.range("D2").value = [["已处理"], ["待审核"], ["已完成"]]

wb.save()
wb.close()

xlwings的读写操作会实时反映在Excel窗口中。如果Excel正在运行,xw.Book()会连接已打开的工作簿;否则会启动Excel再打开文件。写入的数据会经过Excel的公式引擎重新计算。

格式控制能力的差异

格式控制是三个库差距最大的地方,也是很多人选错库的原因。

openpyxl可以设置字体、填充色、边框、对齐方式、数字格式、条件格式、数据验证,还可以插入图表和图片。下面是一个设置表头样式的例子:

from openpyxl.styles import Font, PatternFill, Alignment

ws["A1"].font = Font(name="微软雅黑", size=12, bold=True, color="FFFFFF")
ws["A1"].fill = PatternFill(start_color="4472C4", fill_type="solid")
ws["A1"].alignment = Alignment(horizontal="center", vertical="center")

pandas写出Excel时默认不设置任何样式。如果需要格式,要借助openpyxl引擎手动处理,或者使用Styler(但Styler主要面向HTML输出,对Excel的支持有限)。典型做法是先用pandas写数据,再用openpyxl打开文件补充格式:

df.to_excel("report.xlsx", index=False, engine="openpyxl")

wb = load_workbook("report.xlsx")
ws = wb.active
for cell in ws[1]:
    cell.font = Font(bold=True)
wb.save("report.xlsx")

xlwings通过Excel应用程序本身来设置格式,语法类似VBA:

ws.range("A1").font.bold = True
ws.range("A1").font.size = 14
ws.range("A1").color = (68, 114, 196)   # RGB元组

xlwings可以使用Excel的全部格式功能,但每次操作都要与Excel进程通信,批量设置格式时速度较慢。

Python操作Excel选哪个库?openpyxl、pandas与xlwings对比指南
图2 三个库在格式控制方面的能力对比

数据处理效率与大文件表现

处理数据量较大的Excel文件时,三个库的表现差异明显。

openpyxl默认会把整个工作簿加载到内存。对于大文件可以使用只读模式(read_only=True)按行流式读取,内存占用大幅降低。写入大文件时可以用只写模式(write_only=True)逐行写入,避免一次性构建整个文档对象。

# openpyxl 只读模式处理大文件
wb = load_workbook("big_data.xlsx", read_only=True)
ws = wb.active
for row in ws.iter_rows(values_only=True):
    # 逐行处理,不全部载入内存
    process(row)
wb.close()   # 只读模式需要显式关闭

pandas读取大文件时,会将所有数据加载为DataFrame,内存占用通常是文件大小的3到10倍(因为要存储索引、数据类型元信息等)。处理百万行级别的数据时,可以通过指定usecols只读取需要的列、指定dtype减少类型推断开销,或者分块读取:

# pandas 分块读取
for chunk in pd.read_excel("big_data.xlsx", chunksize=10000):
    result = chunk.groupby("类别")["金额"].sum()
    # 处理每个块

xlwings的速度受限于Python与Excel之间的进程间通信。读写少量单元格时感觉不到延迟,但逐单元格操作上万行数据会很慢。优化方法是尽量用范围操作一次读写整块区域,而不是逐个单元格:

# 慢:逐单元格写入
for i in range(10000):
    ws.range(f"A{i+1}").value = data[i]

# 快:一次写入整个范围
ws.range("A1").value = [[d] for d in data]

一个典型场景的完整对比

假设需要完成这样一个任务:从sales.xlsx读取数据,筛选出销售额大于5000的记录,在新文件中生成一张带表头样式的汇总表。看看三个库分别怎么做。

openpyxl 的做法

from openpyxl import load_workbook, Workbook
from openpyxl.styles import Font, PatternFill

wb_src = load_workbook("sales.xlsx")
ws_src = wb_src.active

wb_new = Workbook()
ws_new = wb_new.active
ws_new.title = "高销售额"

# 写表头并设置样式
headers = [cell.value for cell in ws_src[1]]
ws_new.append(headers)
for cell in ws_new[1]:
    cell.font = Font(bold=True, color="FFFFFF")
    cell.fill = PatternFill(start_color="4472C4", fill_type="solid")

# 筛选并写入数据(假设销售额在第3列)
for row in ws_src.iter_rows(min_row=2, values_only=True):
    if row[2] and row[2] > 5000:
        ws_new.append(row)

wb_new.save("high_sales_styled.xlsx")

pandas + openpyxl 的做法

import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill

df = pd.read_excel("sales.xlsx")
high = df[df["销售额"] > 5000]
high.to_excel("high_sales_styled.xlsx", index=False)

# 补充格式
wb = load_workbook("high_sales_styled.xlsx")
ws = wb.active
for cell in ws[1]:
    cell.font = Font(bold=True, color="FFFFFF")
    cell.fill = PatternFill(start_color="4472C4", fill_type="solid")
wb.save("high_sales_styled.xlsx")

xlwings 的做法

import xlwings as xw

app = xw.App(visible=False)
wb_src = app.books.open("sales.xlsx")
ws_src = wb_src.sheets[0]

wb_new = app.books.add()
ws_new = wb_new.sheets[0]
ws_new.name = "高销售额"

# 读取全部数据
data = ws_src.used_range.value
headers = data[0]
filtered = [row for row in data[1:] if row[2] and row[2] > 5000]

# 写入
ws_new.range("A1").value = headers
ws_new.range("A2").value = filtered

# 设置表头样式
header_range = ws_new.range("A1").expand("right")
header_range.font.bold = True
header_range.font.color = (255, 255, 255)
header_range.color = (68, 114, 196)

wb_new.save("high_sales_styled.xlsx")
wb_new.close()
wb_src.close()
app.quit()

可以看到,完成同一个任务,openpyxl需要手动处理每一行数据和格式,代码量最多但控制力最强;pandas筛选数据最简洁,但格式部分还是要靠openpyxl;xlwings的代码接近VBA的思路,读写和格式一气呵成,但要求运行环境有Excel。

Python操作Excel选哪个库?openpyxl、pandas与xlwings对比指南
图3 从读取到输出的三种实现路径对比

运行环境与部署限制

这一点经常被忽略,但在实际项目中往往是决定性因素。

openpyxl和pandas是纯Python库,可以在任何安装了Python的环境中运行——Windows、macOS、Linux、Docker容器、云函数(AWS Lambda、阿里云函数计算等)都可以。它们不依赖任何外部软件。

xlwings必须在安装了Microsoft Excel的机器上运行。Windows上通过COM接口通信,macOS上通过AppleScript。这意味着它无法在Linux服务器、Docker容器或无头(headless)环境中使用。如果你的脚本需要部署到服务器定时执行,xlwings不适合。

另一个容易踩坑的地方是并发。openpyxl和pandas可以在多进程或多线程中安全使用(各自操作不同文件时),但xlwings操作的是Excel应用进程,多个脚本同时操作同一个Excel实例会产生冲突。

组合使用的常见模式

实际项目中,三个库经常配合使用而非二选一。几种常见组合:

pandas + openpyxl:最常见的组合。用pandas做数据读取、清洗、分析、汇总,再用openpyxl给输出文件添加格式。pandas的read_excel()和to_excel()底层就是调用openpyxl,两者天然兼容。

pandas + xlwings:xlwings原生支持DataFrame。ws.range("A1").options(pd.DataFrame).value可以直接把区域读成DataFrame,处理完后再写回Excel。适合需要用Excel展示结果、或者需要利用Excel已有模板的场景。

openpyxl生成 + xlwings刷新:用openpyxl在服务器端生成带公式的Excel文件,下载到本地后用xlwings打开并触发Excel重新计算所有公式。这样既利用了openpyxl的跨平台能力,又利用了Excel的计算引擎。

选择依据

根据你的具体情况,按以下条件判断:

你的需求推荐选择原因
读取Excel做数据分析pandas筛选、分组、统计一行代码搞定
生成带格式的报表openpyxl精确控制每个单元格的样式
批量转换数据并导出pandas + openpyxlpandas处理数据,openpyxl加格式
替代VBA实现自动化xlwings能调用宏、刷新公式、操控Excel
在服务器/容器中运行openpyxl 或 pandas不依赖Excel,跨平台
需要操作 .xls 旧格式pandas + xlrdopenpyxl只支持 .xlsx
需要读写Excel中的宏xlwingsopenpyxl和pandas无法执行VBA

如果你的脚本要部署到服务器,排除xlwings;如果要控制格式,排除纯pandas方案;如果主要做数据处理且不在意格式,pandas是效率最高的选择。多数项目最终会用到pandas + openpyxl的组合。

Python操作Excel选哪个库?openpyxl、pandas与xlwings对比指南
图4 根据需求选择合适库的决策流程

常见问题

openpyxl能读 .xls 文件吗?

不能。openpyxl只支持 .xlsx/.xlsm/.xltx/.xltm格式(基于Office Open XML标准)。 .xls是旧的二进制格式,需要用xlrd库读取(xlrd 2.0+也已不再支持 .xlsx,两个库各管各的格式)。

pandas写出的Excel为什么没有原来的格式?

to_excel()是重新生成一个全新的文件,不会保留源文件的任何格式信息。如果需要在保留原格式的前提下修改数据,应该用openpyxl直接操作原文件,或者用xlwings通过Excel应用程序修改。

xlwings在Linux服务器上能用吗?

不能直接用。xlwings依赖Excel应用程序(Windows的COM或macOS的AppleScript),Linux上没有Excel。xlwings PRO提供了一个无需Excel的引擎用于部分场景,但功能受限且需要商业授权。在Linux服务器上处理Excel的通用方案是openpyxl或pandas。

相关标签:

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

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 算法库。