Python操作Excel入门:用openpyxl读写xlsx文件

键盘旁的猫
键盘旁的猫
发布时间:2026-10-24 | 4人浏览过
原创

在办公自动化与数据整理任务中,Excel 是应用最广的文件承载形式之一。Python 提供了功能完善的第三方库 openpyxl,专门用于解析和构建现代 Excel(.xlsx)文件。本文以最直接的上手路径展开,介绍环境安装、核心对象模型、创建与写入数据、读取与遍历单元格,以及实际操作中关键的避坑要点。

一、基础认知与运行环境准备

在开始编写代码前,需要明确 openpyxl 的适用边界。openpyxl 专门针对遵循 ECMA-376 / ISO-29500 规范的 Office Open XML 格式设计,也就是文件扩展名为 .xlsx、.xlsm、.xltx 的现代 Excel 工作簿。如果面对的是较旧的二进制格式(Excel 97-2003 的 .xls),openpyxl 无法直接处理,通常建议在 Excel 中另存为 .xlsx 格式后再交由 Python 处理。

openpyxl 属于纯 Python 实现的独立库,无需在系统上预先安装微软 Office 或 Excel 软件即可在 Windows、macOS 和 Linux 环境中稳定运行。安装过程只需使用标准包管理工具 pip:

pip install openpyxl

安装完成后,可以在 Python 交互式环境或脚本中通过 import openpyxl 检验是否安装成功。若没有任何报错信息返回,即代表开发环境已就绪。

二、理解 openpyxl 的核心对象模型

使用 openpyxl 编写程序的核心,是建立对三个层级对象的认知:工作簿(Workbook)、工作表(Worksheet)和单元格(Cell)。所有具体的读写动作,均是沿着这一层级逐级下探并执行的。

Python操作Excel入门:用openpyxl读写xlsx文件
图 1:openpyxl 核心对象层级结构示意

从图 1 可以清晰看到:

  • Workbook(工作簿):内存中代表整个文件的容器,承担文件读取、保存、表单管理的职能。
  • Worksheet(工作表):容纳网格数据的表单。一个工作簿可以拥有一个或多个工作表。
  • Cell(单元格):存储具体数值、字符串、日期或公式的最小单位,具备坐标属性(如行号、列号)和值属性(.value)。

三、创建新表格与写入数据

创建全新的 Excel 文件通常遵循以下标准步骤:实例化 Workbook、指定工作表、填充单元格或追加整行数据,最后调用 save() 将文件持久化存储在磁盘上。

Python操作Excel入门:用openpyxl读写xlsx文件
图 2:openpyxl 操作 Excel 标准作业流程

1. 写入方式一:坐标直接赋值与 cell() 方法

最直观的写入方式是使用 Excel 坐标语法(如 "A1"、"B2")。此外,在循环处理动态数据时,使用 cell(row, column, value) 更便于用数字索引驱动。以下示例演示如何新建工作簿并填入基础信息:

from openpyxl import Workbook

# 1. 实例化新工作簿,默认自带一个名为 'Sheet' 的工作表
wb = Workbook()

# 2. 获取当前活跃表并重命名
ws = wb.active
ws.title = "销售业绩汇总"

# 3. 方式 A:通过坐标名称赋值
ws["A1"] = "部门"
ws["B1"] = "负责人"
ws["C1"] = "当月业绩"

# 4. 方式 B:通过数字行列坐标赋值(注意:从 1 起始)
ws.cell(row=2, column=1, value="华东区")
ws.cell(row=2, column=2, value="张明")
ws.cell(row=2, column=3, value=85000)

# 5. 保存至文件系统
wb.save("sales_data.xlsx")
print("文件已成功生成并保存!")

2. 写入方式二:使用 append() 批量按行追加

在爬虫抓取、数据库导出或日志清洗场景中,数据通常以行(列表或元组)的形式产生。openpyxl 提供了 ws.append() 方法,能自动将传入的可迭代对象添加到当前工作表已有数据的下一行,极大简化代码:

from openpyxl import Workbook

wb = Workbook()
ws = wb.active
ws.title = "员工名录"

# 写入表头
headers = ["员工编号", "姓名", "职能部门", "入职年份"]
ws.append(headers)

# 准备批量数据列表
employee_rows = [
    [1001, "李雷", "技术研发部", 2021],
    [1002, "韩梅梅", "市场运营部", 2022],
    [1003, "赵强", "商务合作部", 2020],
    [1004, "钱芳", "财务结算部", 2023]
]

# 批量追加行
for row in employee_rows:
    ws.append(row)

wb.save("employees.xlsx")

四、读取与遍历已有 xlsx 文件

读取已存在的 Excel 表格时,使用 openpyxl.load_workbook() 函数加载目标路径。在加载后,可以通过工作表名称选取对应页面,并获取单元格中的实际数据。

