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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:13:10