python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python xlrd读取Excel

Python xlrd实现从读取Excel到高效数据提取的全面指南

作者:萧鼎

xlrd 是一个专门用于读取 Excel 文件内容的 Python 库,它支持从 Excel 工作簿中提取工作表(Sheet),单元格内容,数据类型等信息,下面小编就为大家详细介绍一下它的具体使用吧

一、前言:Excel 与 Python 的不解之缘

在数据处理与办公自动化领域,Excel 文件(.xls / .xlsx) 一直是最常见的数据载体。

而在 Python 世界中,围绕 Excel 操作的生态非常庞大,其中最经典、最轻量级的读文件库之一便是 —— xlrd

xlrd 是一个专门用于读取 Excel 文件内容的 Python 库,它支持从 Excel 工作簿中提取工作表(Sheet)、单元格内容、数据类型等信息。

虽然在新版本中它仅支持旧格式 .xls 文件,但凭借其简洁、高效和稳定的特点,xlrd 依然在许多老系统与数据迁移任务中被广泛使用。

二、库的起源与演变:从万能到专一

在早期的 Python Excel 生态中,xlrdxlwt(写入)是一对黄金搭档,配合使用可以轻松实现 Excel 的读写操作。

然而,自 xlrd 2.0.0 起,官方宣布:

不再支持 .xlsx 文件读取,仅支持 Excel 97-2003 格式 .xls

主要原因包括:

这也导致了后期许多项目迁移至 openpyxlpandas.read_excel()。不过,如果你面对的是历史系统、银行报表、政府旧数据,xlrd 仍然是最轻量可靠的解决方案。

三、安装与环境要求

1. 安装方式

pip install xlrd

2. 版本建议

如果你的 Excel 文件是 .xlsx 格式,请务必使用旧版本(≤1.2.0):

pip install xlrd==1.2.0

否则会遇到如下错误:

XLRDError: Excel xlsx file; not supported

3. 基本依赖

xlrd 只依赖标准库和 zipfile 模块,因此即使在嵌入式系统(如树莓派、Jetson Nano)上也能轻松运行。

四、核心对象结构分析

xlrd 的内部设计采用了典型的分层数据结构,理解这点有助于掌握其灵活性:

层级对象名称描述
1BookExcel 文件对象(工作簿)
2Sheet每个工作表
3Cell单元格对象(包含值与类型)
4XFRecord样式记录对象(字体、边框、格式等)

这种结构类似于文档树(Document Object Model),读取 Excel 时,xlrd 会逐级解析:

import xlrd

workbook = xlrd.open_workbook("data.xls")
sheet = workbook.sheet_by_index(0)
value = sheet.cell_value(0, 0)
print(value)

执行结果:

员工编号

五、主要API与使用方法详解

1. 打开 Excel 文件

import xlrd
book = xlrd.open_workbook("report.xls")

支持参数:

2. 获取工作表

# 通过索引
sheet = book.sheet_by_index(0)

# 通过名称
sheet = book.sheet_by_name('销售数据')

# 获取所有表名
print(book.sheet_names())

3. 获取单元格内容与属性

value = sheet.cell_value(1, 2)  # 第二行第三列
ctype = sheet.cell_type(1, 2)   # 数据类型

常见的 ctype 类型:

类型编号类型名含义
0XL_CELL_EMPTY空单元格
1XL_CELL_TEXT字符串
2XL_CELL_NUMBER数值
3XL_CELL_DATE日期
4XL_CELL_BOOLEAN布尔值
5XL_CELL_ERROR错误

4. 遍历所有数据

for row_idx in range(sheet.nrows):
    row = sheet.row_values(row_idx)
    print(row)

或者使用 get_rows()

for row in sheet.get_rows():
    print([cell.value for cell in row])

5. 日期类型的处理

Excel 内部使用浮点数存储日期,需要借助 xlrd.xldate_as_datetime() 进行转换:

from datetime import datetime
date_value = sheet.cell_value(2, 3)
date_obj = xlrd.xldate_as_datetime(date_value, book.datemode)
print(date_obj.strftime("%Y-%m-%d"))

六、实战案例:Excel 数据提取与分析

下面通过一个实际案例展示如何利用 xlrd 实现报表数据分析。

案例背景

某公司每月导出一份 sales_2024.xls 销售报表,包含以下字段:

日期产品销量单价地区
2024-01-01A类产品12030上海
2024-01-02B类产品8025北京

目标

步骤1:读取数据

import xlrd

book = xlrd.open_workbook('sales_2024.xls')
sheet = book.sheet_by_index(0)

data = []
for row_idx in range(1, sheet.nrows):
    row = sheet.row_values(row_idx)
    data.append(row)

步骤2:计算汇总

from collections import defaultdict

product_sales = defaultdict(float)
region_sales = defaultdict(float)

