使用pywin32保存前台已打开Excel文件时遇COM错误的技术求助
问题描述
- 需求:保存由其他应用生成且处于前台打开状态的Excel文件,执行类似
File->SaveAs的操作将数据写入磁盘 - 复现步骤:
- 打开Excel应用,默认窗口标题为
Book1 - Excel - 运行以下Python代码:
import win32com.client as win32 app = win32.gencache.EnsureDispatch('Excel.Application') app.Workbooks(1).SaveAs(r"C:\Users\test\Desktop\test.xlsx") app.Application.Quit()
- 打开Excel应用,默认窗口标题为
报错信息
Traceback (most recent call last): File "c:/Users/test/Downloads/automate_excel.py", line 6, in <module> ti = disp._oleobj_.GetTypeInfo() pywintypes.com_error: (-2147418111, 'Call was rejected by callee.', None, None) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "c:/Users/test/Downloads/automate_excel.py", line 6, in <module> app = win32.gencache.EnsureDispatch('Excel.Application') File "C:\Users\test\AppData\Local\Programs\Python\Python38\lib\site-packages\win32com\client\gencache.py", line 633, in EnsureDispatch raise TypeError( TypeError: This COM object can not automate the makepy process - please run makepy manually for this object
解决方案
1. 替换EnsureDispatch为Dispatch或GetActiveObject
gencache.EnsureDispatch会自动尝试生成类型库文件,易触发makepy报错。直接用Dispatch或GetActiveObject连接已运行的Excel实例更稳定:
import win32com.client as win32 # 方式1:使用Dispatch获取实例 app = win32.Dispatch('Excel.Application') # 方式2:精准获取已激活的Excel实例(推荐) # app = win32.GetActiveObject('Excel.Application') # 保存第一个工作簿 app.Workbooks(1).SaveAs(r"C:\Users\test\Desktop\test.xlsx") # 退出应用 app.Quit()
2. 调整Excel的COM交互设置
Call was rejected by callee报错多因Excel阻止外部COM调用,需调整以下设置:
- 打开Excel →「文件」→「选项」→「信任中心」→「信任中心设置」→「宏设置」,勾选「信任对VBA工程对象模型的访问」
- 切换到「高级」选项卡→「常规」区域,勾选「忽略使用动态数据交换(DDE)的其他应用程序」
- 确保Excel前台无弹出对话框(如保存提示、安全警告),否则会阻塞COM调用
3. 手动生成Excel类型库
按报错提示手动运行makepy生成类型库:
- 打开命令提示符,执行命令:
python -m win32com.client.makepy - 在弹出列表中找到
Microsoft Excel xx.x Object Library(xx.x对应你的Excel版本),选中后点击「确定」 - 重新运行Python代码即可
内容的提问来源于stack exchange,提问作者beachgreatsquaremoon
相关产品推荐
相关产品推荐

