我的知识记录

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_rowmax_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"..." 原始字符串最稳。

Python读取Excel单元格数据:openpyxl逐格取值详解

标签:

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

上一篇:Python按某一列的值拆分Excel工作表

下一篇:Python pandas读取Excel文件:read_excel一键转DataFrame