用于 Microsoft Outlook 的 .NET 连接器






4.74/5 (31投票s)
2003年11月23日
2分钟阅读

371893

7669
使用 XML DataSet 和 Outlook COM 对象库导出 Microsoft Outlook 数据。
引言
Microsoft Outlook Connector 是用 C# 使用 .NET 1.1 Framework 编写的。它尝试使用数据抽象与 Microsoft Outlook 和可视组件的数据访问。您 Microsoft Outlook 应用程序中的数据可以通过简单地检查文件夹选项并单击“导出”来导出到 XML 文件。 该源代码提供了一个简单的示例,说明如何将 COM 对象属性映射到 XML 友好的 DataSet
,该 DataSet
可以在任何 .NET 应用程序中使用。
背景
这个用于导出 Outlook 对象的组件源于几年来被动地寻找数据库和 Outlook 之间的同步。我偶然发现了一篇关于它的 VBA 文章 (http://www.devasp.com/search/res/r9981.html),并决定制作一个 C# 应用程序来做同样的事情。
使用代码
DataExportForm
的主要功能是通过自定义连接器从用户的 Microsoft Outlook 应用程序检索信息,该连接器将 Interop COM 对象转换为基本 DataSet
。我们都应该知道 DataSet
有多么方便,所以让我们看看我们的表单如何获取 datagrid 的信息。
private DataSet getCheckedItemSet()
{
DataSet ds = new DataSet();
OutlookConnector outlook = new OutlookConnector();
// setup progress bars and process selected folders
pgFolderProgress.Value = 0;
outlook.ItemProcessed += new OutlookItemProcessed(outlook_ItemProcessed);
pgFolderProgress.Maximum = lstExportObjects.CheckedItems.Count;
foreach (ListViewItem obj in lstExportObjects.CheckedItems)
{
pgFolderProgress.Value++;
pgItemProgress.Value = 0;
switch (obj.Index)
{
case 0:
pgItemProgress.Maximum = outlook.getFolderCount(
Outlook.OlDefaultFolders.olFolderCalendar);
ds.Merge(outlook.getCalendarDataSet());
break;
case 1:
pgItemProgress.Maximum = outlook.getFolderCount(
Outlook.OlDefaultFolders.olFolderContacts);
ds.Merge(outlook.getContactDataSet());
break;
case 2:
pgItemProgress.Maximum = outlook.getFolderCount(
Outlook.OlDefaultFolders.olFolderInbox);
ds.Merge(outlook.getInboxDataSet());
break;
case 3:
pgItemProgress.Maximum = outlook.getFolderCount(
Outlook.OlDefaultFolders.olFolderNotes);
ds.Merge(outlook.getNoteDataSet());
break;
case 4:
pgItemProgress.Maximum = outlook.getFolderCount(
Outlook.OlDefaultFolders.olFolderTasks);
ds.Merge(outlook.getTaskDataSet());
break;
default:
Debug.WriteLine("Unsupported Export: " + obj.Index);
break;
}
}
outlook.Dispose();
return ds;
}
那么 OutlookConnector
究竟是如何获取它的呢?您必须下载源代码才能了解处理 Interop 连接的更精细的细节。请放心,它实现了 IDisposable
接口,并通过 MAPI 检索 Outlook 文件夹信息。所有的 Outlook 连接性都在实例化时处理,这使得检索非常容易,如这里的 OutlookConnector.getContactDataSet()
方法所示。
/// <summary>
/// Retrieves a list of all the Outlook Contacts.
/// </summary>
/// <returns>Contact Items DataSet</returns>
public DataSet getContactDataSet()
{
Outlook.ContactItem item;
DataSet rv = new DataSet();
rv.DataSetName = "Contacts";
rv.Tables.Add("Contact");
rv.Tables[0].Columns.Add("FirstName");
rv.Tables[0].Columns.Add("LastName");
rv.Tables[0].Columns.Add("CompanyName");
rv.Tables[0].Columns.Add("Email");
rv.Tables[0].Columns.Add("HomePhone");
rv.Tables[0].Columns.Add("WorkPhone");
try
{
objFolder = objNamespace.GetDefaultFolder(
Outlook.OlDefaultFolders.olFolderContacts);
Debug.WriteLine(objFolder.Items.Count + " Contacts found.");
foreach (System.Object _item in objFolder.Items)
{
item = (Outlook.ContactItem) _item;
rv.Tables[0].Rows.Add(new object[] {
item.FirstName,
item.LastName,
item.CompanyName,
item.Email1Address,
item.HomeTelephoneNumber,
item.BusinessTelephoneNumber
});
this.ItemProcessed();
}
Debug.WriteLine(rv.Tables[0].Rows.Count + " Contacts exported.");
}
catch (System.Exception e)
{
Console.WriteLine(e);
}
return rv;
}
关注点
如果您的系统没有 Microsoft Office Outlook 2003,您可能需要更改 "OutlookConnector" 项目使用的引用。也就是说,如果您收到一个构建错误,描述为 "找不到类型或命名空间名称 'Outlook'",您可能没有 Office 2003。只需展开项目引用,删除受影响的项目,并添加适合您系统的 COM 库。如果有人有动态处理此问题的方法,我很想看看您是怎么做的。
历史
我想把这个项目限制在一个晚上完成,所以它目前使用未类型的 DataSet。这个应用程序的真正优势将来自使用强类型和连接一些 DataAdapter(s) 来真正尝试与一些其他系统同步。如果时间允许,我可能会在未来几周内绑定一个 MySQL 数据适配器,但如果有人在我完成之前开始/完成,请告诉我。
版本 1.1
连接器循环已切换为递增的本地化整数,因为 Office 10 没有实现 GetEnumerator()
方法。我们必须在 for
循环中使用我们自己的计数器。此外,这里有一些关于修复 Office 版本之间引用的详细信息。