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

如何在原文件更新时自动更新只读Excel工作簿/工作表?

用Python实现Excel文件变更自动同步到只读副本

作为刚入门Python不久、也跟Excel自动更新打过交道的过来人,我完全懂你用宏碰壁的无奈——宏不仅受Excel安全设置限制,还没法灵活处理网络驱动器上的文件监控。下面给你一套新手友好的Python方案,分两步搞定自动更新:

第一步:监控原Excel文件的修改

我们可以用watchdog这个轻量级库来实时监听网络驱动器上原文件的变化,它能精准捕捉到文件被修改的事件。

  1. 先安装库:
pip install watchdog
  1. 基础监控代码示例(注释写得很清楚,你直接改路径就行):
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import shutil
import time

# 替换成你的原文件路径和只读副本路径(网络路径用r'\\服务器名\共享文件夹\文件.xlsx')
SOURCE_FILE = r'\\your-server\shared-folder\original.xlsx'
TARGET_FILE = r'C:\大屏展示\readonly-copy.xlsx'

class ExcelUpdateHandler(FileSystemEventHandler):
    def on_modified(self, event):
        # 只处理我们关心的Excel文件,忽略Excel保存时生成的~$开头临时文件
        if not event.is_directory and event.src_path == SOURCE_FILE:
            print("检测到原文件更新,开始同步...")
            try:
                # 复制原文件覆盖只读副本,确保大屏显示最新内容
                shutil.copyfile(SOURCE_FILE, TARGET_FILE)
                print("同步完成!")
            except Exception as e:
                print(f"同步出错:{e}")

if __name__ == "__main__":
    event_handler = ExcelUpdateHandler()
    observer = Observer()
    # 监控原文件所在的文件夹,因为文件修改事件会触发文件夹变更
    observer.schedule(event_handler, path=SOURCE_FILE.rsplit('\\', 1)[0], recursive=False)
    observer.start()
    print(f"已开始监控原文件:{SOURCE_FILE}")
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

第二步:让大屏上的Excel自动刷新

如果大屏上的只读副本是一直打开状态,单纯替换文件内容可能不会自动刷新,这时候可以加一段控制Excel的代码:

  1. 先安装pywin32库(仅Windows系统可用,因为要调用Excel的COM接口):
pip install pywin32
  1. 修改上面的on_modified方法,加上刷新逻辑:
import win32com.client as win32

def on_modified(self, event):
    if not event.is_directory and event.src_path == SOURCE_FILE:
        print("检测到原文件更新,开始同步...")
        try:
            shutil.copyfile(SOURCE_FILE, TARGET_FILE)
            # 尝试刷新已打开的Excel文件
            excel = None
            try:
                excel = win32.GetActiveObject("Excel.Application")
                for workbook in excel.Workbooks:
                    if workbook.FullName == TARGET_FILE:
                        workbook.RefreshAll()
                        print("已刷新大屏上的Excel文件")
                        break
            except:
                # 如果Excel没打开,就自动打开只读副本
                excel = win32.Dispatch("Excel.Application")
                excel.Visible = True  # 让Excel显示在大屏上
                workbook = excel.Workbooks.Open(TARGET_FILE, ReadOnly=True)
                print("已自动打开最新的只读副本")
            finally:
                if excel:
                    excel = None
            print("同步完成!")
        except Exception as e:
            print(f"同步出错:{e}")

新手注意事项

  • 网络驱动器要确保脚本运行的电脑有读写权限(原文件至少只读,副本路径要可写)
  • 运行脚本时,尽量保持后台运行(可以把脚本打包成exe,用Windows任务计划自动启动)
  • Excel的安全设置要允许COM接口访问(如果遇到权限问题,右键Excel图标以管理员身份运行)

这个方案比宏灵活太多,而且代码都是基础的Python语法,你可以根据自己的需求慢慢调整,比如加上日志记录、邮件提醒之类的扩展功能~

内容的提问来源于stack exchange,提问作者superx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:48:33