Python通过COM操作Excel时执行关闭工作簿语句报错
问题:win32com操作Excel时无法关闭工作簿并抛出com_error错误
使用Python的win32com.client库操作Excel时,执行关闭工作簿的语句失败,抛出如下错误。以下是代码及报错信息,需要实现正常关闭工作簿的功能:
原代码
import win32com.client as win32 excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible= True excelApl = excel.Application.Workbooks.Open ("C:\Technical\AutomationScripts\TestExcelCOM.xlsx") a = excelApl.Worksheets("Sheet1").Range("A2").Value = "Stay with me" a = excelApl.Worksheets("Sheet1").Range("A2").Value print(a) a = excelApl.Worksheets("Sheet1").Range("A2").Value = "Hello" print(a) excel.Application.Workbooks("C:\Technical\AutomationScripts\TestExcelCOM.xlsx").Close
报错信息
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147352565), None) >>> Stay with me Hello Traceback (most recent call last): File "C:\Program Files\Python39\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 363, in RunScript exec(codeObject, __main__.__dict__) File "C:\Technical\AutomationScripts\Testscript.py", line 13, in <module> excel.Application.Workbooks("C:\Technical\AutomationScripts\TestExcelCOM.xlsx").Close File "C:\Users\jpillai1\AppData\Local\Temp\gen_py\3.9\00020813-0000-0000-C000-000000000046x0x1x9\Workbooks.py", line 198, in __call__ ret = self._oleobj_.InvokeTypes(0, LCID, 2, (13, 0), ((12, 1),),Index pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147352565), None) >>>
问题原因及修正方案
问题点:
- 路径转义错误:Windows路径中的
\是转义字符,直接使用会导致路径解析异常,需改为\\或使用原始字符串r""。 - Workbooks集合引用错误:通过
Workbooks()引用工作簿时,参数应该是工作簿的文件名(如TestExcelCOM.xlsx),而非完整路径。 - 方法调用错误:
Close是方法,必须加括号Close()才能执行,直接写Close只是引用方法对象,不会触发关闭操作。
最优修正方案
直接使用之前打开工作簿时获取的excelApl对象调用Close(),无需重新通过路径查找,代码更简洁且避免路径相关问题:
import win32com.client as win32 # 使用原始字符串处理路径,避免转义问题 file_path = r"C:\Technical\AutomationScripts\TestExcelCOM.xlsx" excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = True # 打开工作簿并保存引用 excelApl = excel.Application.Workbooks.Open(file_path) # 修改单元格值 excelApl.Worksheets("Sheet1").Range("A2").Value = "Stay with me" print(excelApl.Worksheets("Sheet1").Range("A2").Value) excelApl.Worksheets("Sheet1").Range("A2").Value = "Hello" print(excelApl.Worksheets("Sheet1").Range("A2").Value) # 直接使用已有的工作簿对象关闭,可添加参数控制是否保存:Close(SaveChanges=True) excelApl.Close() # 可选:如果需要退出Excel程序,执行下面的语句 # excel.Quit()
另一种修正方式(通过文件名查找)
如果必须通过Workbooks集合查找,需使用文件名而非完整路径,同时修正路径转义和方法调用:
# 替换原关闭语句为: excel.Application.Workbooks("TestExcelCOM.xlsx").Close()
内容的提问来源于stack exchange,提问作者Joseph Stalin Pillai
相关产品推荐
相关产品推荐

