【原】通讯录导入Outlook

    将通讯录导入到Outlook联系人中,主要涉及到两个技术问题:一是读取Excel文档,二是导入Outlook。下面分别进行介绍。                     读取Excel文档,应能兼容xls和xlsx两种格式,读取速度不能太慢,否则会阻塞主界面(即使做成异步的,也会导致导入过程太长)。按照这个要求,先后调研了以下几种技术。    

  1、第三方类库:BasicExcel。该库通过直接分析xls文件的格式来读取Excel文档。     

  参考文档 :http://www.codeproject.com/Articles/13852/BasicExcel-A-Class-to-Read-and-Write-to-Microsoft    

  此库提供了很多已经封装好的类和接口,使用起来比较方便,作者提供了库的源代码和demo,能够读写例子中的Excel文件。经测试,有如下缺陷:

     (1) 不支持中文,文档中出现中文则不能识别,文件路径中也不能包含中文。

     (2) 不支持xlsx格式的文件。

     (3) 不支持合并单元格。

     (4) 用我们的通讯录测试时,打印不出数据(已将通讯录简化成一行,且不包含中文,未深究原因)。

  2、 第三方类库:CSpreadSheet。该库是通过ODBC来实现的。     

  参考文档:http://www.codeproject.com/KB/database/cspreadsheet.aspx    

  经测试,有如下缺陷:        

     (1) 不支持xlsx格式的文件。        

     (2) 不支持合并单元格。        

     (3) 当单元格内含有数字时,读取出来后会在后面加上一位小数。        

     (4) 其他方面的限制,可以参考文章中的说明。

  3、OLE方式。     

  参考文档 :http://blog.csdn.net/vicozo/article/details/4067804    

  优点:        

     (1) 支持xls和xlsx格式的文件。        

     (2) 支持合并单元格。         

     (3) 支持中文。    

  缺点:

     (1) 读取的速度比较慢,200行7列的数据需要耗时10秒左右。

  4、第三方类库:libXL。    

  参考文档:http://www.libxl.com    

  优点:        

     (1) 支持xls和xlsx格式的文件。        

     (2) 支持合并单元格。 

     (3) 支持中文。

     (4) 读取速度较快,200行14列的数据仅耗时16毫秒。    

  缺点:        

     (1) libXL是一个商业库,需要付费才能使用,试用版有各种限制。网上有破解版(无源代码),但有内存泄露。        

     (2) 读取数字时,会忽略数字本身的类型,全部转换成了double类型。    

  注意事项:

     (1) 读取xlsx格式的文件时,需要进行转码,即Ansi和 Unicode之间的转换。否则,无法正确加载和读取xlsx格式的文件。

     (2) 加载xls和xlsx格式的文件时,使用的是不同的接口。

    将联系人导入Outlook,应至少能支持Outlook 2003、2007和2010等几种常用版本。以下为调研的一些导入的方法。    

  1、人工导入。        

  可使用Outlook自带的导入向导,来导入Excel格式的通讯录文件。但人工导入用起来比较麻烦,故暂不考虑。

  2、第三方类库:MAPIEx。    

  参考文档:http://www.codeproject.com/Articles/10881/MAPIEx-Extended-MAPI-Wrapper    

  这是一个封装好的库,有源代码和Demo,可以对Outlook进行绝大部分的操作。但使用过程中也发现存在不少的问题,现罗列如下:               

     (1) 创建联系人子文件夹时,需要设置文件夹属性:SetPropertyString(PR_CONTAINER_CLASS, "IPF.Contact")。这样才能创建一个联系人子文件夹。但还是无法显示为电子邮件地址簿,需要自己手动设置:子文件夹右键----属性----Outlook通讯簿----将此文件夹显示为电子邮件通讯簿(未找到对应的编程设置方法)。    

     (2) 导入联系人后,如果不先打开这个联系人的信息查看一次,那么在Outlook通讯簿上只能显示姓名,不能显示邮箱。右键选择属性会弹出提示:传入了无效的ENTRYID。    

     (3) 导入联系人时,如果没有导入地址,并UpdateAddressAs,那么打开那个联系人的信息,即使什么都没有操作也会提示保存。另外,导入商业地址时,在Outlook中无法显示。    

     (4) 程序启动后,第一次导入耗时2-3秒, 以后再导入则耗时6秒左右(过一段时间再导入偶尔也会变快点),可能和Outlook的实现机制有关。    

     (5) 读取Outlook中的联系人信息比较耗时,所以最好先将联系人信息一次性读取出来,然后再进行其他操作。

  3、使用com接口。    

  参考文档:http://support.microsoft.com/kb/220600/zh-cn        

  使用com接口相当于直接操作Outlook,导入类型库后,接口也是相当的丰富,导入速度大约为3-4秒。

你可能感兴趣的:(【原】通讯录导入Outlook)