65.9K
CodeProject 正在变化。 阅读更多。
Home

用于 Microsoft Outlook 的 .NET 连接器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (31投票s)

2003年11月23日

2分钟阅读

viewsIcon

371893

downloadIcon

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 版本之间引用的详细信息。

© . All rights reserved.