Python控制Excel自动刷新页面

比如我们有一个待刷新的Excel叫测试.xlsx

这里我们使用python控制Excel的应用来直接刷新相关页面:

  1. 传入的Excel路径需要是完整的路径,否则会提示找不到:pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Microsoft Excel', '抱歉,无法找到 测试.xlsx。是否可能被移动、重命名或删除?', 'xlmain11.chm', 0, -2146827284), None)
  2. 使用wb.RefreshAll()进行刷新,老版本的程序是wb.refresh_all(),而博主测试的时候使用的应该是wb.RefreshAll()这个程序
  3. 刷新结束后等待一些时间,以便给程序更多时间,减少刷新一部分的概率
  4. 最后使用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
相关推荐
lancyu几秒前
关于多轮对话机器人的上下文Token优化和解决方案
人工智能·python·深度学习·机器学习·chatgpt·机器人·prompt
草莓橙子碗30 分钟前
Claude 使用指南
开发语言·python
工具分享39 分钟前
陪跑跟品爆单AI选品助手,高效跟品会赔本吗?
人工智能·python
COOLMO研究AI1 小时前
Python 如何实现 AI API 的提示词(Prompt)版本管理与热更新
人工智能·python·prompt
老郑聊AI业财智造1 小时前
Transformer 技术架构与源码分析
人工智能·python·深度学习·语言模型·架构·transformer·软件工程
程序员三藏1 小时前
自动化测试用例编写详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
230万光年的思念2 小时前
分子动力学模拟参考文献
python
HongXu_CaiYi2 小时前
0103-python相关-函数、文件
python
vortex53 小时前
从Conda到UV:Python项目依赖管理的现代演进
python·conda·uv
何以解忧,唯有..4 小时前
Python time 模块详解:时间处理与日期操作指南
开发语言·python