Python读取Excel单元格数据:openpyxl逐格取值详解
用openpyxl打开xlsx,按坐标或行列号读取单元格值、读取整行整列、遍历工作表全部数据,附完整代码和取值注意事项。
场景痛点
拿到一份几百行的销售表,需要把里面某些单元格抽出来核对,或者喂给下游系统。在 Excel 里肉眼看慢,复制粘贴容易漏行。用 openpyxl 打开文件,按坐标或按行列号读值,几行代码就能把整张表扫成 Python 列表,后续筛选、比对、入库都方便。
用到的库
pip install openpyxl
完整代码
from openpyxl import load_workbook
def demo_read(file_path: str) -> None:
# data_only=True:读取公式计算后的结果,而不是公式字符串本身
wb = load_workbook(file_path, data_only=True)
# 查看所有工作表名,再按名字取表
print("工作表列表:", wb.sheetnames)
ws = wb["Sheet1"] if "Sheet1" in wb.sheetnames else wb.active
# 1) 按坐标读单个单元格
cell = ws["B2"]
print("B2 的值:", cell.value, " 数据类型:", type(cell.value))
# 2) 按行列号读,row/column 从 1 开始
print("第3行第2列:", ws.cell(row=3, column=2).value)
# 3) 读一个矩形区域,返回元组的元组
for row in ws["A1:C3"]:
values = [c.value for c in row]
print(values)
# 4) 读整张表的有效数据,iter_rows 按行迭代
for row in ws.iter_rows(min_row=1, max_row=ws.max_row,
min_col=1, max_col=ws.max_column,
values_only=True):
print(row) # row 是一个元组,元素就是单元格的值
# 5) 把第一行当表头,其余行当数据,组装成字典列表
rows = list(ws.iter_rows(values_only=True))
headers = rows[0]
records = [dict(zip(headers, r)) for r in rows[1:] if any(v is not None for v in r)]
print("共读到", len(records), "条记录")
for rec in records[:3]:
print(rec)
wb.close()
if __name__ == "__main__":
demo_read(r"D:\reports\销售表.xlsx")
代码讲解
load_workbook(file_path, data_only=True)打开文件;data_only=True很重要,否则含公式的单元格拿到的是=SUM(...)这种字符串而不是结果。wb.sheetnames返回所有工作表名,wb.active是当前活动表,也可以用wb["Sheet1"]按名字取。ws["B2"].value按 A1 坐标取值;ws.cell(row=3, column=2)等价于 B3,注意行和列都从 1 开始,不是从 0 开始。ws["A1:C3"]切片得到一个二维元组,外层是行,内层是该行的单元格对象。iter_rows(values_only=True)直接返回值而不是单元格对象,配合max_row、max_column限定范围,性能最好。- 最后把表头和数据行
zip成字典,后续就能像处理 JSON 一样按字段名取数据。
运行结果
控制台先打印工作表名,再打印 B2 的值和类型,接着逐块打印 A1:C3 的内容和整张表,最后输出记录数和前三条字典。把 file_path 换成自己的文件即可。
注意事项
- openpyxl 只支持
.xlsx/.xlsm,老的.xls读不了,需要先另存。 - 没保存过、从未被 Excel 打开计算过的公式单元格,
data_only=True会拿到None,因为文件里没有缓存值。 - 大文件(几万行)不要用
ws["A1:C100000"]切片,直接用iter_rows流式读。 - 日期单元格读出来是
datetime.datetime对象,不是字符串,按业务需要自己strftime。 - 路径含中文或空格时,在 Windows 上用
r"..."原始字符串最稳。

更新时间:2026-09-15 09:02:16