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

8 投票
4 回答
5073 浏览
提问于 2025-04-15 15:30

我刚开始学习编程和Python,所以希望能得到一些帮助。我想通过Excel的COM接口把一个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呢?我在文档里查找时发现有一个关于FileFormat对象的说明。但我对如何访问这个XlFileFormat对象完全没有头绪,也不知道怎么导入它,以便找到对应的枚举值。

谢谢!

4 个回答

1

所有的文件格式常量都有详细的说明,您可以在这里找到。

2

当我使用COM来访问QuickBooks时,我可以访问对象下定义的常量,这些常量在一个叫做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网页上想选择的任何格式。

10

这个问题有点过时了,但如果你是像我一样从谷歌找到这个页面的,我的解决办法是通过 win32com.client.constants 对象来访问常量,而不是直接在应用程序对象上访问,正如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绑定,如果需要的话。

我发现这个ActiveState页面很有帮助。

撰写回答