xlwings操作xlsm偶发无响应、误关其他Excel及openpyxl保存报错求解
解决方案
xlwings问题修复(优先推荐,对xlsm兼容性最好)
问题根源
- 原有代码直接调用
xw.Book()会默认复用当前系统激活的Excel实例,如果该实例正处于用户编辑状态(比如单元格编辑未结束、有弹窗未处理),就会卡住无响应。 - 直接获取
xw.apps.active然后调用quit,会关闭用户正在使用的Excel实例,导致所有打开的文件都被关掉。
修正方案
核心逻辑是创建独立的Excel实例处理目标文件,和用户正在使用的Excel实例完全隔离,修正后代码如下:
import xlwings as xw file_path = 'C:/Users/ijung/Desktop/210919_Mk_Lot_test/210922_101test.xlsm' # 新建完全独立的Excel实例,和用户打开的Excel互不影响 app = xw.App(add_book=False, visible=False) app.display_alerts = False # 屏蔽系统弹窗,避免卡住代码 try: # 仅在当前独立实例中打开目标文件 wb_xl = app.books.open(file_path) ws_xl = wb_xl.sheets['Main'] ws_xl.range('A1').value = 'test' wb_xl.save() finally: # 仅关闭代码打开的工作簿 wb_xl.close() # 仅退出当前代码创建的独立实例,不会影响其他正在使用的Excel app.quit() # 兜底清理,避免后台残留Excel僵尸进程 app.kill()
openpyxl报错问题说明
xml.etree.ElementTree.ParseError报错是因为openpyxl对xlsm格式的兼容性有限,如果你的xlsm包含复杂VBA项目、ActiveX控件、自定义XML属性等Excel专有特性,openpyxl解析文件XML结构时会出错,没有通用的完美修复方案。如果一定要用openpyxl,可以尝试先将目标xlsm文件通过Excel手动另存一次,清除异常XML结构后再测试,但还是优先推荐xlwings方案,因为直接调用Excel原生接口,不存在兼容性问题。
内容的提问来源于stack exchange,提问作者LeeJunYoung
相关产品推荐
相关产品推荐

