2012-07-24 159 views
4

我正在學習Python的win32com,我有一個奇怪的問題。win32com.client.Dispatch工作,但不win32com.client.gencache.EnsureDispatch

我試圖在詞典列表中導出Outlook聯繫人。我的代碼完全適用於win32com.client.Dispatch(「Outlook.Application)」,但它返回的聯繫人數量爲win32com.client.gencache.EnsureDispatch(「Outlook.Application)」,應該是更快和更「安全」的。這裏是我的代碼:

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) 

該消息意味着「矩陣指數越界「。最棘手的是我調用EnsureDispatch後,win32com.client.Dispatch不再有效。我必須卸載pywin32並重新安裝它......

我與Python2.7.3 64位運行與Outlook 2007 32位

感謝

+0

有什麼優點和早期綁定的缺點(EnsureDispatch)和後期綁定(Disaptch)?如果我保持這樣的代碼(它可以在很多平臺上運行),可以嗎? – franckgaga 2012-07-26 13:44:14

+0

IMO'win32com.client.Dispatch' does not work'because you have generated cache in'Temp \ gen_py' folder – Winand 2016-04-19 05:48:51

回答

3

我找到了解決辦法。這是一個錯誤win32com makepy ...

的主要問題是Outlook正在基於1編入索引的olContactItem(而不是基於0的指數爲蟒蛇)

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("FullName").Value 
#  ^

的作品,而不是:

contact.itemProperties("FullName").Value 
#  ^

爲了得到名稱正確,請諮詢:Word Object Model Reference on MSDN

相關問題