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

Written by

in

文章目录
  • 在数据处理与办公自动化领域,Excel 文件(.xls / .xlsx) 一直是最常见的数据载体。 而在 Python 世界中,围绕 Excel 操作的生态非常庞大,其中最经典、最轻量级的读文件库之一便是 —— xlrd。 xlrd 是一个专门用于读取 Excel 文件内容的 Python 库,它支持从 Excel 工作簿中提取工作表(Sheet)、单元格内容、数据类型等信息。 虽然在新版本中它仅支持旧格式 .xls 文件,但凭借其简洁、高效和稳定的特点,xlrd 依然在许多老系统与数据迁移任务中被广泛使用。
  • 在早期的 Python Excel 生态中,xlrd 和 xlwt(写入)是一对黄金搭档,配合使用可以轻松实现 Excel 的读写操作。 xlrd(read):读取 Excel 文件内容。 xlwt(write):写入 .xls 文件。 xlutils:基于二者实现的高级操作库(复制、修改工作表等)。 然而,自 xlrd 2.0.0 起,官方宣布: 不再支持 .xlsx 文件读取,仅支持 Excel 97-2003 格式 .xls。 主要原因包括: Excel 2007 之后的 .xlsx 文件是基于 XML + ZIP 的复杂结构,解析成本高; 已有更现代的库如 openpyxl 和 pandas 提供更好的支持; 维护者希望 xlrd 聚焦旧格式的稳定读取。 这也导致了后期许多项目迁移至 openpyxl 或 pandas.read_excel()。不过,如果你面对的是历史系统、银行报表、政府旧数据,xlrd 仍然是最轻量可靠的解决方案。
  • xlrd 的内部设计采用了典型的分层数据结构,理解这点有助于掌握其灵活性: 层级 对象名称 描述 1 Book Excel 文件对象(工作簿) 2 Sheet 每个工作表 3 Cell 单元格对象(包含值与类型) 4 XFRecord 样式记录对象(字体、边框、格式等) 这种结构类似于文档树(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) 执行结果: 员工编号
  • 下面通过一个实际案例展示如何利用 xlrd 实现报表数据分析。
  • 当 Excel 文件行数超过 10 万行时,内存开销会显著上升。 以下技巧可帮助提升性能:
  • 功能点 xlrd openpyxl pandas 支持文件格式 .xls .xlsx .xls + .xlsx 读取速度 快(小文件) 稍慢 中等 内存占用 较低 较高 中等 写入能力 无 有 有 API 难度 简单 中等 简单 适合场景 老系统兼容、轻量提取 现代 Excel 操作 分析任务 总结: 如果你只需读取 .xls 文件:选 xlrd。 如果需要写入或支持 .xlsx:用 openpyxl。 如果需要快速分析:用 pandas.read_excel()。
  • xlrd 的核心逻辑位于 book.py 与 sheet.py 模块。其工作流程大致为: 打开文件 → 识别格式(OLE2 vs XML) 解析 Workbook → Sheet → Cell 建立数据缓存与索引表 提供 Pythonic API 封装访问 核心函数结构如下: 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 灵活,但胜在内存可控和结构清晰。
  • 在许多中小企业中,日报/周报 Excel 报表往往手动汇总。使用 xlrd 可实现自动提取并生成汇总结果。 示例流程: 扫描 ./reports 文件夹下所有 .xls 文件 读取每个文件中的“销售额”数据 汇总后生成一份统计表(通过 xlwt 写出) 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 range Sheet 索引错误 确认工作表存在 UnicodeDecodeError 编码问题 指定 encoding_override="gbk"
  • pandas 的 read_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 虽然是一个“老派”库,但它依然具备以下优势: 轻量级、稳定性高 适合服务器端、嵌入式环境 兼容老式 Excel 格式 代码简单易嵌入脚本 在现代 Python 数据分析生态中,xlrd 更多地扮演**“稳定读取引擎”**的角色,而非“通用 Excel 工具”。 对于大多数历史数据处理、Excel 自动化迁移任务而言,它仍然是一款值得信赖的老朋友。 以上就是Python xlrd实现从读取Excel到高效数据提取的全面指南的详细内容,更多关于Python xlrd读取Excel的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: Python自动化操作Excel的多种方式(Pandas+openpyxl+xlrd) Python使用xlrd轻松读取Excel文件的示例代码 Python使用xlrd模块实现操作Excel读写的方法汇总 Python如何使用xlrd和xlwt库读写excel文件 使用Python第三方库xlrd读取Excel中的数据的流程步骤 使用Python的xlrd和xlwt操作Excel详解 利用Python第三方库xlrd读取Excel中数据实例代码
  • 目录
    • 一、前言:Excel 与 Python 的不解之缘
    • 二、库的起源与演变:从万能到专一
    • 三、安装与环境要求
      • 1. 安装方式
      • 2. 版本建议
      • 3. 基本依赖
    • 四、核心对象结构分析
      • 五、主要API与使用方法详解
        • 1. 打开 Excel 文件
        • 2. 获取工作表
        • 3. 获取单元格内容与属性
        • 4. 遍历所有数据
        • 5. 日期类型的处理
      • 六、实战案例:Excel 数据提取与分析
        • 案例背景
        • 目标
      • 七、性能优化与大文件读取
        • 1. 启用按需加载
        • 2. 避免重复读取单元格对象
        • 3. 文件格式转换
      • 八、与其他库的比较
        • 九、深入源码:xlrd的解析机制
          • 十、版本兼容与迁移策略
            • 1. xlrd >= 2.0 不支持 .xlsx
            • 2. 向下兼容旧系统
            • 3. 推荐替代方案
          • 十一、实际应用案例:自动报表系统
            • 十二、常见错误与排查
              • 十三、与 Pandas 的结合:批量数据分析
                • 十四、总结与展望

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

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

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

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

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

                  • xlrd(read):读取 Excel 文件内容。
                  • xlwt(write):写入 .xls 文件。
                  • xlutils:基于二者实现的高级操作库(复制、修改工作表等)。

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

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

                  主要原因包括:

                  • Excel 2007 之后的 .xlsx 文件是基于 XML + ZIP 的复杂结构,解析成本高;
                  • 已有更现代的库如 openpyxlpandas 提供更好的支持;
                  • 维护者希望 xlrd 聚焦旧格式的稳定读取。

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

                  pip install xlrd
                  

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

                  pip install xlrd==1.2.0
                  

                  否则会遇到如下错误:

                  XLRDError: Excel xlsx file; not supported

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

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

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

                  这种结构类似于文档树(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)
                  

                  执行结果:

                  员工编号

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

                  支持参数:

                  • filename: 文件路径
                  • file_contents: 二进制字节流
                  • encoding_override: 指定编码(如 GBK)
                  • on_demand: 是否懒加载(节省内存)
                  • ragged_rows: 是否允许行列不对齐

                  # 通过索引
                  sheet = book.sheet_by_index(0)
                  
                  # 通过名称
                  sheet = book.sheet_by_name('销售数据')
                  
                  # 获取所有表名
                  print(book.sheet_names())
                  

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

                  常见的 ctype 类型:

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

                  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])
                  

                  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"))
                  

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

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

                  日期 产品 销量 单价 地区
                  2024-01-01 A类产品 120 30 上海
                  2024-01-02 B类产品 80 25 北京

                  • 计算各产品的总销售额
                  • 输出每个地区的总销售额分布

                  步骤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 万行时,内存开销会显著上升。

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

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

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

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

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

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

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

                  总结:

                  • 如果你只需读取 .xls 文件:选 xlrd。
                  • 如果需要写入或支持 .xlsx:用 openpyxl。
                  • 如果需要快速分析:用 pandas.read_excel()。

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

                  • 打开文件 → 识别格式(OLE2 vs XML)
                  • 解析 Workbook → Sheet → Cell
                  • 建立数据缓存与索引表
                  • 提供 Pythonic API 封装访问

                  核心函数结构如下:

                  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 灵活,但胜在内存可控和结构清晰。

                  对于 .xlsx 文件,请使用:

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

                  若必须兼容 .xls.xlsx

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

                  • 读取 .xlsxlrd
                  • 写入 .xlsxlwt
                  • 读取/写入 .xlsxopenpyxl
                  • 分析型任务:pandas

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

                  示例流程:

                  • 扫描 ./reports 文件夹下所有 .xls 文件
                  • 读取每个文件中的“销售额”数据
                  • 汇总后生成一份统计表(通过 xlwt 写出)
                  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 range Sheet 索引错误 确认工作表存在
                  UnicodeDecodeError 编码问题 指定 encoding_override="gbk"

                  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 虽然是一个“老派”库,但它依然具备以下优势:

                  • 轻量级、稳定性高
                  • 适合服务器端、嵌入式环境
                  • 兼容老式 Excel 格式
                  • 代码简单易嵌入脚本

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

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

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

                  您可能感兴趣的文章:

                  • Python自动化操作Excel的多种方式(Pandas+openpyxl+xlrd)
                  • Python使用xlrd轻松读取Excel文件的示例代码
                  • Python使用xlrd模块实现操作Excel读写的方法汇总
                  • Python如何使用xlrd和xlwt库读写excel文件
                  • 使用Python第三方库xlrd读取Excel中的数据的流程步骤
                  • 使用Python的xlrd和xlwt操作Excel详解
                  • 利用Python第三方库xlrd读取Excel中数据实例代码

                  站内搜索