Python win32com中未定义xlPrimary错误

1 投票
2 回答
2890 浏览
提问于 2025-04-18 04:13

我在我的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的问题,内容是关于如何在Excel 2007图表中使用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。

2 个回答

0

这个属性错误的主要原因是你的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()。

2

常量已经定义好了。不过,只有在你创建了相关COM对象的类型库之后,这些常量才会被加载。创建类型库的方法有好几种(我自己在这个问题中给出了一些有用的链接)。不过,基本上你可以试试这个:

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

接下来用 gencache 中的 EnsureDispatch

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

你只需要用一次 EnsureDispatch,因为一旦类型库创建好了,之后即使用 Dispatch 也能加载常量。

如果你出于某种原因需要清除缓存,虽然不太好找,但你可以删除 gen_py 文件夹,文件夹的路径可以通过 win32com.__gen_path__ 找到。

撰写回答