pandas DataFrame写入xlsm指定sheet时报[Content_Types].xml错误如何解决
错误原因
这个KeyError的核心是你要加载的test.xlsm不是合法的启用宏Excel文件,缺少OOXML格式要求的必备配置文件[Content_Types].xml,常见触发场景:
- 该文件是直接修改xlsx/其他格式文件后缀得到的,没有通过Excel正规另存为xlsm格式
- 文件已经被损坏,比如之前运行代码时文件被Excel/WPS占用,强行保存破坏了压缩包结构
- openpyxl版本过低,对xlsm格式的兼容存在bug
- 你试图用openpyxl直接创建新的xlsm文件,openpyxl不支持直接生成xlsm,只能编辑已有的合法xlsm模板
解决方案
第一步 先验证源文件合法性
- 手动用Excel/WPS打开
test.xlsm,确认可以正常访问、没有文件损坏提示,如果打不开直接替换为正常创建的xlsm文件 - 确认运行代码时,
test.xlsm没有被任何其他程序打开占用 - 提前备份原xlsm文件,避免代码运行出错损坏原始数据
第二步 升级依赖+修正代码
先升级openpyxl到最新版本:
pip install --upgrade openpyxl
修正后的参考代码:
from openpyxl.utils.dataframe import dataframe_to_rows import pandas as pd from openpyxl import load_workbook import shutil # 先备份原文件,防止损坏 shutil.copy2('test.xlsm', 'test_backup.xlsm') prices = pd.DataFrame({ 'name': ['Fred', 'Jane', 'Alice', 'Margaret'], 'street': ['Baker Street', 'Downing Street', 'Baker Street', 'Castle Street'], 'stamp': ['', 'T03', '', ''], 'city': ['', 'London', '', ''], 'other irrelevant columns for this task' : [1, 2, 3, 4] }) # 加载xlsm必须加keep_vba=True参数 book = load_workbook('test.xlsm', keep_vba=True) # 可指定写入的工作表,比如ws = book['你要写入的工作表名'] ws = book.active rows = dataframe_to_rows(prices, index=False, header=True) for r_index, row in enumerate(rows, 1): for c_index, value in enumerate(row, 1): ws.cell(row=r_index, column=c_index, value=value) # 保存后关闭工作簿 book.save('test.xlsm') book.close()
内容的提问来源于stack exchange,提问作者Paulina
相关产品推荐
相关产品推荐

