ARTICLE · 1352689
第一次用 Python处理Excel?那就从打开和读取数据开始吧
每个月月底,多少人对着 Excel 熬夜:十几个分公司的表要合并、几百行数据要逐个核对、改一个数字要拖半天滚动条。Excel 强在"看"和"算",弱在"自动化"——鼠标再快,也是一下一下点出来的。
Python 正好补上这块短板:
快:一万行数据,代码三秒读完,手点要十分钟; 稳:不会像人一样看串行、复制漏行; 能连招:读完直接算平均值、筛数据、存文件,一条龙。
如果你用过VBA,接下来的内容会让你频频点头——Python 操作 Excel 的套路和 VBA 几乎一一对应:打开工作簿、选中工作表、读写单元格,概念完全一样,只是语法更清爽:不用 Dim 声明变量,不用 Set 赋值对象,一个 = 全搞定。用 VBA 写惯了的"仪式代码",在 Python 里能瘦一大半。
入场券只是一个第三方库:openpyxl。终端敲一行装好它:
pip install openpyxl耐心等待1分钟,当看到以下提示信息表示安装成功:

一、先搞懂 Excel 的"三层结构"
把一个 Excel 文件想象成一本活页笔记本:

三层结构 VBA 和 Python 完全一致——这不是巧合,openpyxl 就是照着 Excel 对象模型设计的。所以有 VBA 基础的人学起来会特别快。
二、三步读取 Excel
准备一个成绩表成绩表.xlsx:A 列姓名,B 列分数,共 3 行数据:

第 1 步:翻开笔记本(打开工作簿)
from openpyxl import load_workbook #从 openpyxl 库中拿出 load_workbook工具wb = load_workbook(r"D:\报表\成绩表.xlsx") # wb = workbook,整本表
同一个动作在VBA中写法:
Dim wb As WorkbookSet wb = Workbooks.Open("D:\报表\成绩表.xlsx")
Python 一行顶两行——Dim 声明、Set 赋值全省了。
第 2 步:翻到某一页(选工作表)
ws = wb.active # 当前打开的那一页# 或者按页签名精确选择:# ws = wb["Sheet1"]print(wb.sheetnames) # 看看本子共有哪几页# ['Sheet1', 'Sheet2']
VBA 里是 Set ws = wb.Worksheets("Sheet1")——连"按名字选页"这个操作都一脉相承,只差一个 Set。
第 3 步:读格子(取单元格的值)
print(ws["A2"].value) # 第 2 行 A 列 → 林鑫print(ws.cell(row=3, column=2).value) # 第 3 行 B 列 → 69
对照 VBA,几乎是同一个模子刻的:
Debug.Print ws.Range("A2").Value ' 林鑫Debug.Print ws.Cells(3, 2).Value ' 69(注意:先行后列)
三处细节两门语言完全一致:
"A2" 这种写法都是"列字母+行号",和 Excel 界面上看到的坐标一毛一样;
cell(row=3, column=2) 和 Cells(3, 2) 都是先行后列,参数顺序别搞反;
行列号都从 1 开始——注意这和 Python 列表从 0 开始是两套体系。
进阶一点:把整列读出来
for row in ws.iter_rows(min_row=2, values_only=True): # 从第 2 行开始逐行读name, score = rowprint(f"{name}:{score}分")
执行后结果:

VBA 里同样的活要配合计数器:
Dim i As LongFor i = 2 To ws.UsedRange.Rows.CountDebug.Print ws.Cells(i, 1).ValueNext i
差别在哪?VBA 得自己数"一共多少行"、自己维护下标 i;Python 的 iter_rows 直接把每一行喂给你,for 循环拿到一条处理一条——这就是"迭代器"的便利,上一章学过的 for 循环在这里原样复用。
三、完整对照表:VBA ↔ Python

一眼就能看出来:动作一一对应,Python 普遍更短。但真正拉开差距的不是写法,而是运行环境:
VBA 寄生在 Excel 里——必须开着 Excel,处理几百个文件就得开关几百次; Python 独立运行——不开 Excel 也能读表,批量处理上千个文件只是一层 for循环的事。
四、注意事项
⚠️ 1. .xls 老格式不认
openpyxl 只认 .xlsx(2007 之后的版本)。遇到 .xls 要么转格式,要么装对应引擎(xlrd 1.2.0 或 calamine)后再交给 pandas。VBA 则两种都能开——这是 Python 这边的小短板。
⚠️ 2. 文件路径要对
load_workbook("成绩表.xlsx") 找的是当前运行目录下的文件。文件在别处就写全路径,如 r"D:\报表\成绩表.xlsx"。找不到文件会报 FileNotFoundError,第一反应先查路径。
⚠️ 3. 文件正开着?读不了
Excel 程序正打开着这个文件时,Python 读取可能报 PermissionError——先把 Excel 关掉再跑代码。(VBA 反而没这问题,因为它就在 Excel 里面。)
⚠️ 4. 行列号从 1 开始——留神两套体系
cell(row=1, column=1) 才是第一个格子 A1,这和 VBA 的 Cells(1, 1) 一致,但和Python 列表从 0 开始是两套体系。写代码时脑子里要切换频道,最容易在这里栽跟头。
五、扩展一句:还有个"重量级选手"
等你处理的数据更复杂(筛选、求和、透视),可以认识一下 pandas 库——读 Excel 只要一行:
import pandas as pddf = pd.read_excel("成绩表.xlsx")
它把表格直接变成"数据框"对象,统计分析一行搞定。不过对初学者,先把 openpyxl 的"翻本子、找格子"玩熟,底层逻辑通了,pandas 上手就是水到渠成。
小结
一句话心法:Excel 是三层的——工作簿、工作表、单元格,VBA 和 Python 都是按这个顺序"翻页找字"。会 VBA 的人,把这些操作换个语法照搬就行;不会也没关系,这个模型本身就是最直观的 Excel 说明书。下一站:写入与合并,让 Python 不只是"看表",还能"造表"。















































































