使用 Python 实时更新 Excel sheet
Update an Excel sheet in real time using Python
有没有办法在 Excel 中打开时实时更新价差 sheet?我有一个名为 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 中打开,但想知道是否有其他方法或模块可用于在 sheet 打开时更新它。
您已经弄清楚为什么不能使用 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 程序员的。
您不能更改另一个应用程序正在使用的 Excel 文件,因为该文件格式不支持并发访问。
我实际上已经解决了这个问题,使用 xlwings 非常简单。以下代码打开名为 Example.xlsx 的现有 Excel 文件并实时更新它,在本例中,在您 运行 脚本后立即将值 45 放入单元格 B2 中。
import xlwings as xw
wb = xw.Book('Example.xlsx')
sht1 = wb.sheets['Sheet']
sht1.range('B2').value = 45
如果您想将实时数据从 Python 流式传输到 Excel,您可以使用 RTD 函数。如果您曾在 Excel 中使用 Bloomberg 插件访问实时市场数据,那么您将熟悉 RTD 函数。
在 Python 中为 Excel 编写 RTD 函数的最简单方法是使用 PyXLL。您可以在此处的文档中阅读如何操作:https://www.pyxll.com/docs/userguide/rtd.html
还有一个博客 post 展示了如何使用 Python 将实时推文流式传输到 Excel:https://www.pyxll.com/blog/a-real-time-twitter-feed-in-excel/
如果您想将 RTD 服务器写入 Excel 之外的 运行,您必须将其注册为 COM 服务器。 pywin32 包包含一个示例,说明如何执行此操作,但它仅适用于 2007 年之前的 Excel。对于 2007 及更高版本,您将需要此代码 https://github.com/pyxll/exceltypes 才能使该示例正常工作(请参阅该回购协议中 exceltypes/demos 中 pywin32 的修改示例。
有没有办法在 Excel 中打开时实时更新价差 sheet?我有一个名为 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 中打开,但想知道是否有其他方法或模块可用于在 sheet 打开时更新它。
您已经弄清楚为什么不能使用 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 程序员的。
您不能更改另一个应用程序正在使用的 Excel 文件,因为该文件格式不支持并发访问。
我实际上已经解决了这个问题,使用 xlwings 非常简单。以下代码打开名为 Example.xlsx 的现有 Excel 文件并实时更新它,在本例中,在您 运行 脚本后立即将值 45 放入单元格 B2 中。
import xlwings as xw
wb = xw.Book('Example.xlsx')
sht1 = wb.sheets['Sheet']
sht1.range('B2').value = 45
如果您想将实时数据从 Python 流式传输到 Excel,您可以使用 RTD 函数。如果您曾在 Excel 中使用 Bloomberg 插件访问实时市场数据,那么您将熟悉 RTD 函数。
在 Python 中为 Excel 编写 RTD 函数的最简单方法是使用 PyXLL。您可以在此处的文档中阅读如何操作:https://www.pyxll.com/docs/userguide/rtd.html
还有一个博客 post 展示了如何使用 Python 将实时推文流式传输到 Excel:https://www.pyxll.com/blog/a-real-time-twitter-feed-in-excel/
如果您想将 RTD 服务器写入 Excel 之外的 运行,您必须将其注册为 COM 服务器。 pywin32 包包含一个示例,说明如何执行此操作,但它仅适用于 2007 年之前的 Excel。对于 2007 及更高版本,您将需要此代码 https://github.com/pyxll/exceltypes 才能使该示例正常工作(请参阅该回购协议中 exceltypes/demos 中 pywin32 的修改示例。