前面给大家详细进行Python入门和进阶,从今天开始,给大家分享python中办公自动化最常用的库,先从Openpyxl开始。
一、openpyxl 介绍与原理
1. 什么是 openpyxl?
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
核心原理:
读取时:解压 .xlsx → 解析 XML → 构建 Python 对象(Workbook/Worksheet/Cell)
修改时:直接操作内存中的 Python 对象(不写磁盘)
保存时:将 Python 对象序列化回 XML → 重新压缩成 .xlsx
为什么这样设计?
4. openpyxl 与其他库的对比
| 库名 | 支持格式 | 读/写 | 样式 | 图表 | 适用场景 |
|---|
| openpyxl | .xlsx/.xlsm | ✅/✅ | ✅ | ✅ | 现代 Excel 首选 |
| xlrd | .xls / .xlsx | ✅/❌ | ❌ | ❌ | 仅读取旧版 |
| xlwt | .xls | ❌/✅ | ✅ | ❌ | 仅写入旧版 |
| pandas | .xlsx | ✅/✅ | ❌ | ❌ | 数据分析为主 |
| xlsxwriter | .xlsx | ❌/✅ | ✅ | ✅ | 仅写入,高性能 |
选择 openpyxl 的原因:
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. 安装与验证
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")
三、独立练习
练习任务:
创建一个名为 原理练习.xlsx 的工作簿
新增3个工作表:「原始数据」「处理结果」「说明」
在「原始数据」工作表中写入:
A1: "创建时间"
B1: 当前日期(可以用字符串写)
读取并打印该单元格的值
观察:此时磁盘文件是否已存在?执行 save() 后才存在
保存后,用压缩软件打开 .xlsx 文件,观察内部 XML 结构(扩展任务)
思考题:
四、常见错误与解决
| 错误信息 | 原因 | 解决方法 |
|---|
ModuleNotFoundError: No module named 'openpyxl' | 未安装库 | pip install openpyxl |
FileNotFoundError | 文件不存在 | 检查路径或先创建文件 |
PermissionError | Excel 文件被打开 | 关闭 Excel 再运行代码 |
ValueError: Unknown extension | 文件不是 .xlsx | 只能操作 xlsx / xlsm |
KeyError: '工作表名' | 工作表名称不存在 | 用 sheetnames 查看已有名称 |
五、总结
本节课核心知识点:
✅ openpyxl 是什么:读写 .xlsx 的 Python 库
✅ 原理:.xlsx = ZIP + XML,openpyxl 解压 → 修改 XML → 重新压缩
✅ 对象模型:Workbook → Worksheet → Cell
✅ 基本操作:创建、加载、保存、工作表管理
✅ 与文件的交互:修改在内存,save() 才落地
一句话记住原理:
openpyxl 像一个 XML 翻译官,把 Excel 文件翻译成 Python 对象,你改对象,它帮你写回压缩包。