将通讯录导入到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秒。