使用 Python 实时更新 Excel 工作表



有没有办法在Excel中打开电子表格时实时更新电子表格?我有一个名为 Example.xlsx 的工作簿,它在 Excel 中打开,我有以下 python 代码,它尝试使用字符串"ID"更新单元格 B1:

import openpyxl
wb = openpyxl.load_workbook('Example.xlsx')
sheet = wb['Sheet']
sheet['B1'] = 'ID'
wb.save('Example.xlsx')

在运行脚本时,我收到此错误:

PermissionError: [Errno 13] Permission denied: 'Example.xlsx'

我知道这是因为该文件当前在 Excel 中打开,但想知道是否有另一种方法或模块可用于在打开时更新工作表。

我实际上已经弄清楚了这一点,使用 xlwing 非常简单。以下代码打开一个名为 Example.xlsx 的现有 Excel 文件并实时更新它,在这种情况下,运行脚本后立即在单元格 B2 中输入值 45。

import xlwings as xw
wb = xw.Book('Example.xlsx')
sht1 = wb.sheets['Sheet']
sht1.range('B2').value = 45

您已经弄清楚了为什么不能使用openpyxl写入.xlsx文件:当 Excel 打开它时,它被锁定。不能直接写入它,但可以使用win32com与通过其 COM 接口运行的 Excel 副本进行通信。

您可以从 https://github.com/mhammond/pywin32 下载win32com

像这样使用它:

from win32com.client import Dispatch
xlApp = Dispatch("Excel.Application")
wb=xlApp.Workbooks.Item("MyExcelFile.xlsx")
ws=wb.Sheets("MyWorksheetName")

此时,ws是对可以更改的工作表对象的引用。你得到的对象不是Python对象,而是VBA对象的薄Python包装器,这些对象遵循自己的约定,而不是Python的。

这里有一些有用的,如果相当旧的面向Python的文档:http://timgolden.me.uk/pywin32-docs/contents.html

这里有对象模型的完整文档:https://msdn.microsoft.com/en-us/library/wss56bz7.aspx 但请记住,它是针对 VBA 程序员的。

如果要将实时数据从Python流式传输到Excel中,可以使用RTD函数。如果您曾经使用彭博加载项用于访问Excel中的实时市场数据,那么您将熟悉RTD函数。

在 Python 中为 Excel 编写 RTD 函数的最简单方法是使用 PyXLL。您可以在此处的文档中阅读如何执行此操作:https://www.pyxll.com/docs/userguide/rtd.html

还有一篇博客文章展示了如何使用Python将实时推文流式传输到Excel中:https://www.pyxll.com/blog/a-real-time-twitter-feed-in-excel/

如果要编写要在Excel外部运行的RTD服务器,则必须将其注册为COM服务器。pywin32 包包含一个示例,演示如何执行此操作,但它仅适用于 2007 之前的 Excel。对于 2007 及更高版本,您将需要此代码 https://github.com/pyxll/exceltypes 以使该示例正常工作(请参阅该存储库中的 exceltypes/demos 中 pywin32 的修改示例)。

无法更改其他应用程序正在使用的 Excel 文件,因为文件格式不支持并发访问。

最新更新