
本文详解如何使用现代 pandas(≥2.0)兼容的 openpyxl 引擎,安全、高效地从现有 excel 文件中逐个读取所有工作表为 dataframe,并支持后续合并回新工作簿,彻底规避已弃用的 xlwt 和旧式 xls 引擎报错问题。
本文详解如何使用现代 pandas(≥2.0)兼容的 openpyxl 引擎,安全、高效地从现有 excel 文件中逐个读取所有工作表为 dataframe,并支持后续合并回新工作簿,彻底规避已弃用的 xlwt 和旧式 xls 引擎报错问题。
在 pandas 2.0+ 版本中,xlwt 引擎已被完全移除,且 .xls(Excel 97–2003 格式)默认不再受支持——这正是你遇到 ValueError: No engine for filetype: 'xls' 的根本原因。正确做法是统一使用 .xlsx 格式,并显式指定 openpyxl(读写)或 xlsxwriter(仅写)作为引擎。
✅ 推荐方案:用 pd.ExcelFile + sheet_name=None 一键读取全部工作表
最简洁、健壮的方式是利用 pd.ExcelFile 的 sheet_name=None 参数,它会自动将所有工作表读入一个字典,键为表名,值为对应 DataFrame:
import pandas as pd
# 1. 加载整个工作簿(自动推断引擎,推荐显式指定 engine='openpyxl')
excel_file = pd.ExcelFile('Workbook1.xlsx', engine='openpyxl')
# 2. 一次性读取全部工作表 → {sheet_name: DataFrame}
all_sheets = pd.read_excel(excel_file, sheet_name=None)
# 验证:查看所有表名
print("工作表列表:", list(all_sheets.keys()))
# 3. 按需访问单个 DataFrame(无需硬编码索引)
df_sheet1 = all_sheets['Sheet1'] # 推荐:用真实表名(区分大小写)
df_sheet2 = all_sheets['Data'] # 或 'data',取决于实际名称
⚠️ 注意:sheet_name=0, 1, 2 虽然可用,但极易出错——一旦工作表顺序变动或新增/删除表,索引就会错位。强烈建议优先使用表名(字符串)而非位置索引。
? 后续处理与保存:合并回新 Excel 文件
完成数据清洗、计算等操作后,可直接用 pd.ExcelWriter 将多个 DataFrame 写入同一 .xlsx 文件的不同工作表:
import time
# 假设已对各 df 完成处理(如 df_sheet1, df_sheet2, df_sheet3)
with pd.ExcelWriter(
f"New Workbook {time.strftime('%m-%d-%Y')}.xlsx",
engine='openpyxl' # 必须指定,尤其当写入多表时
) as writer:
df_sheet1.to_excel(writer, sheet_name="Processed_Sheet1", index=False)
df_sheet2.to_excel(writer, sheet_name="Processed_Sheet2", index=False)
df_sheet3.to_excel(writer, sheet_name="Summary", index=False)
? 关键避坑指南
- ❌ 不要再生成 .xls 文件(如 f"{sheet}.xls"),pandas 默认不支持写入该格式;
- ✅ 所有输入/输出统一使用 .xlsx,并确保安装 openpyxl:
pip install openpyxl
- ❌ 避免 pd.read_excel('file.xls') —— 即使文件存在,也会因缺少引擎失败;
- ✅ 若必须读 .xls(极少数遗留场景),需额外安装 xlrd==1.2.0(仅支持 ≤2013 版本),但强烈不推荐,应优先转换为 .xlsx;
- ✅ 使用 sheet_name=None 是最鲁棒的批量读取方式,比循环 sheet_names + read_excel(..., sheet_name=sheet) 更简洁、更少出错。
通过以上方法,你的脚本将完全兼容最新 pandas 生态,稳定运行于 Python 3.8+ 环境,且具备良好的可维护性与可读性。











