使用Xlwings保存带宏Excel时遇‘另一用户操作’报错求助
Xlwings保存带宏Excel文件时的文件占用报错解决
问题概况
操作包含宏的Excel文件时,通过Xlwings代码保存或手动保存均弹出「另一用户正在操作文档,请稍后重试」的错误,仅终止代码后才能正常保存。因其他文件依赖该文件的公式关联,无法通过重命名方式解决。已升级Xlwings至0.29.0,使用上下文管理器代码仍触发com_error报错。
已尝试的代码
with xl.App(visible=True) as app: wb = xl.Book(arquivo) wb.save()
报错信息
com_error Traceback (most recent call last) in 1 with xl.App(visible=True) as app: 2 wb = xl.Book(arquivo) ----> 3 wb.save() ~\Anaconda3\lib\site-packages\xlwings\main.py in save(self, path, password) 1145 path = utils.fspath(path) 1146 with self.app.properties(display_alerts=False): -> 1147 self.impl.save(path, password=password) 1148 1149 @property ~\Anaconda3\lib\site-packages\xlwings_xlwindows.py in save(self, path, password) 823 if (saved_path != "") and (path is None): 824 # Previously saved: Save under existing name --> 825 self.xl.Save() 826 elif ( 827 (saved_path != "") and (path is not None) and (os.path.split(path)[0] == "") ~\Anaconda3\lib\site-packages\xlwings_xlwindows.py in __call__(self, *args, **kwargs) 107 while True: 108 try: --> 109 v = self.__method(*args, **kwargs) 110 if isinstance(v, (CDispatch, CoClassBaseClass, DispatchBaseClass)): 111 return COMRetryObjectWrapper(v) ~\Anaconda3\lib\site-packages\win32com\client\dynamic.py in Save(self) com_error: (-2147352567, 'Exceção.', (0, 'Microsoft Excel', 'O método Save da classe Workbook falhou', 'xlmain11.chm', 0, -2146827284), None)
解决方法
- 清理残留Excel进程:打开任务管理器,结束所有未正常关闭的
EXCEL.EXE进程,消除进程对文件的锁定。 - 调整Xlwings启动参数:添加
add_book=False避免自动创建空白工作簿,同时关闭保存提示:with xl.App(visible=True, add_book=False) as app: app.display_alerts = False wb = xl.Book(arquivo) # 执行你的业务操作 wb.save() app.display_alerts = True - 显式释放COM资源:对于带宏的文件,手动关闭工作簿并强制释放COM对象,防止资源泄漏:
import xlwings as xl import win32com.client app = xl.App(visible=True, add_book=False) app.display_alerts = False wb = xl.Book(arquivo) # 执行操作 wb.save() # 关闭并释放 wb.close() app.quit() win32com.client.gc.collect() - 修改Excel信任设置:进入Excel「文件→选项→信任中心→信任中心设置」,勾选「信任对VBA工程对象模型的访问」,同时暂时关闭「受保护的视图」所有选项。
- 显式指定路径保存:如果默认
save()失效,尝试用save(path=arquivo)显式指定原路径,确保宏格式(.xlsm)保留。
内容的提问来源于stack exchange,提问作者Chris_PyCode
相关产品推荐
相关产品推荐

