openpyxl 是 Python 中用于读写 Excel(.xlsx / .xlsm)文件的主流库之一,不依赖 Microsoft Excel,本身是纯 Python 实现,常用于 数据处理、报表生成、自动化办公 等场景。
一、openpyxl 能做什么?
✅ 读取 / 写入 Excel 文件(.xlsx / .xlsm)
✅ 创建、删除、重命名工作表(Sheet)
✅ 读写单元格数据(支持公式)
✅ 设置样式(字体、颜色、对齐、边框)
✅ 合并单元格、冻结窗格、筛选
✅ 插入图片、图表(柱状图、折线图等)
✅ 操作行列(插入 / 删除 / 隐藏)
❌ 不支持旧格式 .xls(需要 xlrd / xlwt)
❌ 不适合超大数据(几十万行以上性能会下降)
二、核心概念(很重要)
| 概念 | 含义 |
|---|---|
Workbook | 整个 Excel 文件 |
Worksheet | 一个工作表(Sheet) |
Cell | 单元格(如 A1) |
Row / Column | 行 / 列 |
Style | 样式对象 |
结构关系:
Workbook
├── Worksheet (Sheet1)
│ ├── Cell(A1)
│ ├── Cell(B1)
└── Worksheet (Sheet2)
三、安装
pip install openpyxl
四、基本用法示例
1️⃣ 创建 Excel 文件
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "Sheet1"
ws["A1"] = "Hello"
ws["B1"] = "openpyxl"
wb.save("example.xlsx")
2️⃣ 读取已有 Excel
from openpyxl import load_workbook
wb = load_workbook("example.xlsx")
ws = wb["Sheet1"]
print(ws["A1"].value)
3️⃣ 按行 / 列读取
for row in ws.iter_rows(min_row=1, max_col=2, max_row=5):
for cell in row:
print(cell.value)
for col in ws.iter_cols(min_col=1, max_col=2):
for cell in col:
print(cell.value)
4️⃣ 操作行和列
ws.append([1, 2, 3]) # 追加一行
ws.insert_rows(2) # 插入行
ws.delete_cols(3) # 删除列
五、样式设置(openpyxl 的强项)
字体 / 对齐 / 边框
from openpyxl.styles import Font, Alignment, Border, Side
ws["A1"].font = Font(bold=True, color="FF0000")
ws["A1"].alignment = Alignment(horizontal="center")
border = Border(
left=Side(style="thin"),
right=Side(style="thin"),
top=Side(style="thin"),
bottom=Side(style="thin"),
)
ws["A1"].border = border
设置列宽 / 行高
ws.column_dimensions["A"].width = 20
ws.row_dimensions[1].height = 30
六、合并单元格 & 冻结窗格
ws.merge_cells("A1:C1")
ws.freeze_panes = "A2"
七、公式 & 计算结果
ws["A1"] = 10
ws["A2"] = 20
ws["A3"] = "=SUM(A1:A2)"
⚠️ 注意:
openpyxl不会计算公式- 读取公式结果需要 Excel 先计算并保存
load_workbook("file.xlsx", data_only=True)
八、插入图片
from openpyxl.drawing.image import Image
img = Image("logo.png")
ws.add_image(img, "C3")
九、图表(简单示例)
from openpyxl.chart import BarChart, Reference
data = Reference(ws, min_col=1, min_row=1, max_row=5)
chart = BarChart()
chart.add_data(data)
ws.add_chart(chart, "E5")
十、与 pandas 的关系(很常见的问题)
| 场景 | 推荐 |
|---|---|
| 数据分析、清洗 | pandas |
| 精细 Excel 格式 | openpyxl |
| pandas 写 Excel 后再美化 | pandas + openpyxl |
示例:
import pandas as pd
df.to_excel("a.xlsx", engine="openpyxl")
然后再用 openpyxl 改样式。
十一、适用场景总结
✅ 自动生成报表
✅ 导出带格式的 Excel
✅ 运维 / 财务 / 统计报表
✅ 替代人工复制粘贴
❌ 海量数据处理
❌ 实时计算引擎
如果你愿意,我可以进一步给你:
- 🔹 一个 完整的 Excel 报表示例
- 🔹 openpyxl vs xlsxwriter 对比
- 🔹 和 pandas 联合使用的实战模板
- 🔹 常见坑位 & 性能优化