如何在 Python 中导入 COM 对象命名空间/枚举?

Posted

技术标签:

【中文标题】如何在 Python 中导入 COM 对象命名空间/枚举?【英文标题】:How do I import a COM object namespace/enumeration in Python? 【发布时间】:2010-12-11 09:36:21 【问题描述】:

我对编程/python 比较陌生,所以如果能得到任何帮助,我将不胜感激。我想通过 COM 使用 Excel 将 excel 文件保存为特定格式。代码如下:

import win32com.client as win32 

def excel():
    app = 'Excel'
    x1 = win32.gencache.EnsureDispatch('%s.Application' % app)
    ss = x1.Workbooks.Add()
    sh = ss.ActiveSheet
    x1.Visible = True
    sh.Cells(1,1).Value = 'test write'
    ss.SaveAs(Filename="temp.xls", FileFormat=56)
    x1.Application.Quit()

if __name__=='__main__':
    excel()

我的问题是,如果我没有明确知道文件格式的代码,我该如何指定它?浏览文档后,我找到了关于 FileFormat 对象的参考资料。我对如何访问XlFileFormat object 并以我可以找到它的枚举值的方式导入它一无所知。

谢谢!

【问题讨论】:

【参考方案1】:

这个问题有点陈旧,但对于那些从 Google 访问此页面的人(就像我一样),我的解决方案是通过 win32com.client.constants 对象而不是应用程序对象本身 as suggested by Eric 访问常量。这让您可以像在 VBE 中一样使用枚举常量:

>>> import win32com.client
>>> xl = win32com.client.gencache.EnsureDispatch('Excel.Application')
>>> C = win32com.client.constants
>>> C.xlWorkbookNormal
-4143
>>> C.xlCSV
6
>>> C.xlErrValue
2015
>>> C.xlThemeColorAccent1
5

另外,除非您手动运行makepy 实用程序,否则如果使用常规win32com.client.Dispatch(..) 方法初始化应用程序,常量可能不可用,这是我遇到的另一个问题。如果需要,使用win32com.client.gencache.EnsureDispatch(..)(如提问者所做的那样)在运行时检查并生成 Python 绑定。

我发现this ActiveState page 很有帮助。

【讨论】:

这在我从 Python 驱动 AutoCAD 时帮助了我。谢谢。 也可以直接使用from win32com.client import constants as C导入【参考方案2】:

当我使用 COM 访问快速手册时,我可以访问对象的 constants 成员下定义的常量。代码看起来像这样(你会对第三行感兴趣):

self._session_manager.OpenConnection2("",
                                      application_name,
                                      QBFC8Lib.constants.ctLocalQBD)

我不确定这是否可行,但试试这个:

import win32com.client as win32 

def excel():
    app = 'Excel'
    x1 = win32.gencache.EnsureDispatch('%s.Application' % app)
    ss = x1.Workbooks.Add()
    sh = ss.ActiveSheet
    x1.Visible = True
    sh.Cells(1,1).Value = 'test write'
    ss.SaveAs(Filename="temp.xls", FileFormat=x1.constants.xlWorkbookNormal)
    x1.Application.Quit()

if __name__=='__main__':
    excel()

将 xlWorkbookNormal 替换为您在问题中发布的 X1FileFormat 网页中尝试选择的任何格式。

【讨论】:

很遗憾,Excel 没有常量对象。【参考方案3】:

所有文件格式常量都记录在案here

【讨论】:

这就是我现在使用的解决方案。我以前在没有适当文档的其他 COM 对象交互中看到过这个问题。我知道常量的名称,但不知道值。我很好奇是否有办法回避这个问题。【参考方案4】:

作为一般规则,我发现在 Excel 中预先记录 VBA IDE 中的任何代码非常有用。通过这种方式,您可以找出需要在 python 代码中使用的所有常量值等。您还可以确保在更可控的环境中工作。

【讨论】:

以上是关于如何在 Python 中导入 COM 对象命名空间/枚举?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Razor 视图页面中导入命名空间?

如何在 terraform 中导入生成的 Kubernetes 集群的命名空间

覆盖在命名空间中导入的函数

在 R 的命名空间中导入有啥好处?

在 PHP 中导入类和命名空间:前导反斜杠有啥区别?

如何在Java中导入组件对象模型(COM)?