Python读取Excel文件:pandas与openpyxl库的选择与基础用法

Mason
Mason
发布时间:2026-11-04| 4人浏览过
原创

全面讲解Python读取Excel文件的核心方法,对比pandas与openpyxl库的设计定位与适用场景,提供完整的代码示例、常用参数详解、遍历技巧及避坑指南。

Python 实用教程
在Python中读取Excel表格文件,最主流的解决方案集中在 pandas 与 openpyxl 两个库上。本文的核心结论清晰直接:若目标是对整张二维数据表进行清洗、统计、汇总或构建分析模型,优先选择 pandas;若目标是精确定位单元格坐标、保留或调整字体边框等排版格式,或者读写原始公式字符串,则必须选择 openpyxl。
Python读取Excel文件:pandas与openpyxl库的选择与基础用法
图:pandas 与 openpyxl 在数据结构与应用场景上的核心定位划分

一、两个库的核心差异与技术选型依据

初学者在面对 Excel 文件(尤其是主流的 .xlsx 格式)时,常困惑于为何同一个需求既能搜到 pd.read_excel,又能搜到 load_workbook。根本原因在于两者的设计目标与底层数据模型完全不同。

pandas 是面向数据科学设计的分析库。它将 Excel 视作纯粹的“二维关系型数据表”,读取时自动把行列内容打包为 DataFrame 对象。在这一过程中,所有视觉修饰(包括单元格背景色、边框样式、字体大小、冻结窗格)都会被主动剥离,只保留结构化的行列值与列名。这赋予了 pandas 极高的批量统计与过滤效率。

openpyxl 则是严格遵循 Office Open XML 标准实现的文档对象模型(DOM)库。它把工作簿看作一棵完整的对象树(Workbook > Worksheet > Cell)。每一个单元格不仅是一个数值,还包含了数据类型、公式字符串、边框、填充以及批注。openpyxl 的优势在于“精准控制与格式保真”,但对逐个单元格的 Python 原生对象封装也带来了相对较高的内存与遍历开销。

Python读取Excel文件:pandas与openpyxl库的选择与基础用法
图1:根据具体业务目标选择合适工具库的判断路径
选型快速判定法则:
  • 选择 pandas:需要从表里提取数据、求均值、按字段分组(groupby)、过滤异常行,或者与其他数据表进行拼接(merge)。
  • 选择 openpyxl:需要在固定格式的报表模板里读取某个指定位置的数据(如仅读取 B3 与 F10),需要识别单元格公式(如 =SUM(A1:A10)),或者读取后还要带着原样排版样式回写并发送给他人。

二、运行环境准备与依赖关联

现代 Excel 的主流格式为 .xlsx。在 Python 环境中,pandas 在调用 read_excel() 处理 .xlsx 文件时,底层其实默认调用了 openpyxl 作为解析引擎。因此,最稳妥的实践是同时安装这两个库。

# 在终端或命令行环境安装必要依赖库
pip install pandas openpyxl

安装完成后,可在 Python 代码中分别导入模块:

import pandas as pd
from openpyxl import load_workbook
格式兼容性说明:

openpyxl 仅支持 Excel 2007 及更新版本的 .xlsx 和 .xlsm 文件,不支持老旧的二进制 .xls 格式(Excel 97-2003)。若确实需要读取老版本 .xls 文件,需要额外安装 xlrd(且仅限低版本支持)或在 Excel 软件中先转存为 .xlsx。

三、使用 pandas 读取 Excel 的基础用法与核心参数

使用 pandas 读取 Excel 的核心函数是 pd.read_excel()。默认情况下,只需传入文件路径即可快速加载数据:

import pandas as pd

# 最基础的读取方式:默认加载第一个工作表,并将首行作为列索引
df = pd.read_excel('sales_data.xlsx')

# 打印前 5 行数据(示例观察)
print(df.head())
Python读取Excel文件:pandas与openpyxl库的选择与基础用法
图2:pandas.read_excel 数据流转与参数控制图解

常用关键参数详解

现实中的 Excel 文件往往存在多表混合、首行说明文字、前导零字段被吞等问题。通过配置以下关键参数,可以实现对输入数据的精准把控:

参数名 典型取值示例 功能与解决的实际问题
sheet_name '2026年销售明细' 或 0 或 None 指定工作表。传入字符串按表名选;传入整数按索引选;传入 None 则把所有 Sheet 读取为一个包含多个 DataFrame 的字典。
usecols "A:D,F" 或 ['员工工号', '销售额'] 指定读取列。避免读取全表几十列无用字段,显著降低内存开销。
skiprows 2 或 [0, 1] 跳过表头前面的多余说明行。例如前两行是“公司内部保密资料”,从第3行才是列标题。
header 0 或 None 指定哪一行作为列名。若文件本身无表头,应设为 header=None。
dtype {'工号': str, '身份证号': str} 强制指定字段类型。防止以 0 开头的编号(如 00123)被自动推导为整数而丢失前导 0。
na_values ['暂无', '待补', '--'] 自定义缺失值映射。将表格中的特定业务占位字符直接解析为 NaN(缺失值)。

