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

如何在Excel文件打开时用Python修改并保存该文件

解决Excel文件打开状态下Python脚本无法写入的权限问题

问题场景

  • 用户已打开data.xlsx文件
  • 运行Python脚本读取该文件、写入内容并保存
  • 期望脚本完成后,用户能直接看到更新后的内容

当前使用的代码:

import openpyxl
import datetime

email_list_path = r"d:\test folder\data.xlsx"

wb = openpyxl.load_workbook(email_list_path)
seznam_adres = wb["mailing list"]

for i in range(2, 5 + 1):
    verze_emailu = seznam_adres.cell(row=i, column=6).value
    cas = datetime.datetime.now()
    seznam_adres.cell(row=i, column=5).value = cas.strftime('%x %X')

wb.save('data.xlsx')

报错信息

执行wb.save()时触发权限错误:

Traceback (most recent call last):
  File "D:\test folder\Send_email.py", line 141, in <module>
    wb.save('data.xlsx')
  File "D:\test folder\venv\lib\site-packages\openpyxl\workbook\workbook.py", line 386, in save
    save_workbook(self, filename)
  File "D:\test folder\venv\lib\site-packages\openpyxl\writer\excel.py", line 291, in save_workbook
    archive = ZipFile(filename, 'w', ZIP_DEFLATED, allowZip64=True)
  File "C:\Program Files\Python310\lib\zipfile.py", line 1249, in __init__
    self.fp = io.open(file, filemode)
PermissionError: [Errno 13] Permission denied: 'data.xlsx'

解决方案

核心原因是Excel打开文件时会独占锁定,导致其他程序无法直接写入原文件。提供两种可行方案:

方案1:保存为临时文件,提示用户替换

先将修改后的内容保存到临时文件,脚本结束后提示用户关闭原Excel文件,再替换原文件:

import openpyxl
import datetime
import os

email_list_path = r"d:\test folder\data.xlsx"
temp_path = r"d:\test folder\data_temp.xlsx"

wb = openpyxl.load_workbook(email_list_path)
seznam_adres = wb["mailing list"]

for i in range(2, 5 + 1):
    verze_emailu = seznam_adres.cell(row=i, column=6).value
    cas = datetime.datetime.now()
    seznam_adres.cell(row=i, column=5).value = cas.strftime('%x %X')

# 保存到临时文件
wb.save(temp_path)
print("临时文件已生成,请关闭Excel后执行以下命令替换原文件:")
print(f"move /Y {temp_path} {email_list_path}")

方案2:直接操控打开的Excel实例(Windows专属)

使用pywin32库直接连接当前打开的Excel进程,在文件打开状态下完成写入和保存,无需关闭文件。

首先安装依赖:

pip install pywin32

示例代码:

import win32com.client as win32
import datetime

excel = win32.gencache.EnsureDispatch('Excel.Application')
# 获取当前打开的目标工作簿
wb = excel.Workbooks("data.xlsx")
ws = wb.Worksheets("mailing list")

for i in range(2, 5 + 1):
    # 读取第6列数据
    verze_emailu = ws.Cells(i, 6).Value
    # 写入当前时间到第5列
    current_time = datetime.datetime.now().strftime('%x %X')
    ws.Cells(i, 5).Value = current_time

# 直接保存原文件
wb.Save()
# 刷新视图确保用户看到更新
wb.RefreshAll()

这种方式能直接在打开的Excel中完成写入和保存,用户无需关闭文件就能看到更新内容。


内容的提问来源于stack exchange,提问作者Petr Kopecký

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:08:09