前言

在 Python 生态中,有多个库可以操作 Excel 文件,每个库都有其适用场景。本文将对比介绍 5 个常用的 Excel 操作库,帮助你在不同场景下选择最合适的工具。


一、库对比总览

适用格式 优点 缺点 适用场景
openpyxl .xlsx API 简洁、纯 Python 不支持 .xls 常规读写操作
xlwings .xlsx/.xls 可调用 Excel 计算引擎 依赖 Excel 软件 需要公式重算
win32com .xlsx/.xls 功能最强大 仅 Windows、依赖 COM 复杂公式、循环引用
xlrd .xls 轻量、速度快 不支持 .xlsx(新版本) 读取旧版 .xls 文件
Spire.XLS .xlsx/.xls 功能全面、API 优雅 免费版有水印限制 跨工作簿操作

二、openpyxl —— 日常首选

特点:纯 Python 实现,无需安装 Excel,API 简洁直观。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import openpyxl

# 加载 Excel 文件
wb = openpyxl.load_workbook('data.xlsx', data_only=True)

# 获取工作表
sheet = wb['Sheet1']

# 读取数据
for row in sheet.iter_rows(min_row=2, values_only=True):
print(row)

# 写入数据
sheet['A1'] = 'Hello'
sheet.append([1, 2, 3])

# 保存
wb.save('output.xlsx')

常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
# 获取所有表名
print(wb.sheetnames)

# 创建新工作表
wb.create_sheet('新表')

# 删除工作表
del wb['旧表']

# 遍历指定范围
for row in sheet.iter_rows(min_row=1, max_row=10, min_col=1, max_col=3):
for cell in row:
print(cell.value)

适用场景:常规的数据读写、批量处理、生成报表。


三、xlwings —— 触发公式计算

特点:在后台调用 Excel 应用,可以触发公式重算。

问题场景:使用 openpyxl 读取带有公式的单元格时,可能获取到的是公式文本而非计算结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import xlwings as xw

# 后台打开 Excel
app = xw.App(visible=False)
wb = app.books.open('data.xlsx')

# 触发整个工作簿重算
wb.app.calculate()

# 读取计算后的值
sheet = wb.sheets['Sheet1']
value = sheet.range('A1').value # 获取计算结果

# 保存并关闭
wb.save()
wb.close()
app.quit()

适用场景:需要获取公式计算结果、处理跨表引用。


四、win32com —— 处理复杂场景

特点:通过 COM 接口直接控制 Excel,功能最强大,但仅支持 Windows。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import win32com.client

# 创建 Excel 应用
excel = win32com.client.DispatchEx("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False

# 打开工作簿
wb = excel.Workbooks.Open(r'C:\path\to\data.xlsx')

# 启用迭代计算(解决循环引用)
excel.Iteration = True
excel.MaxIterations = 100

# 执行计算
excel.Calculate()

# 保存并退出
wb.Save()
wb.Close(SaveChanges=1)
excel.Quit()

适用场景

  • 处理循环引用公式
  • 需要完整的 Excel 计算引擎
  • 处理复杂的 Excel 属性设置

五、xlrd —— 读取旧版 .xls

特点:轻量级,专门用于读取 .xls 格式(Excel 97-2003)。

1
2
3
4
5
6
7
8
9
10
11
12
13
import xlrd

# 打开 .xls 文件
workbook = xlrd.open_workbook('old_data.xls')

# 获取工作表
sheet = workbook.sheet_by_index(0)
# 或 sheet = workbook.sheet_by_name('Sheet1')

# 读取数据
for row_idx in range(sheet.nrows):
row = sheet.row_values(row_idx)
print(row)

注意:xlrd 2.0+ 版本已移除对 .xlsx 的支持,如需读取 .xlsx 请使用 openpyxl。

适用场景:只需要读取旧版 .xls 文件。


六、Spire.XLS —— 功能最全面

特点:商业级库,API 优雅,支持复杂操作(如跨工作簿复制工作表)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from spire.xls import Workbook

# 加载源工作簿
source_wb = Workbook()
source_wb.LoadFromFile('source.xlsx')

# 加载目标工作簿
dest_wb = Workbook()
dest_wb.LoadFromFile('destination.xlsx')

# 复制工作表(包括图片、样式等)
dest_wb.Worksheets.AddCopy(source_wb.Worksheets[0])

# 复制主题以保持格式一致
dest_wb.CopyTheme(source_wb)

# 保存
dest_wb.SaveToFile('result.xlsx')

# 释放资源
source_wb.Dispose()
dest_wb.Dispose()

局限性

  • 免费版有文件大小限制
  • 免费版会在输出文件中添加水印工作表

适用场景:需要跨工作簿复制工作表、保留复杂样式和图片。


七、实战建议

如何选择?

1
2
3
4
5
6
7
8
9
10
11
12
需要读写 .xlsx 文件?
└─ 是 → 只需要常规读写?
└─ 是 → openpyxl ✅
└─ 否 → 需要公式计算?
└─ 是 → xlwings(简单公式)
win32com(复杂公式/循环引用)
└─ 否 → 需要跨工作簿复制?
└─ 是 → Spire.XLS
└─ 否 → openpyxl

需要读取 .xls 文件?
└─ 是 → xlrd ✅

常见坑点

1. 公式单元格读取为空

问题:openpyxl 读取带公式的单元格时返回 None

解决:使用 data_only=True 参数,或改用 xlwings/win32com。

1
2
3
4
5
6
7
# openpyxl 方式(需要文件已被 Excel 打开并保存过)
wb = openpyxl.load_workbook('data.xlsx', data_only=True)

# xlwings 方式(推荐)
app = xw.App(visible=False)
wb = app.books.open('data.xlsx')
wb.app.calculate()

2. WPS 与 Excel 的差异

问题:某些库在 WPS 环境下可能出现样式错乱、打印错位等问题。

建议

  • 生产环境建议使用 Microsoft Excel
  • 打印预览时选择 “Microsoft Print to PDF” 而非 WPS 打印机

3. 文件中的图片处理

问题:openpyxl 处理嵌入图片时可能丢失或错位。

建议:需要保留图片的场景,优先考虑 Spire.XLS 或 win32com。

4. 打印设置

通过代码设置打印参数:

1
2
3
4
# win32com 设置打印居中
ws = wb.Worksheets('Sheet1')
ws.PageSetup.CenterHorizontally = True
ws.PageSetup.CenterVertically = True

八、总结

场景 推荐库
日常数据读写 openpyxl
需要公式计算结果 xlwings / win32com
读取旧版 .xls xlrd
跨工作簿复制(含图片样式) Spire.XLS
循环引用、复杂计算 win32com

选择合适的工具,可以大大提高 Excel 自动化处理的效率和稳定性。


参考资料