典型生产级读取代码示例

import pandas as pd

# 规范化加载:指定工作表、选取指定列、跳过顶部2行、强制指定文本类型
df = pd.read_excel(
    'sales_data.xlsx',
    sheet_name='11月明细',
    skiprows=2,
    usecols='B:F',
    dtype={'员工工号': str, '联系电话': str},
    na_values=['N/A', '--', '暂无']
)

# 数据加载后的质量校验
print("表格维度 (行数, 列数):", df.shape)
print("
各列字段与数据类型概览:")
df.info()

四、使用 openpyxl 读取 Excel 的基础用法与细节控制

当需要感知工作簿的元数据、提取特定单元格坐标、读取计算公式本身时,应当采用 openpyxl。openpyxl 遵循面向对象的层次化操作。

Python读取Excel文件:pandas与openpyxl库的选择与基础用法
图3:openpyxl 的对象层次结构与三种单元格读取模式

步骤一:加载工作簿与核心参数 data_only

读取工作簿使用 load_workbook() 函数。这里最关键的参数是 data_only:

  • data_only=False(默认):如果单元格中写有公式(如 =SUM(A1:A5)),读取到的是公式表达式字符串。
  • data_only=True:读取该单元格在 Excel 软件上一次保存时计算出的缓存结果值。
from openpyxl import load_workbook

# 载入工作簿,开启 data_only 获取计算值
wb = load_workbook('sales_data.xlsx', data_only=True)

# 查看全部工作表名称
sheet_list = wb.sheetnames
print("工作表列表:", sheet_list)

# 获取指定工作表或当前活动表
ws = wb['11月明细']  # 按照名称选取
# ws = wb.active  # 或直接选取当前活动工作表

步骤二:访问单元格的三种常用方法

1. 按 Excel 坐标直接访问:这是最符合人脑直觉的方式,适合读取离散的固定指标。

cell_a1 = ws['A1']
print("A1的值:", cell_a1.value)
print("A1的数据类型:", cell_a1.data_type)

2. 按行号列号数字访问(基于1起始):适合配合 for 循环按行列步进。

# 注意:openpyxl 的 row 和 column 索引都是从 1 开始的,区别于 Python 常规的 0 起始切片
val = ws.cell(row=3, column=2).value
print("第3行第2列的值:", val)

3. 使用 iter_rows 批量生成器遍历:处理整片数据区域时,iter_rows() 是性能最高、代码最优雅的方案。配合 values_only=True 可以跳过 Cell 对象封装,直接获取纯数值元组。

# 遍历读取第2行到第10行、第1列到第4列的数据
for row in ws.iter_rows(min_row=2, max_row=10, min_col=1, max_col=4, values_only=True):
    # 每一行都是一个 Python 原生元组,如 ('0102', '张敏', '华东区', 14200.0)
    print(row)

# 养成良好习惯:完成读取后关闭工作簿句柄
wb.close()

五、综合对比与生产环境避坑指南

Python读取Excel文件:pandas与openpyxl库的选择与基础用法
图4:pandas 与 openpyxl 核心特性综合对比矩阵与决策依据

常见问题排查与注意事项

  1. 问题一:openpyxl 读取带公式的单元格返回 None
    原因解释:设置了 data_only=True 时,openpyxl 并不会自行运行公式计算引擎,它读取的是 Excel 软件在上次保存文件时预存在 XML 缓存里的计算值。如果该文件是由某些第三方程序生成的,而从未在真实 Excel 中打开并点击“保存”,则该缓存值为空。
    解决办法:在 Microsoft Excel 或 WPS 中打开该文件并按 Ctrl+S 重新保存一次;若无需计算值,改用 data_only=False 读取原始公式。
  2. 问题二:工号、手机号、身份证号前面的“0”丢失
    原因解释:pandas 默认会根据列内数值尝试自动推断数据类型,纯数字组成的字符串容易被推断为 int64。
    解决办法:在 pd.read_excel 中明确通过 dtype={'字段名': str} 强制将其锁定为字符串类型。
  3. 问题三:超大 Excel 文件(数万行以上)读取缓慢甚至内存溢出
    原因解释:openpyxl 默认构建全部单元格对象树,极为消耗内存。
    解决办法:使用 openpyxl 时开启只读流模式:load_workbook(filename, read_only=True);或者使用 pandas 时利用参数 nrows 分段,或转向更底层的 calamine 引擎加速读取。
业务中的黄金组合模式:

在复杂的自动化报表开发中,pandas 与 openpyxl 并不是互斥的,而是互补的。成熟的工程实践通常是:“用 pandas 读取原始明细并进行高速汇总计算,再用 openpyxl 打开预先设计好品牌视觉与排版格式的 Excel 模板,将计算结果填入指定单元格后输出”。这样既兼顾了计算效率,又保留了专业精美的排版效果。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。