新项目必须用openpyxl,因xlrd已停更、不支持.xlsx、有安全风险且仅能读.xls;openpyxl支持读写、样式、公式、日期及大文件优化,生态活跃稳定。

因为 xlrd 已停更、不支持 .xlsx、不能写、有安全风险,而 openpyxl 是当前唯一能稳定读写现代 Excel 格式的主力库。
xlrd 读 .xlsx 会直接报错 Unsupported format, or corrupt file
xlrd 2.0.0+ 版本彻底移除了对 .xlsx 的支持,哪怕你装的是 xlrd==2.0.1,传入 "data.xlsx" 也会抛出 Unsupported format, or corrupt file。这不是配置问题,是硬性限制——它只认 .xls 文件头。如果你拿到的文件后缀是 .xlsx,但实际是另存为的旧格式(比如 Excel 2003 兼容模式),xlrd 仍可能失败,因为文件结构已变。
- 验证方法:用
file data.xlsx(Linux/macOS)或 PowerShell 中Get-Item "data.xlsx" | Get-Content -Encoding Byte -TotalCount 8 | ForEach-Object { $_.ToString("X2") }查看前 8 字节,.xlsx 应以50 4B 03 04开头(ZIP 签名),xlrd 完全不处理这个 - 常见误操作:用
pip install xlrd自动装最新版,结果在 Python 3.12 环境下连 import 都失败 - 替代方案:真要读 .xls,必须锁定
xlrd==1.2.0,且该版本存在 CVE-2020-15939 远程代码执行漏洞,不建议用于不可信文件
openpyxl 支持读写、样式、公式、多 sheet,xlrd 只能读纯数据
xlrd 的定位就是“只读 .xls”,它连单元格边框、字体颜色、合并区域这些基础格式都只能读取有限信息,更别说写入。openpyxl 则从设计上就覆盖完整生命周期:load_workbook() 读、Workbook() 新建、ws['A1'] = ... 写、wb.save() 保存,还能控制 Font、PatternFill、Border、Formula。
诊断并修复涉及公式、命名范围、Power Query 刷新、数据透视表、VBA/宏保存等问题的 Microsoft Excel XLSX 工作簿
- 公式处理差异明显:xlrd 读
cell_value返回公式字符串(如"=SUM(A1:A10)"),openpyxl 默认也一样;但 openpyxl 可加data_only=True参数直接读计算结果(注意:这会丢掉公式本身) - 日期类型更可靠:xlrd 读日期需手动调
xldate_as_datetime(cell_value, book.datemode),openpyxl 默认返回datetime对象(前提是 Excel 单元格格式设为“日期”) - 大文件可启用
read_only=True模式,内存占用比 xlrd 读 .xls 还低,尤其适合只遍历不修改的场景
新项目必须用 openpyxl,混用 xlrd + openpyxl 极易出格式错误
有人想“用 xlrd 读老表,转成 DataFrame 再用 openpyxl 写新表”,看似合理,但实际埋雷:xlrd 读出的数字类型(如 float)可能带多余小数位,写入 openpyxl 后触发 Excel 自动格式转换;xlrd 读出的空单元格是 "" 或 None,openpyxl 写入时若没显式判断,会变成 0 或空白字符串,破坏原始语义。
立即学习“Python免费学习笔记(深入)”;
- 正确做法:统一用
pandas.read_excel()读(它会根据后缀自动选引擎),再用pandas.ExcelWriter(engine="openpyxl")写,中间所有逻辑走 DataFrame,避免底层对象混杂 - 如果必须保留格式细节(比如条件格式、图表),就不能绕过 openpyxl 直接操作 —— pandas 不管这些,它只管数据
- xlrd 和 openpyxl 的行列索引起点一致(都是 0 起始),但单元格坐标语法不同:xlrd 用
sheet.cell_value(row, col),openpyxl 用ws.cell(row=row, column=col).value或ws["A1"].value,混写容易漏参数或写反顺序
真正麻烦的不是语法差异,而是 xlrd 的生态已经冻结:没人修 bug、不兼容新版 Python、不支持新 Excel 功能。openpyxl 虽然写起来稍 verbose,但它能跑、能扩、能维护——这才是工程落地的关键。

