for row in data:
    product = row[1]
    sales = row[2] * row[3]
    region = row[4]
    product_sales[product] += sales
    region_sales[region] += sales

print("按产品统计:", dict(product_sales))
print("按地区统计:", dict(region_sales))

输出结果:

按产品统计: {'A类产品': 3600.0, 'B类产品': 2000.0}
按地区统计: {'上海': 3600.0, '北京': 2000.0}

步骤3:可视化展示(与 Matplotlib 结合)

import matplotlib.pyplot as plt

plt.bar(product_sales.keys(), product_sales.values())
plt.title("产品销售额对比")
plt.xlabel("产品")
plt.ylabel("销售额(元)")
plt.show()

这展示了 xlrd 在数据提取阶段的强大能力,与现代可视化库完美兼容。

七、性能优化与大文件读取

当 Excel 文件行数超过 10 万行时,内存开销会显著上升。

以下技巧可帮助提升性能:

1. 启用按需加载

book = xlrd.open_workbook('large.xls', on_demand=True)

仅在访问某个 Sheet 时加载数据,可显著节省内存。

2. 避免重复读取单元格对象

使用 row_values() 一次性获取整行数据,而非多次调用 cell_value()

3. 文件格式转换

若文件超过几百 MB,建议先用命令行或 pandas 转为 CSV 再分析:

import pandas as pd
df = pd.read_excel('large.xls', engine='xlrd')
df.to_csv('large.csv', index=False)

八、与其他库的比较

功能点xlrdopenpyxlpandas
支持文件格式.xls.xlsx.xls + .xlsx
读取速度快(小文件)稍慢中等
内存占用较低较高中等
写入能力
API 难度简单中等简单
适合场景老系统兼容、轻量提取现代 Excel 操作分析任务

总结:

九、深入源码:xlrd的解析机制

xlrd 的核心逻辑位于 book.pysheet.py 模块。其工作流程大致为:

核心函数结构如下:

def open_workbook(filename=None, file_contents=None, encoding_override=None, ...):
    bk = Book()
    bk.load(filename)
    return bk

Book 类中维护 sheets 列表,每个 Sheet 又包含 _cell_values 数组和 _cell_types 数组,用于快速索引。这种结构虽然不如 pandas 灵活,但胜在内存可控和结构清晰。

十、版本兼容与迁移策略

1. xlrd >= 2.0 不支持 .xlsx

对于 .xlsx 文件,请使用:

import pandas as pd
df = pd.read_excel('file.xlsx', engine='openpyxl')

2. 向下兼容旧系统

若必须兼容 .xls.xlsx

try:
    book = xlrd.open_workbook('data.xlsx')
except Exception:
    import openpyxl
    wb = openpyxl.load_workbook('data.xlsx')

3. 推荐替代方案

十一、实际应用案例:自动报表系统

在许多中小企业中,日报/周报 Excel 报表往往手动汇总。使用 xlrd 可实现自动提取并生成汇总结果。

示例流程:

import os, xlrd, xlwt

summary = xlwt.Workbook()
sheet_sum = summary.add_sheet('汇总')

row_index = 0
for file in os.listdir('./reports'):
    if file.endswith('.xls'):
        wb = xlrd.open_workbook(os.path.join('./reports', file))
        sh = wb.sheet_by_index(0)
        total = sum(sh.col_values(2)[1:])  # 第三列为销售额
        sheet_sum.write(row_index, 0, file)
        sheet_sum.write(row_index, 1, total)
        row_index += 1

summary.save('汇总结果.xls')

这就是最典型的办公自动化应用之一。

十二、常见错误与排查

错误类型说明解决方法
XLRDError: Excel xlsx file; not supported新版本不支持 .xlsx降级至 xlrd==1.2.0
FileNotFoundError文件路径错误检查路径、使用绝对路径
IndexError: list index out of rangeSheet 索引错误确认工作表存在
UnicodeDecodeError编码问题指定 encoding_override="gbk"

十三、与 Pandas 的结合:批量数据分析

pandasread_excel() 默认会使用 xlrd(旧版本),因此你可以结合两者快速分析数据:

import pandas as pd
df = pd.read_excel('report.xls', engine='xlrd')
print(df.describe())

对于 .xlsx 文件:

df = pd.read_excel('report.xlsx', engine='openpyxl')

十四、总结与展望

xlrd 虽然是一个“老派”库,但它依然具备以下优势:

在现代 Python 数据分析生态中,xlrd 更多地扮演**“稳定读取引擎”**的角色,而非“通用 Excel 工具”。

对于大多数历史数据处理、Excel 自动化迁移任务而言,它仍然是一款值得信赖的老朋友。

以上就是Python xlrd实现从读取Excel到高效数据提取的全面指南的详细内容,更多关于Python xlrd读取Excel的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文