如何在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ý
相关产品推荐
相关产品推荐

