如何用Python的xlwings获取Excel文件的写权限保留用户?
Excel文件占用检测及用户获取方案(解决xlwings WriteReservedBy返回异常问题)
问题背景
使用xlwings处理Excel时,通过wb.api.ReadOnly可以判断文件是否处于只读状态,但wb.api.WriteReservedBy在文件被他人打开且自身仅能只读访问时,返回的是当前用户而非实际占用用户,和手动打开文件时的提示不一致。
解决方案
方案一:不打开文件,检测Excel临时文件
Windows下Excel打开文件时会自动生成隐藏的临时文件(命名格式为~$文件名.xlsx),该文件包含占用用户的信息,可直接读取提取:
import os import re def get_excel_locker(file_path): dir_name = os.path.dirname(file_path) file_name = os.path.basename(file_path) temp_file = os.path.join(dir_name, f"~${file_name}") if not os.path.exists(temp_file): return None try: # 临时文件采用utf-16le编码 with open(temp_file, 'r', encoding='utf-16le') as f: content = f.read() # 正则匹配UserName字段提取用户 match = re.search(r'UserName="([^"]+)"', content) if match: return match.group(1) # 备用提取逻辑:适配不同Excel版本的临时文件结构 return content.split('\x00')[1].strip() if content else None except Exception as e: print(f"读取临时文件失败: {e}") return None # 使用示例 target_file = r"path\to\your\file.xlsx" lock_user = get_excel_locker(target_file) if lock_user: print(f"文件被用户 {lock_user} 占用") else: print("文件未被其他用户打开")
优缺点:
- 优点:无需启动Excel进程,速度快、资源占用低
- 缺点:依赖Windows系统的Excel临时文件机制;网络共享文件的临时文件存储在服务器端,需对应访问权限;不同Excel版本的临时文件结构可能存在差异
方案二:尝试可写打开,捕获错误信息中的用户
利用Excel尝试可写打开失败时的错误提示,提取实际占用用户的名称:
import xlwings as xw import pywintypes import re def check_excel_lock(file_path): app = xw.App(visible=False) app.display_alerts = False lock_user = None try: # 尝试以可写模式打开文件 wb = app.books.open(file_path, read_only=False) wb.close() except pywintypes.com_error as e: error_msg = str(e) # 匹配中文系统下的错误信息(可根据系统语言调整正则) match = re.search(r'用户([^\s]+)正在使用', error_msg) if not match: # 备用匹配英文系统的错误信息 match = re.search(r'by user ([^\s]+)', error_msg) if match: lock_user = match.group(1) finally: app.quit() return lock_user # 使用示例 target_file = r"path\to\your\file.xlsx" lock_user = check_excel_lock(target_file) if lock_user: print(f"文件被用户 {lock_user} 占用") else: print("文件未被其他用户打开")
优缺点:
- 优点:利用Excel自身的错误提示,准确性高,适配本地、网络共享等不同存储位置的文件
- 缺点:需要启动Excel进程,处理速度稍慢;错误信息格式需匹配系统语言
内容的提问来源于stack exchange,提问作者Archernar
相关产品推荐
相关产品推荐

