Python使用openpyxl读写Excel文件的基础教程

江岸
江岸
发布时间:2026-10-20| 6人浏览过
原创

在日常数据整理、批量报表生成以及自动化办公场景中,让 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(单元格):对应工作表网格中的单个交叉格,是存放具体数值、文本、公式及样式的最小原子单位。
Python使用openpyxl读写Excel文件的基础教程
图 1:openpyxl 的核心对象模型层级示意图

二、环境配置与标准读写流程

openpyxl 是标准 Python 第三方包,可通过包管理器进行安装:

pip install openpyxl

任何对 Excel 的操作,无论是新建还是读取,都遵循一个清晰的四步流程:导入依赖 > 初始化工作簿 > 读写单元格数据 > 持久化保存与关闭。这一流程确保了内存中的修改能够正确同步至物理磁盘。

Python使用openpyxl读写Excel文件的基础教程
图 2:openpyxl 操作流程核心四步拆解

三、写入 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 提供了两种定位单元格的途径:字母坐标法和行列索引法。两者在不同场景下各有优势:

Python使用openpyxl读写Excel文件的基础教程
图 3:单元格访问模式机制与应用场景对照

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 直观易懂,但在初学阶段很容易遇到几个典型异常。理解这些问题的成因有助于避免调试困境。

Python使用openpyxl读写Excel文件的基础教程
图 4:openpyxl 高频问题排查与避坑看板

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),而非公式字符串
提示:如果该文件完全由 Python 脚本刚刚生成,尚未在 Excel 中打开并保存过,那么即使传入 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") 必须步骤;将内存修改完整落盘

掌握了上述对象层级结构、读写方法及注意事项后,读者已经能够应对大多数自动化办公中的表格处理任务。后续可以在此基础上进一步探索单元格合并、字体颜色填充以及图表生成等高级样式特性。

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

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