You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3刷新Excel文件:处理第二个文件时出现COM错误

问题描述

我是Python新手,尝试编写函数刷新Excel文件内容,代码如下:

# function that refreshes files 
def refresh_file(file_to_refresh):

    excel = win32com.client.Dispatch("Excel.Application")
    excel.Visible = False
    workbook = excel.Workbooks.Open(file_to_refresh)
    workbook.RefreshAll()
    workbook.Save()
    excel.Quit()

refresh_file('C:\\Users\\michaelw\\Desktop\\Team Allocations\\Client Care - Liaison_dev.xlsx')
refresh_file('C:\\Users\\michaelw\\Desktop\\Team Allocations\\Client Care - ROR_dev.xlsx')

调用函数处理Client Care - Liaison_dev.xlsx完全正常,但处理第二个文件Client Care - ROR_dev.xlsx时出现以下错误:

Traceback (most recent call last):
  File "c:\Users\michaelw\Desktop\Team Allocations\Team_allocation.py", line 189, in <module>
    refresh_file('C:\\Users\\michaelw\\Desktop\\Team Allocations\\Client Care - ROR_dev.xlsx')
  File "c:\Users\michaelw\Desktop\Team Allocations\Team_allocation.py", line 120, in refresh_file
    workbook = excel.Workbooks.Open(file_to_refresh)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\michaelw\AppData\Local\Temp\gen_py\3.11\00020813-0000-0000-C000-000000000046x0x1x9\Workbooks.py", line 75, in Open
    ret = self._oleobj_.InvokeTypes(1923, LCID, 1, (13, 0), ((8, 1), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17)),Filename
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft Excel', 'Open method of Workbooks class failed', 'xlmain11.chm', 0, -2146827284), None)

请问该如何解决此问题?

解决方法

1. 彻底释放Excel COM资源

win32com调用Excel后,仅用Quit()经常没法彻底释放资源,残留进程会干扰后续文件操作。修改函数,加上强制释放逻辑:

import win32com.client
import pythoncom

def refresh_file(file_to_refresh):
    pythoncom.CoInitialize()  # 初始化COM环境
    excel = win32com.client.Dispatch("Excel.Application")
    excel.Visible = False
    try:
        workbook = excel.Workbooks.Open(file_to_refresh)
        workbook.RefreshAll()
        excel.CalculateUntilAsyncQueriesDone()  # 等所有异步刷新完成再保存
        workbook.Save()
    finally:
        workbook.Close()  # 先关闭工作簿
        excel.Quit()
        # 强制删除对象释放资源
        del workbook
        del excel
        pythoncom.CoUninitialize()  # 清理COM环境

2. 排查第二个文件的基础问题

  • 确认Client Care - ROR_dev.xlsx没被其他程序占用(比如手动打开后没关闭)
  • 路径改用原始字符串避免转义问题,比如写成r'C:\Users\michaelw\Desktop\Team Allocations\Client Care - ROR_dev.xlsx'
  • 手动打开这个文件,尝试手动刷新,排除文件损坏或格式异常

3. 复用Excel实例(优化方案)

每次调用函数新建Excel实例容易出问题,改用单个实例处理所有文件:

import win32com.client
import pythoncom

def refresh_files(file_list):
    pythoncom.CoInitialize()
    excel = win32com.client.Dispatch("Excel.Application")
    excel.Visible = False
    try:
        for file_path in file_list:
            workbook = excel.Workbooks.Open(file_path)
            workbook.RefreshAll()
            excel.CalculateUntilAsyncQueriesDone()
            workbook.Save()
            workbook.Close()
            del workbook
    finally:
        excel.Quit()
        del excel
        pythoncom.CoUninitialize()

# 使用示例
file_list = [
    r'C:\Users\michaelw\Desktop\Team Allocations\Client Care - Liaison_dev.xlsx',
    r'C:\Users\michaelw\Desktop\Team Allocations\Client Care - ROR_dev.xlsx'
]
refresh_files(file_list)

4. 检查Excel安全设置

如果文件包含外部数据连接(比如Power Query、数据库链接),Excel的安全策略可能阻止刷新:

  • 打开Excel,依次点击「文件」→「选项」→「信任中心」→「信任中心设置」
  • 在「外部内容」板块,设置允许外部数据连接的刷新操作

内容的提问来源于stack exchange,提问作者user5438246

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 20:46:34