使用Python实时更新Excel表格

12

在Excel中打开的情况下,有没有一种方法可以实时更新电子表格?我有一个名为Example.xlsx的工作簿在Excel中打开,并且我有以下Python代码尝试使用字符串“ID”更新单元格B1:

有没有办法在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中打开,但我想知道是否有另一种方法或模块可以在其打开时更新表格。

你可以尝试使用 Pyvot - zipa
如果您不需要在Excel中进行编辑,可以将其以只读方式打开。然后,您可以在Python中打开的同时向其写入内容。 - Balázs Kovacsics
@zipa 当然,让我来看看。 - West
@BalázsKovacsics 但如果我以只读方式打开它,我将无法保存任何内容。我已经尝试过了,仍然会出现相同的“权限被拒绝”错误。 - West
我自己没有用过一个合适的xls文件来尝试,但我在csv文件中遇到了类似的问题。如果它以只读方式在Excel中打开,Python可以将文件打开以进行写入和编辑。问题是,如果单元格数据来自外部连接(至少根据这个),Excel只能刷新单元格数据而不关闭和重新打开文件。因此,虽然它与导入的csv一起工作,但我不确定它是否会在这里起作用。 - Balázs Kovacsics
显示剩余2条评论
4个回答

21

我已经找出了方法,使用xlwings非常简单。以下代码打开名为Example.xlsx的现有Excel文件,并实时更新它,在这种情况下,只要您运行脚本,就会立即将值45放入单元格B2中。

import xlwings as xw

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

3
关于这个工具为什么能够实现功能,简单来说就是xlwings在后台(Windows系统上)使用了COM接口,因此支持实时更新。而其他工具,例如下文提到的openpyxl则使用了不同的方法,它会解压xlsx文件(一个zip文件),然后将数据导入空白的电子表格中。 - Joe

6
您已经了解了为什么无法使用openpyxl写入.xlsx文件:当Excel打开该文件时,它就被锁定了。虽然您无法直接进行写入操作,但可以通过COM接口使用win32com与正在运行的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程序员的。

谢谢。我实际上刚刚发现 xlwings 模块可以很简单地做到这一点。 - West
@West 你需要知道的是,xlwings是一个Python包装器,它使用完全相同的COM接口。因此,你从中获取的Excel对象与其他方式获取的对象一样容易或难以使用,因为它们的行为是相同的。 - BoarGules
没错,我明白了。不过当我使用你的代码示例时,我遇到了这个错误,而且我弄不清楚原因是什么:pywintypes.com_error: (-2147352567, '发生异常。', (0, None, None, None, 0, -2147352565), None) - West
“猜测”那可能是您尝试打开文件时出现的问题。我怀疑是文件路径的问题。无论如何,您已经有了一个可行的解决方案,这也是您在SO上发布帖子的原因。 - BoarGules

1
如果您想从Python向Excel中实时传输数据,可以使用RTD函数。如果您曾经使用过Bloomberg插件来访问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修改示例)。

请查看以下链接以获取视频演示:https://www.youtube.com/watch?v=wNRuB7QlcJo - grantr

0

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


1
这与文件格式无关,而是Excel程序在操作系统级别上获取了锁定,防止其他应用程序写入同一文件。某些其他应用程序(如HxD十六进制编辑器)可以愉快地打开Excel文件而不锁定它。 - John Y
阅读了规范后,我可以向您保证它与文件格式有关。在MacOS上,Excel不会受到锁定的影响。 - Charlie Clark
你试图通过MacOS语句说明什么?如果Excel在Mac上没有锁定文件,但在Windows上有锁定,则这将是每个证据表明文件格式并不重要,因为它在两个平台上都是相同的格式,但行为不同。除非你用“锁定”指的是其他内容。第二个程序能否打开并写入已在Mac上的Excel中打开的文件?如果可以,那么这再次证明文件格式在这里根本没有任何影响(实际上直接与您的答案相矛盾)。 - John Y
在Windows上,Excel会对文件进行独占锁定,但在其他主要的Excel可用的操作系统上并非如此。规范要求使用zip文件作为包格式,这些文件无法直接进行编辑,这就排除了并发编辑的可能性。但是,嘿,你肯定更懂,所以我期待着你的库。 - Charlie Clark
那么你的意思是Mac上的第二个程序不能编辑被Excel打开的文件吗? - John Y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接