Python操作Excel入门:用openpyxl读写xlsx文件
图 3:openpyxl 单元格坐标与遍历定位机制

1. 基础读取与属性探查

通过 load_workbook() 打开已有的 Excel 工作簿后,应先明确需要操作哪一个工作表。以下代码演示了完整的读取流程:

from openpyxl import load_workbook

# 加载已有的工作簿
wb = load_workbook("employees.xlsx")

# 打印所有工作表名称列表
print("当前包含的工作表:", wb.sheetnames)

# 获取目标工作表
ws = wb["员工名录"]

# 查看有效数据行数与列数
print(f"有效数据行数: {ws.max_row}, 有效数据列数: {ws.max_column}")

# 单个单元格取值
title_val = ws["A1"].value
print(f"A1 单元格内容: {title_val}")

# 读取第 2 行第 2 列
cell_val = ws.cell(row=2, column=2).value
print(f"第 2 行第 2 列内容: {cell_val}")

2. 遍历整个工作表的两种范式

实际业务处理中最常见的是逐行解析表格数据。openpyxl 提供了 ws.rows 和 ws.iter_rows() 两种遍历方式。推荐使用带有过滤参数的 iter_rows():

from openpyxl import load_workbook

wb = load_workbook("employees.xlsx")
ws = wb["员工名录"]

# 方式一:利用 iter_rows 逐行遍历并直接获取值(values_only=True)
print("--- 逐行提取数据 ---")
for row in ws.iter_rows(min_row=1, max_row=ws.max_row, values_only=True):
    # row 返回为一个包含各列数值的元组
    print(row)

# 方式二:如果从第 2 行开始跳过表头,提取特定列
print("--- 仅提取员工姓名与部门 ---")
for row in ws.iter_rows(min_row=2, max_row=ws.max_row, min_col=2, max_col=3, values_only=True):
    name, department = row
    print(f"姓名: {name} | 部门: {department}")

values_only=True 是极为实用的参数。如果不设置该参数,迭代器返回的每一个元素都是一个 Cell 对象,必须手动书写 cell.value 才能获取内容;开启后则直接返回单元格中的 Python 原生值(如 int、float、str 或 datetime)。

五、进阶技巧与日常避坑指南

在实际使用 openpyxl 编写自动化脚本时,初学者常常会遇到公式读取、文件被占用以及内存溢出等问题。了解以下关键细节能够避免绝大多数常见错误。

Python操作Excel入门:用openpyxl读写xlsx文件
图 4:openpyxl 核心要领与避坑清单

1. 公式写入与计算结果获取

openpyxl 允许直接将 Excel 函数公式写入单元格中,例如:

ws["C10"] = "=SUM(C2:C9)"

需要注意的是,openpyxl 自身不具备公式计算引擎。当你写入 =SUM(C2:C9) 时,openpyxl 仅将该公式字符写入 XML 结构中;具体的求值过程由微软 Excel 或 WPS 在下一次被用户打开该文件时计算并缓存。

当你要读取包含公式的现有文件时:

  • 默认情况下,ws["C10"].value 返回的是公式字符串 '=SUM(C2:C9)'。
  • 如果希望读取该公式计算后的数值,必须在加载工作簿时传入 data_only=True 参数:
wb = load_workbook("sales_data.xlsx", data_only=True)
ws = wb.active
# 若此前该表格已在 Excel 中计算并保存过,则此处输出具体的求值结果(如 85000)
print(ws["C10"].value)
避坑要点:如果一个表格完全是由 Python 脚本生成并写入公式,且从未在 Excel 中被打开保存过,那么使用 data_only=True 读取该单元格时将返回 None,因为文件中尚未生成该公式的缓存结果。

2. 常见操作快速速查表

操作目标 代码示例 说明
创建新工作表 ws2 = wb.create_sheet("月度明细", 1) 第二个参数为索引位置(0 为第一张)
删除工作表 wb.remove(wb["Sheet"]) 移除不需要的默认空表
合并单元格 ws.merge_cells("A1:D1") 合并后数据仅保留在左上角 A1
拆分单元格 ws.unmerge_cells("A1:D1") 取消合并区域
设置列宽 ws.column_dimensions['A'].width = 20 优化表格显示,避免字符截断

六、总结

使用 Python 进行 Excel 自动化处理时,openpyxl 是最基础、最可靠的核心工具库。通过掌握“工作簿(Workbook)→ 工作表(Worksheet)→ 单元格(Cell)”的三层树状架构,开发者能够快速完成文件的创建、单元格数据定位、结构化按行写入与切片遍历。在日常开发中,牢记 .xlsx 格式支持边界、养成在保存前关闭占用文件的操作习惯,并在需要数值时合理运用 data_only=True,即可高质高效地完成各项数据自动化工作。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表