Python使用openpyxl读写Excel文件的基础教程
在日常数据整理、批量报表生成以及自动化办公场景中,让 Python 脚本与 Excel 表格顺畅交互是一项基础且关键的技能。openpyxl 是 Python 生态中专用于处理 .xlsx 格式电子表格的经典第三方库。它不仅支持单元格的读写,还能够精确维护工作表结构与格式。本文从环境安装与核心概念入手,逐步拆解创建工作簿、写入数据、读取遍历以及高频避坑要点,帮助初学者快速掌握规范的 Excel 读写操作。
一、openpyxl 的适用场景与对象模型
在使用 openpyxl 之前,需要先明确它的适用边界。openpyxl 专门用于读取和写入 Office 2007 之后的 .xlsx、.xlsm、.xltx 及 .xltm 格式。如果面对的是老旧的二进制 .xls 格式(Excel 97-2003),openpyxl 无法直接解析,需要使用 xlrd/xlwt 或提前将其转存为 .xlsx。
理解 openpyxl 的关键在于掌握其内部的三层对象层级关系:
- Workbook(工作簿):对应磁盘上的一个完整 Excel 文件,也是内存中的最顶层容器对象。
- Worksheet(工作表):对应工作簿底部的一个 Sheet 标签页。每个工作簿可以包含一个或多个工作表。
- Cell(单元格):对应工作表网格中的单个交叉格,是存放具体数值、文本、公式及样式的最小原子单位。
二、环境配置与标准读写流程
openpyxl 是标准 Python 第三方包,可通过包管理器进行安装:
pip install openpyxl
任何对 Excel 的操作,无论是新建还是读取,都遵循一个清晰的四步流程:导入依赖 > 初始化工作簿 > 读写单元格数据 > 持久化保存与关闭。这一流程确保了内存中的修改能够正确同步至物理磁盘。
三、写入 Excel:创建工作簿与数据写入
当需要从零生成一份 Excel 文件时,使用 Workbook 类实例化一个空白工作簿。新建的工作簿默认带有一个名为“Sheet”的活动工作表。
1. 写入数据的两种常用方式
- 按坐标赋值:直接通过类似字典键的语法定位,例如
ws['A1'] = "值"。适合写入表头、固定位置汇总项等单点数据。 - 按行追加(
append):使用ws.append(iterable)方法,按行依次向表格下方追加列表或元组。这是批量生成表格时最清晰、最高效的方法。
2. 写入示例代码
from openpyxl import Workbook
# 1. 实例化工作簿
wb = Workbook()
# 2. 获取默认活动工作表,并修改名称
ws = wb.active
ws.title = "员工销售表"
# 3. 方式一:直接根据坐标写入单格内容
ws['A1'] = "工号"
ws['B1'] = "姓名"
ws['C1'] = "部门"
ws['D1'] = "销售额"
# 4. 方式二:使用 append 逐行追加业务记录
rows_data = [
["E101", "张伟", "华东分部", 45000],
["E102", "李娜", "华北分部", 52000],
["E103", "王敏", "华南分部", 38000],
["E104", "赵强", "西南分部", 61000]
]
for row in rows_data:
ws.append(row)
# 写入公式统计总和
ws['D6'] = "=SUM(D2:D5)"
ws['C6'] = "总计"
# 5. 持久化保存到当前目录
wb.save("sample_sales.xlsx")
wb.close()
print("数据写入完成,已保存至 sample_sales.xlsx")
wb.save("文件名.xlsx")。在执行 save 之前,所有改动仅停留在 Python 内存中;未调用该方法退出脚本会导致所有数据丢失。
四、读取 Excel:加载工作簿与数据遍历
对于已有文件的处理,使用 load_workbook() 函数加载目标路径。加载后可以通过工作表名称选取指定 Sheet,并提取其单元格内容。
1. 单元格访问方式对比
openpyxl 提供了两种定位单元格的途径:字母坐标法和行列索引法。两者在不同场景下各有优势:
2. 批量读取示例代码
在日常脚本中,最推荐的遍历方法是 ws.iter_rows()。配合 values_only=True 参数,可以直接获取纯 Python 原生数据,无需手动逐个解包 cell.value:
from openpyxl import load_workbook
# 1. 打开工作簿
wb = load_workbook("sample_sales.xlsx")
# 2. 查看所有工作表名称,并选取目标工作表
print("所有表名:", wb.sheetnames)
ws = wb["员工销售表"]
# 3. 获取表格的实际有效范围
print(f"最大行数: {ws.max_row}, 最大列数: {ws.max_column}")
# 4. 方式 A:单格精准读取
emp_name = ws['B2'].value
emp_sales = ws.cell(row=2, column=4).value
print(f"第一条记录: {emp_name}, 销售额: {emp_sales}")
# 5. 方式 B:全表行流式遍历(推荐:values_only 直接提取数值)
print("\n--- 全表数据输出 ---")
for row in ws.iter_rows(values_only=True):
print(row)
# 6. 关闭工作簿
wb.close()
运行上述脚本的输出示例:
所有表名: ['员工销售表']
最大行数: 6, 最大列数: 4
第一条记录: 张伟, 销售额: 45000
--- 全表数据输出 ---
('工号', '姓名', '部门', '销售额')
('E101', '张伟', '华东分部', 45000)
('E102', '李娜', '华北分部', 52000)
('E103', '王敏', '华南分部', 38000)
('E104', '赵强', '西南分部', 61000)
(None, None, '总计', '=SUM(D2:D5)')
五、核心避坑指南与常见问题排查
虽然 openpyxl 的 API 直观易懂,但在初学阶段很容易遇到几个典型异常。理解这些问题的成因有助于避免调试困境。
1. 行列索引从 1 开始
Python 程序员习惯了列表与数组从 0 索引。但在 openpyxl 中,为了与 Excel 的自然行号(1、2、3...)和列标(A=1、B=2...)对齐,所有行与列的编号均从 1 开始。如果写出 ws.cell(row=0, column=0),系统会直接报错:
ValueError: Row or column values must be at least 1
2. 为什么读取到的是公式字符串而非计算结果?
openpyxl 本身是一个文件解析器,并不内置 Excel 的公式计算引擎。在默认配置下读取带公式的单元格时,得到的是公式表达式文本(如 '=SUM(D2:D5)')。如果需要读取上一次 Excel 保存时缓存下来的数值,加载时必须加入 data_only=True:
# 加载缓存的计算结果
wb = load_workbook("sample_sales.xlsx", data_only=True)
ws = wb["员工销售表"]
print(ws['D6'].value) # 输出实际数字(如 196000),而非公式字符串
data_only=True,该单元格的值也会是 None,因为 Excel 尚未介入计算并生成缓存值。
3. PermissionError: [Errno 13] Permission denied
在 Windows 或 macOS 上,如果目标 Excel 文件已经被微软 Office Excel 或 WPS 打开,操作系统会对该文件加上写入排他锁。此时 Python 执行 wb.save() 会直接触发权限拒绝报错。排查方法:关闭正打开该文件的办公软件进程,随后重新执行脚本。
六、常用方法与场景速查
为了便于日常编码时快速查阅,下表整理了 openpyxl 的基础 API 与典型用法:
| 操作目标 | 标准代码示例 | 说明与场景 |
|---|---|---|
| 新建工作簿 | wb = Workbook() |
内存创建空白文档,自带默认 Sheet |
| 打开现有文件 | wb = load_workbook("data.xlsx") |
解析现有文件;大文件可传 read_only=True |
| 获取工作表 | ws = wb["Sheet1"] |
通过名称精确定位工作表 |
| 单格写入 | ws['A1'] = "内容" |
静态坐标直接赋值 |
| 单格读取 | val = ws.cell(row=1, column=1).value |
整数索引访问,适合双层循环嵌套 |
| 按行批量追加 | ws.append(["A", 10, True]) |
从当前已有数据的下一行自增写入 |
| 全表数据遍历 | ws.iter_rows(values_only=True) |
直接产出各行纯数值元组,性能好 |
| 持久化保存 | wb.save("output.xlsx") |
必须步骤;将内存修改完整落盘 |
掌握了上述对象层级结构、读写方法及注意事项后,读者已经能够应对大多数自动化办公中的表格处理任务。后续可以在此基础上进一步探索单元格合并、字体颜色填充以及图表生成等高级样式特性。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









