python win32com常量中的属性错误

时间:2018-01-15 05:21:18

标签: python com ms-office powerpoint win32com

我尝试用win32com Python库编程来处理PowerPoint文件。但是,当我以下列方式将常量传递给函数时,

new_pre.ExportAsFixedFormat(options.output,
                            win32com.client.constants.ppFixedFormatTypePDF,
                            win32com.client.constants.ppFixedFormatIntentPrint,
                            win32com.client.constants.msoFalse,
                            win32com.client.constants.ppPrintHandoutHorizontalFirst,
                            win32com.client.constants.ppPrintOutputSixSlideHandouts,
                            win32com.client.constants.msoFalse,
                            win32com.client.constants.ppPrintAll,
                            False,
                            False,
                            False,
                            False,
                            PrintRange=None
                            )

它引发AttributeError

Traceback (most recent call last):
  File "D:/SharedDocuments/DokyPpf/main.py", line 40, in <module>
    win32com.client.constants.msoFalse,
  File "C:\Users\xxx\AppData\Local\Programs\Python\Python36\lib\site-packages\win32com\client\__init__.py", line 178, in __getattr__
    raise AttributeError(a)
AttributeError: msoFalse

请注意,有一个similar question,其解决方案是使用

EnsureDispatch("PowerPoint.Application")

而不是

Dispatch("")

但是,我已经使用了EnsureDispatch("PowerPoint.Application"),但它仍然无效...

Here is the link到相应VBA的API参考。

2 个答案:

答案 0 :(得分:0)

 __import__('win32com.gen_py', globals(), locals(), ['2DF8D04C-5BFA-101B-BDE5-00AA0044DE52x0x2x8'], 0)

此文件不会自动加载。

答案 1 :(得分:0)

当您运行EnsureDispatch时,win32com将自动生成与感兴趣的类型库相对应的Python代码。

根据您的环境,Python模块将位于C:\Users\username\AppData\Local\Temp\gen_py\3.6左右,模块按您为其生成代码的类型库的CLSID进行分组。

对于PowerPoint 2016,您会找到一个名为91493440-5A91-11CF-8700-00AA0060263B的文件夹,其__init__.py包含所有生成的常量,包括例如ppFixedFormatTypePDF

现在,值得注意的是,包含MsoTriState的{​​{1}}枚举是PowerPoint类型库的一部分,这就是您看到msoFalse的原因。

quick look at the documentation,我们发现枚举是AttributeError中包含的核心Office库的一部分。再次依赖于您的设置,您正在使用的Office版本以及它所针对的架构,您应该能够通过在注册表编辑器中搜索mso.dll来挖掘其ID:

regedit

在这里,我们注意到类型库的CLSID为HKEY_CLASSES_ROOT,版本号为2.8。知道了这一点,也许是生成库代码的最简单方法,也就是缺少的常量,是{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}

win32com.client.gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 8)

现在,知道In [16]: win32com.client.constants.msoFalse AttributeError: msoFalse In [17]: win32com.client.gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 8) Out[17]: <module 'win32com.gen_py.2DF8D04C-5BFA-101B-BDE5-00AA0044DE52x0x2x8' from 'C:\\Users\\username\\AppData\\Local\ \Temp\\gen_py\\3.6\\2DF8D04C-5BFA-101B-BDE5-00AA0044DE52x0x2x8.py'> In [18]: win32com.client.constants.msoFalse Out[18]: 0 转换为0,当然,您也可以跳过整个过程,并用0替换所有出现的常量。