【问题标题】:Library to extract data from open Excel workbooks从打开的 Excel 工作簿中提取数据的库
【发布时间】:2019-08-16 14:39:30
【问题描述】:

我正在尝试从已打开的工作簿中提取数据。

我找到了xlrd library,但您似乎只能将它与通过 Python 打开的工作簿一起使用。我将在项目中使用的工作簿已打开,因此此方法无法使用。

我找到的第二个库是OpenPyxl,它只为我返回错误,即使工作簿是打开的:

from openpyxl import load_workbook

wb = load_workbook(filename = 'Components V2.4.3.xlsm')

返回:

FileNotFoundError: [Errno 2] No such file or directory: 'Components V2.4.3.xlsm'

最后,我使用了win32com.clientDispatch,我无法从中获取单元格值,因此我正在寻找替代方案。

我对@9​​87654326@ 做错了什么,或者我可以使用其他方法吗?

【问题讨论】:

  • 你能传递一个包含一个工作簿示例的链接吗?
  • “工作簿已打开”是什么意思?您的意思是电子表格在 Excel 中打开?您是否尝试在 Excel 关闭时阅读电子表格?电子表格是否需要“打开”?
  • @SomeGuyOnAComputer 没错,一个 Excel 实例已打开,其中包含需要读取的电子表格。电子表格需要打开,以防止没有经验的用户混淆步骤
  • @rusu_ro1 我看不出这会增加什么问题。任何常规工作簿都可以:它们只包含一些常规数据,没有图像/表格等。

标签: python excel python-3.x pycharm


【解决方案1】:

打开当前在 Excel 中打开的工作簿 test.xlsx,并读取第一个工作表的单元格 A1 中的值:

from win32com.client import GetObject
xl = GetObject(None, "Excel.Application")
wb = xl.Workbooks("test.xlsx")
ws = wb.Sheets(1)
ws.Cells(1, 1).Value

将范围读取为元组的元组:

ws.Range("A1:D4").Value

写回一些值:

ws.Range("A1:D4").Value = [[16, 3, 2, 13], [5, 10, 11, 8], [9, 6, 7, 12], [4, 15, 14, 1]]

对 cme​​ts 的回答:COM (Component Object Model),有时也称为“自动化”,它允许 Windows 应用程序提供“COM 服务器”,它可以访问它的某些 API,可以从“ COM 客户端”。 Excel 有这样的服务器(而 VBA 有一个客户端:您可以使用 VBA 中的 CreateObjectGetObject)。

其他应用程序通过 COM 提供类似的服务:例如MATLABSASStata,以及 Microsoft Office 的所有应用程序。

Python 有一个带有pywin32 的客户端。您也可以使用 Pywin32 开发服务器,例如:Portable Python com server using pywin32

请注意,就 Excel 而言,正如您所注意到的,您可以访问大部分对象层次结构,并非常精确地控制 Excel 的行为。基本上,如果您可以在 VBA 中执行此操作,则可以从任何 COM 客户端执行此操作。


关于范围的最后一行,我不确定我是否理解您想要的内容。是不是这个:Excel VBA Find last row in range


还有几点:

如果 Excel 尚未打开,您仍然可以打开与 Excel 的连接。在 VBA 中执行此操作的函数是 CreateObject 而不是 GetObject,但在 Python 中是 Dispatch:

from win32com.client import Dispatch
xl = Dispatch("Excel.Application")
xl.WorksheetFunction.Gamma(0.5)

在 VBA 中,您经常会使用 Excel“常量”,例如 xlUp。它们也可以在 Python 中使用(开始与 Excel 的连接,使用 GetObject 或 Dispatch):

from win32com.client import constants as const
const.xlUp

要连接到计算机上安装的 COM 服务器,您需要获取对象的名称。以下是几种情况:

对于 Microsoft Office:

常用于 VBScript:

专业软件:

  • Matlab.Application
  • SAS.Application
  • stata.StataOLEApp

最后一句话:正如here 解释的那样,您可以在安装它的目录([Pythonpath]\Lib\site-packages\PyWin32.chm)中找到 Pywin32 的文档,也可以在此处的网络上找到:http://timgolden.me.uk/pywin32-docs/contents.html

【讨论】:

  • 非常有用的信息,如果可以,我会再次投票。
  • @user10307643 如果有多个 Excel 实例在运行怎么办?无论哪个实例拥有工作簿,您的解决方案是否仍然有效?如果没有 - 你能扩展解决方案来处理这种情况吗?
猜你喜欢
  • 1970-01-01
  • 2014-09-12
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多