Python win32com中未定义xlPrimary错误
我在我的Python脚本中一直遇到错误,提示xlCategory
、xlValue
和xlPrimary
无法识别。
我想给我的图表添加坐标轴标签,昨天用这段代码成功做到了:
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工具。而且,早绑定对大小写是敏感的。
解决这个问题有两种方法:
使用动态模块,强制你的代码以晚绑定的方式运行。示例用法:
"win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()"
使用大小写敏感的关键字,以早绑定的方式运行。示例用法:
"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__
找到。