比如我们有一个待刷新的Excel叫测试.xlsx
这里我们使用python控制Excel的应用来直接刷新相关页面:
- 传入的Excel路径需要是完整的路径,否则会提示找不到:
pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Microsoft Excel', '抱歉,无法找到 测试.xlsx。是否可能被移动、重命名或删除?', 'xlmain11.chm', 0, -2146827284), None)
- 使用
wb.RefreshAll()
进行刷新,老版本的程序是wb.refresh_all()
,而博主测试的时候使用的应该是wb.RefreshAll()
这个程序 - 刷新结束后等待一些时间,以便给程序更多时间,减少刷新一部分的概率
- 最后使用
wb.Save()
与xlApp.Quit()
保存并退出,如果意外退出程序而没有运行xlApp.Quit()
,需要进入控制台并关闭Excel的进程才行
其中,博主在定时任务中启动这个程序,会报错:pywintypes.com_error: (-2147221008, '尚未调用 CoInitialize。', None, None)
,为了解决这个问题,在调用Excel.Application前后使用pythoncom
(这个是win32com库安装时安装的,可以直接import)把启动的Excel包裹起来:
py
import pythoncom
pythoncom.CoInitialize()
xlApp = win32com.client.DispatchEx("Excel.Application")
# 对xlApp的各种操作
pythoncom.CoUninitialize()
最后打包成一个函数:
py
import os
import time
import pythoncom
import win32com.client
from loguru import logger
def refresh_excel(filepath, refresh_sleet=5):
"""刷新文件
:param filepath:文件名
:param refresh_sleet:刷新后等待时间(单位秒)
"""
logger.debug(f"读取文件:{filepath}")
pythoncom.CoInitialize()
parent = os.path.dirname(os.path.realpath(__file__)) # 确定文件的真实路径
xlApp = win32com.client.DispatchEx("Excel.Application")
wb = xlApp.Workbooks.Open(os.path.join(parent, filepath))
wb.RefreshAll()
logger.success(f"刷新完成 等待{refresh_sleet}s")
time.sleep(refresh_sleet)
wb.Save() # 保存原文件
xlApp.Quit()
pythoncom.CoUninitialize()
logger.debug(f"Excel刷新完成 {filepath}")
示例程序
py
import os
import time
import pythoncom
import win32com.client
from loguru import logger
def refresh_excel(filepath, refresh_sleet=5):
"""刷新文件
:param filepath:文件名
:param refresh_sleet:刷新后等待时间(单位秒)
"""
logger.debug(f"读取文件:{filepath}")
pythoncom.CoInitialize()
parent = os.path.dirname(os.path.realpath(__file__)) # 确定文件的真实路径
xlApp = win32com.client.DispatchEx("Excel.Application")
wb = xlApp.Workbooks.Open(os.path.join(parent, filepath))
wb.RefreshAll()
logger.success(f"刷新完成 等待{refresh_sleet}s")
time.sleep(refresh_sleet)
wb.Save() # 保存原文件
xlApp.Quit()
pythoncom.CoUninitialize()
logger.debug(f"Excel刷新完成 {filepath}")
def main():
excel = refresh_excel("测试.xlsx")
if __name__ == '__main__':
main()
刷新后的结果,会在控制台打印如下内容:
text
2023-12-19 17:03:20.705 | DEBUG | __main__:refresh_excel:13 - 读取文件:测试.xlsx
2023-12-19 17:03:24.614 | SUCCESS | __main__:refresh_excel:19 - 刷新完成 等待5s
2023-12-19 17:03:29.667 | DEBUG | __main__:refresh_excel:23 - Excel刷新完成 测试.xlsx