乐于分享
好东西不私藏

【Excel篇】openpyxl库-入门介绍

【Excel篇】openpyxl库-入门介绍

前面给大家详细进行Python入门和进阶,从今天开始,给大家分享python中办公自动化最常用的库,先从Openpyxl开始。

一、openpyxl 介绍与原理

1. 什么是 openpyxl?

  • 一个 专门用于读写 Excel 2010+ 文件(.xlsx / .xlsm) 的 Python 第三方库

  • 支持:

    • 读取/写入单元格数据

    • 操作行、列、工作表

    • 设置样式(字体、颜色、边框、对齐)

    • 插入图表、图片、公式

    • 数据验证、筛选、冻结窗格

  • 不支持:旧版 .xls 格式(需用 xlrd / xlwt

2. 为什么需要 openpyxl?

场景传统方式(手工)openpyxl 自动化
1000行成绩单加总分手动输入公式1行代码搞定
每月50个报表合并复制粘贴30分钟脚本3秒完成
销售数据生成图表反复操作自动生成并嵌入

3. openpyxl 的工作原理(重点)

Excel 文件的本质:

.xlsx 文件 = ZIP 压缩包├── xl/│   ├── workbook.xml   (工作簿定义)│   ├── worksheets/    (每个工作表是一个XML文件)│   │   ├── sheet1.xml│   │   └── sheet2.xml│   ├── styles.xml     (样式定义)│   └── sharedStrings.xml (共享字符串)└── [Content_Types].xml

openpyxl 工作流程

Python 对象           操作             最终写入─────────────────────────────────────────────────Workbook    →   修改内存中的模型   →   解压原文件Worksheet                        →   修改 XMLCell                             →   重新压缩为 .xlsx

核心原理:

  1. 读取时:解压 .xlsx → 解析 XML → 构建 Python 对象(Workbook/Worksheet/Cell)

  2. 修改时:直接操作内存中的 Python 对象(不写磁盘)

  3. 保存时:将 Python 对象序列化回 XML → 重新压缩成 .xlsx

为什么这样设计?

  • 避免频繁读写磁盘(性能高)

  • 支持大文件(使用 read_only / write_only 模式可降低内存)

  • 不依赖 Excel 软件(可在 Linux 服务器运行)

4. openpyxl 与其他库的对比

库名支持格式读/写样式图表适用场景
openpyxl.xlsx/.xlsm✅/✅现代 Excel 首选
xlrd.xls / .xlsx✅/❌仅读取旧版
xlwt.xls❌/✅仅写入旧版
pandas.xlsx✅/✅数据分析为主
xlsxwriter.xlsx❌/✅仅写入,高性能

选择 openpyxl 的原因:

  • 唯一同时支持读写 + 样式 + 图表的现代库

  • 不需要安装 Excel

  • 跨平台(Windows / macOS / Linux)

5. openpyxl 的对象模型(重要)

Workbook (工作簿)    │    ├── sheetnames         # 工作表名称列表    ├── active             # 当前激活的工作表    ├── create_sheet()     # 新建工作表    ├── remove()           # 删除工作表    │    └── Worksheet (工作表)            │            ├── title      # 工作表名称            ├── max_row    # 最大行数            ├── max_column # 最大列数            ├── dimensions # 已使用区域            │            ├── cell(row, col)          # 获取单元格            ├── iter_rows()             # 遍历行            ├── iter_cols()             # 遍历列            │            └── Cell (单元格)                    ├── value           # 单元格的值                    ├── row / column    # 行列号                    ├── coordinate      # 坐标(如 "A1")                    ├── font / fill / border  # 样式属性                    └── number_format   # 数字格式

二、代码演示(完整示例)

1. 安装与验证

pip install openpyxl
import openpyxlprint(f"openpyxl 版本:{openpyxl.__version__}")# 查看库的安装路径(可选)print(f"安装路径:{openpyxl.__file__}")

2. 理解内存与文件的关系(演示)

from openpyxl import Workbook# 此时只有内存中的对象,没有磁盘文件wb = Workbook()ws = wb.activews["A1"] = "Hello"print("文件尚未保存到磁盘")# 保存后才真正生成 .xlsx 文件wb.save("原理演示.xlsx")print("已压缩生成文件")

3. 查看 openpyxl 解析后的对象结构

from openpyxl import load_workbookwb = load_workbook("原理演示.xlsx")print(f"工作簿对象:{wb}")print(f"工作表数量:{len(wb.sheetnames)}")print(f"工作表名称:{wb.sheetnames}")ws = wb.activeprint(f"工作表对象:{ws}")print(f"最大行:{ws.max_row},最大列:{ws.max_column}")cell = ws["A1"]print(f"单元格对象:{cell}")print(f"坐标:{cell.coordinate},值:{cell.value}")

4. 创建一个带多个工作表的文件

from openpyxl import Workbookwb = Workbook()# 验证:新建的工作簿默认带一个工作表print(f"默认工作表:{wb.sheetnames}")# 新增工作表for name in ["数据表""统计表""图表表"]:    wb.create_sheet(name)print(f"新增后:{wb.sheetnames}")# 调整工作表顺序(通过索引移动)wb.move_sheet("统计表", offset=-1)  # 向前移动1位print(f"移动后:{wb.sheetnames}")# 保存wb.save("多工作表演示.xlsx")

三、独立练习

练习任务:

  1. 创建一个名为 原理练习.xlsx 的工作簿

  2. 新增3个工作表:「原始数据」「处理结果」「说明」

  3. 在「原始数据」工作表中写入:

    • A1: "创建时间"

    • B1: 当前日期(可以用字符串写)

  4. 读取并打印该单元格的值

  5. 观察:此时磁盘文件是否已存在?执行 save() 后才存在

  6. 保存后,用压缩软件打开 .xlsx 文件,观察内部 XML 结构(扩展任务)

思考题:

  • 如果不执行 save(),数据会丢失吗?为什么?


四、常见错误与解决

错误信息原因解决方法
ModuleNotFoundError: No module named 'openpyxl'未安装库pip install openpyxl
FileNotFoundError文件不存在检查路径或先创建文件
PermissionErrorExcel 文件被打开关闭 Excel 再运行代码
ValueError: Unknown extension文件不是 .xlsx只能操作 xlsx / xlsm
KeyError: '工作表名'工作表名称不存在用 sheetnames 查看已有名称

五、总结

本节课核心知识点:

  1. ✅ openpyxl 是什么:读写 .xlsx 的 Python 库

  2. ✅ 原理:.xlsx = ZIP + XML,openpyxl 解压 → 修改 XML → 重新压缩

  3. ✅ 对象模型:Workbook → Worksheet → Cell

  4. ✅ 基本操作:创建、加载、保存、工作表管理

  5. ✅ 与文件的交互:修改在内存,save() 才落地

一句话记住原理:

openpyxl 像一个 XML 翻译官,把 Excel 文件翻译成 Python 对象,你改对象,它帮你写回压缩包。