使用Python和win32com访问Excel COM中的枚举常量

8
我正在使用Python 2.7的win32com模块从Python中加载MS Excel工作表:
    book = xlApp.Workbooks.Open("myFile.xls")
    sheet = book.Sheets(1)

许多Range、Worksheet等对象的方法和属性使用枚举类型,如XlDirection、XlFillWith等。这些定义了常量,例如xlDown、xlUp、xlFillWithContents等。这些常量是否可在win32com中使用,以便我可以执行以下操作:

    column = outputsSheet.Range("I5:I150")
    lastRow = column.End(xlInterop.xlDown)
    print "Last row:", lastRow.Row

这个不起作用是因为xlInterop未定义,有没有一种方法可以使用win32com访问它?通过试错发现诸如xlDown之类的常量值并不实用。

2个回答

17

我对win32com不熟悉,所以我不知道这是否有帮助...尝试使用以下方式启动Excel:

xlApp = win32com.client.gencache.EnsureDispatch("Excel.Application")

这应该可以运行makepy,你可以在...\Lib\site-packages\win32com\gen_py\00020813-0000-0000-C000-000000000046x0x1x7找到一些生成的Python文件(对于您来说,最后一个文件夹可能是另一个名��,我不知道)。请检查init.py文件,那里定义了一堆常量。

编辑:您可以使用以下方式访问这些常量:

from win32com.client import constants as c

编辑2:文件夹路径:

win32com.__gen_path__


太好了!这就做到了。额外的数据放不进评论里,我会单独发一篇回答。 - Oliver
好的回答。但是...我找不到gen_py目录,或者在我的站点包中生成的任何内容。然而,这确实解决了问题。我担心在与py2exe或pyinstaller捆绑后在独立上下文中使用它。因为据说这会生成.py文件(然后加载它们)?有人以前做过吗?或者至少知道任何简单的方法来指向这些.py文件的生成/利用到一个临时目录,也许因为我不能期望客户机器上有Python安装?我可以深入研究库并自定义它,但准备好的解决方案会更好。 - BuvinJ
@BuvinJ:看起来他们已经更改了makepy的输出文件夹。如果我运行这个,我会得到文件夹: win32com.__gen_path__这里的文件夹是'C:\Users\Olav\AppData\Local\Temp\gen_py\3.6'我无法回答你其他的问题。 - Olav
谢谢!这非常有用。所以,他们现在至少写入了一个临时文件夹。太好了。我会检查我的win32com.__gen_path__值。我从未遇到过像这样在编译上下文中运行生成脚本并动态导入的情况。但是,我知道py2exe和pyinstaller嵌入了解释器,并能够执行eval语句。因此,必须有一种方法来在生成后导入它。最坏的情况下,我会调整库,使其完全跳过文件写入... - BuvinJ

6
Olav的回答使我能够搜索关键字“win32com gencache EnsureDispatch constants”,我找到了一些有用的链接。比如如何在Python中导入COM对象命名空间/枚举?,这与我的问题重复。这指向一个ActiveState页面客户端COM和Python快速入门,介绍了这些内容。奇怪的是,该页面指出client.Dispatch应该足以获取constnats,但我发现它不是,我必须运行gencache.EnsureDispatch,只有这样常量才会出现:
Portable Python >>> from win32com import client as com
Portable Python >>> from win32com.client import constants as c
Portable Python >>> word = com.Dispatch('Word.Application')
Portable Python >>> c.wdWindowStateMinimize
  Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "F:\PORTAB~1.1\App\lib\site-packages\win32com\client\__init__.py", line 170, in __getattr__
      raise AttributeError(a)
  AttributeError: wdWindowStateMinimize
Portable Python >>> word = com.gencache.EnsureDispatch("Word.Application")
Portable Python >>> c.wdWindowStateMinimize
2

你提到的ActiveState页面指出,你必须先生成这些文件。之后,你只需使用win32com.clientDispatchconstants即可访问常量。 - wlnirvana
@Oliver:请阅读我在Olva的答案下面留下的评论。(我想你可能知道我在那里的后续问题的答案。) - BuvinJ

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