我正在为Python学习win32com,但遇到了一个奇怪的问题。
我正在尝试在词典列表中导出Outlook联系人。我的代码与win32com.client.Dispatch(“ Outlook.Application)完美配合。但是它与win32com.client.gencache.EnsureDispatch(” Outlook.Application)返回0个联系人,该联系人应该更快,更“安全”。这是我的代码:
class MapiImport(): def __init__(self): self.olApp = win32com.client.Dispatch("Outlook.Application") self.namespace = self.olApp.GetNamespace(u"MAPI") # olFolderContacts = 10 : self.mapiContacts = self.namespace.GetDefaultFolder(10).Items def getContacts(self, *fields): contacts = [] # Class == 40 is ContactItem # Class == 69 is DistListItem # Exclude ditribution list and others objects != ContactItem for contact in filter(lambda x: x.Class == 40,self.mapiContacts) : if not fields : ctact = dict((x.Name,x.Value) for x in contact.ItemProperties) else : ctact = {} for field in fields : itemProp = contact.itemProperties[field] ctact[field] = itemProp.Value contacts.append(ctact) return contacts #====TEST SCRIPT==== myMAPI = MapiImport() fields = (u"LastName",u"FirstName",u"Companies", u"HomeTelephoneNumber",u"Home2TelephoneNumber", u"MobileTelephoneNumber", u"BusinessTelephoneNumber",u"Business2TelephoneNumber", u"Email1Address",u"Email2Address",u"Email3Address", u"HomeAddress",u"BusinessAddress", u"Birthday",u"Anniversary", u"Body") print(myMAPI.getContacts(*fields))
所以当我更换时:
olApp = win32com.client.Dispatch("Outlook.Application")
与:
olApp = win32com.client.gencache.EnsureDispatch("Outlook.Application")
它返回以下错误:
Traceback (most recent call last): File "D:\Documents and Settings\da7950\Mes documents\Dropbox\cheetahImporter\mapiImport.py", line 42, in <module> print(myMAPI.getContacts(*fields)) File "D:\Documents and Settings\da7950\Mes documents\Dropbox\cheetahImporter\mapiImport.py", line 19, in getContacts for contact in filter(lambda x: x.Class == 40,self.mapiContacts) : File "D:\Documents and Settings\da7950\Mes documents\Python27\lib\site-packages\win32com\gen_py\00062FFF-0000-0000-C000-000000000046x0x9x2\_Items.py", line 122, in __getitem__ return self._get_good_object_(self._oleobj_.Invoke(*(81, LCID, 1, 1, item)), "Item") com_error: (-2147352567, "Une exception s'est produite.", (4096, u'Microsoft Office Outlook', u'Index de la matrice en dehors des limites.', None, 0, -2147352567), None)
该消息表示“矩阵索引超出范围”。最令人头疼的是,在我调用了SecureDispatch之后,win32com.client.Dispatch不再起作用。我必须卸载pywin32并重新安装…
我正在使用Python2.7.3 64位和Outlook 2007 32位
谢谢
我找到了解决方案。这是win32com makepy的错误…
主要问题是Outlook是基于1的索引olContactItem(与python的基于0的索引相反)
olContactItem
olApp = win32com.client.gencache.EnsureDispatch("Outlook.Application") namespace = olApp.GetNamespace(u"MAPI") # olFolderContacts = 10 : mapiContacts = namespace.GetDefaultFolder(10).Items for i in range(1,len(mapiContacts)+1) : contact = self.mapiContacts[i] ...
还有另一个问题contact.itemProperties。所有属性都对区分大小写EnsureDispatch,因此:
contact.itemProperties
EnsureDispatch
contact.ItemProperties("FullName").Value # ^
可以,但是不行:
contact.itemProperties("FullName").Value # ^
若要正确命名,请查阅:MSDN上的Microsoft Outlook ContactItem参考模型