【问题标题】:error xlPrimary not defined in Python win32com错误 xlPrimary 未在 Python win32com 中定义
【发布时间】:2018-08-24 04:53:15
【问题描述】:

在我的 python 脚本中无法识别 xlCategoryxlValuexlPrimary 时,我不断收到错误消息。

我正在尝试标记图表的轴,并且昨天使用以下代码成功地做到了:

chart = excel.Charts.Add()
chart.Name = "Chart Title"
chart.ChartType = -4169 #xlXYScatter
chart.SetSourceData(firstSheet.Range("$A:$B"))
series = chart.SeriesCollection(1)
series.Name = "Series Name"
chart.Axes(win32com.client.constants.xlCategory).HasTitle = True
chart.Axes(win32com.client.constants.xlCategory).AxisTitle.Caption = "x Axis"
chart.Axes(win32com.client.constants.xlValue).HasTitle = True
chart.Axes(win32com.client.constants.xlValue).AxisTitle.Caption = "y Axis"

这产生了以下错误:

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    startGraphBuild()
  File "C:\Python33\InCAS_Study_Analysis\VMDvsMODVMDG.py", line 33, in startGraphBuild
    chart.Axes(win32com.client.constants.xlCategory).HasTitle = True
  File "C:\Python33\lib\site-packages\win32com\client\__init__.py", line 170, in 
 __getattr__ 
    raise AttributeError(a)
AttributeError: xlCategory

所以我从这个 stackoverflow 问题changing axis labels in excel 2007 charts using python win32com 中尝试了这个:

pAxis = chart.Axes(AxisGroup = xlPrimary)
xAxis = pAxis(1)
yAxis = pAxis(2)

xAxis.HasTitle = True
yAxis.HasTitle = True
xAxis.AxisTitle.Caption = "VMD"
yAxis.AxisTitle.Caption = "MOD VMD"

但这产生了以下错误:

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    startGraphBuild()
   File "C:\Python33\InCAS_Study_Analysis\VMDvsMODVMDG.py", line 37, in startGraphBuild
    pAxis = chart.Axes(AxisGroup = xlPrimary)
 NameError: global name 'xlPrimary' is not defined

有没有其他人经历过这种情况?由于它昨天工作,我尝试重新启动一切,卸载并重新安装 pyWin,但这些都没有奏效。

我正在使用 Python 3.3 和 Excel 2010。

【问题讨论】:

    标签: python excel python-3.x win32com


    【解决方案1】:

    定义了常量。但是,只有在您为感兴趣的 COM 对象创建了 COM 类型库时,它们才会被加载。有几种方法可以做到这一点(我对Accessing enumaration constants in Excel COM using Python and win32com 的自我回答有一些你会发现有用的链接)。但基本上试试这个:

    Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win
    Type "help", "copyright", "credits" or "license" for more information.
    Portable Python >>> import win32com
    Portable Python >>> win32com.__gen_path__ # path to COM typelib generated by win32com
    'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\gen_py\\2.7'
    

    现在试试Dispatch

    Portable Python >>> from win32com import client
    Portable Python >>> xl=client.Dispatch('Excel.Application')
    Portable Python >>> client.constants.xlPrimary
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "G:\Portable Python 2.7.5.1\App\lib\site-packages\win32com\client\__init_
    __getattr__
        raise AttributeError(a)
    AttributeError: xlPrimary
    

    现在使用来自gencacheEnsureDispatch

    Portable Python >>> xl=client.gencache.EnsureDispatch('Excel.Application')
    Portable Python >>> client.constants.xlPrimary
    1
    Portable Python >>>
    

    您只需要使用一次EnsureDispatch,因为一旦创建了类型库,即使Dispatch 也会加载常量。

    如果你出于某种原因需要清除缓存,并不容易找到,但你可以删除gen_py文件夹,它的路径可以从win32com.__gen_path__找到。

    【讨论】:

      【解决方案2】:

      此属性错误的主要原因是您的 COM 服务器已从后期绑定(动态)转换为早期绑定(静态)。

      • 在后期绑定中,每当调用方法时,都会向对象查询该方法,如果成功,则可以进行调用。
      • 在早期绑定中,对象模型的信息是根据对象调用提供的类型信息预先确定的。早期绑定使用 MakePy。此外,早期绑定区分大小写。

      有两种方法可以解决此问题:

      1. 使用动态模块强制您的代码以面向后期绑定的方式工作。使用示例:

        "win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()" 
        
      2. 在面向早期绑定的方式中使用区分大小写的关键字。使用示例:

        "excel.Visible()" instead of "excel.VISIBLE()" or "excel.visible()"
        

      如果你想使用不区分大小写问题的变量,你应该删除 gen_py 文件夹并使用 win32com.client.Dispatch()

      【讨论】:

        猜你喜欢
        • 2022-07-21
        • 2012-03-15
        • 2023-03-24
        • 2018-06-23
        • 2019-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多