1. 程式人生 > >VSTO:使用C#開發Excel、Word【8】

VSTO:使用C#開發Excel、Word【8】

公式 插件 郵件發送 tool 集合 應該 將在 bject 發現

office加載項
Office開發中使用的第二種模式是加載項模式。本書涵蓋了幾種Office加載項。其中包括Outlook的VSTO加載項,Excel和Word的COM加載項以及Excel的自動化加載項:

用於Outlook的VSTO加載項這個新的VSTO功能使得為Outlook 2003創建加載項變得非常容易。該模型是所有加載項模型中最體現“.NET”特色的,並且與模型後面的VSTO代碼非常相似文件。第24章“使用VSTO創建Outlook加載項”詳細描述了該模型。

Excel和Word的COM加載項類庫項目中的C#類可以實現IDTExtensibility2接口,並在註冊表中註冊為COM對象和COM加載項。通過COM互操作,Office創建C#類並與之通信。第23章“開發Word和Excel的COM加載項”介紹了COM加載項的創建以及使COM加載項開發成為問題的一些問題。

Excel的自動化加載項這些托管類會公開Excel可以在公式中使用的公共函數。 C#類必須在註冊表中註冊為COM對象。通過COM互操作,Excel可以創建自動化加載項,並在公式中使用其公共方法。自動化插件及其在Excel公式中的使用在第3章“編程Excel”中討論。

本書不討論一些Office加載項技術。智能文檔加載項不被討論,因為VSTO提供了一種更簡單的訪問智能文檔功能的方式,盡管在文檔或模板級而不是在應用程序級別。有關VSTO對智能文檔支持的更多信息,請參見第15章“使用操作窗格”。

在VSTO中創建Outlook加載項
要在VSTO中創建Outlook加載項目,請從Visual Studio的“文件”菜單的“新建”菜單中選擇“項目”。從項目類型列表中選擇Visual C#節點,然後選擇Visual C#節點下的Office節點。 Outlook加載項目將顯示在模板列表中。鍵入新的Outlook加載項目的名稱,並選擇項目的位置。然後單擊確定按鈕。

VSTO創建一個項目,其中引用了Outlook 2003 PIA,核心Office PIA和其他需要的引用,如圖2-6所示。 VSTO還將項目項目添加到名為ThisApplication.cs的項目中。此項目項目包含一個C#類,您將在實現Outlook加載項時添加該類。

技術分享

如果雙擊ThisApplication.cs項目項,您將看到如清單2-4所示的代碼。 有一個簡單的啟動和關閉事件處理程序,您可以在其中編寫在加載項的啟動和關閉時執行的代碼。 ThisApplication類派生於Outlook Application對象的聚合。 這允許您通過在ThisApplication類中編寫如this.Inspectors.Count等代碼來訪問Outlook Application對象的屬性和方法。

清單2-4 Outlook加載項目中的此應用程序類中的初始代碼

using System;
using System.Windows.Forms;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Outlook = Microsoft.Office.Interop.Outlook;

namespace OutlookAddin1
{
  public partial class ThisApplication
  {
    private void ThisApplication_Startup(object sender, EventArgs e)
    {
    }

    private void ThisApplication_Shutdown(object sender, EventArgs e)
    {
    }

    #region VSTO Designer generated code
    private void InternalStartup()
    {
      this.Startup += new System.
        EventHandler(ThisApplication_Startup);
      this.Shutdown += new System.
        EventHandler(ThisApplication_Shutdown);
    }
    #endregion
  }
}

看看清單2-4 你可能會想到在類定義中使用partial
VSTO使用部分類,這是.NET的一個新功能,可以讓您在一個文件中定義一部分類,另一部分將另一部分定義為一個類。 VSTO使用此功能來隱藏與ThisApplication類相關聯的一些其他生成的代碼,以減少編寫代碼的類的復雜性。最後的ThisApplication類將從清單2-4中的部分類中編譯,並在VSTO生成的部分類中隱藏的附加代碼。

InternalStartup方法由VSTO生成,用於連接VSTO生成的任何事件處理程序。這是啟動和關閉事件處理程序掛鉤的地方。你不應該編輯這段代碼。我們可能會在本書的某些列表中省略此代碼塊,但代碼塊必須在等級中,類將無法編譯。

我們將添加到清單2-4中的代碼,以創建一個加載項,它將解決一個煩人的問題,他們無意中回復了發送到包含大量人員的郵件別名的電子郵件。除非您的頭銜中有“副總裁”,否則您可能不想在任何時候發送電子郵件至25位以上的人士。我們將創建一個附加組件,如果您這樣做,將會提醒您,並提供“這是潛在的職業限制措施。您確定要將此電子郵件發送給2.5萬人嗎?”信息。

Outlook的Application對象有一個ItemSend事件,每當用戶發送一個電子郵件時都會產生。我們將為ThisApplication類的Startup方法添加附加代碼,以連接ItemSend事件的事件處理程序,如清單2-5所示。因為ThisApplication類源自Outlook的Application對象的聚合,所以我們可以編寫this.ItemSend代碼,因為ItemSend是由ThisApplication基類引發的一個事件。 ItemSend事件處理程序接受一個名為item的對象參數,它是要發送的Outlook項。因為項目可以是諸如會議請求或電子郵件消息的許多事物中的任何一個,所以項目作為對象而不是特定類型被傳遞。 ItemSend事件處理程序還具有通過引用傳遞的bool參數,該引用稱為cancel,可以設置為true以防止發送Outlook項目。

在我們的ItemSend事件處理程序中,我們需要檢查是否作為對象傳遞的item參數實際上是一個電子郵件。實現此目的的最簡單方法是使用as關鍵字來嘗試將item參數轉換為Outlook.MailItem。如果轉換成功,則結果值將為非空值,我們將知道正在發送的項目是Outlook.MailItem,因此是電子郵件。然後,我們可以遍歷MailItem對象上的收件人集合,並檢查是否發送到包含超過25個人的任何收件人列表。收件人集合中的每個收件人對象都具有返回AddressEntry對象的AddressEntry屬性。 AddressEntry對象具有一個Members屬性,返回一個可以檢查計數的集合。如果我們發現計數超過25,我們將顯示一個對話框,並詢問用戶是否真的要發送郵件。如果用戶單擊“否”按鈕,我們將將ItemSend事件的cancel參數設置為true,以取消發送職業限制電子郵件。

清單2-5 一個處理ItemSend事件並檢查超過25個收件人的VSTO Outlook加載項

using System;
using System.Windows.Forms;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Outlook = Microsoft.Office.Interop.Outlook;

namespace OutlookAddin1
{
  public partial class ThisApplication
  {
    private void ThisApplication_Startup(object sender, EventArgs e)
    {
      this.ItemSend += new 
        Outlook.ApplicationEvents_11_ItemSendEventHandler(
        ThisApplication_ItemSend);
    }

    void ThisApplication_ItemSend(object item, ref bool cancel)
    {
      Outlook.MailItem myItem = item as Outlook.MailItem;

      if (myItem != null)
      {
        foreach (Outlook.Recipient recip in myItem.Recipients)
        {
          if (recip.AddressEntry.Members.Count > 25)
          {
            // Ask the user if she really wants to send this e-mail
            string message = "Send mail to {0} with {1} people?";
            string caption = "More than 25 recipients";
            MessageBoxButtons buttons = MessageBoxButtons.YesNo;
            DialogResult result;

            result = MessageBox.Show(String.Format(message,
              recip.AddressEntry.Name,
              recip.AddressEntry.Members.Count),
              caption, buttons);

            if (result == DialogResult.No)
            {
              cancel = true;
              break;
            }
          }
        }
      }
    }

    private void ThisApplication_Shutdown(object sender, EventArgs e)
    {
    }

    #region VSTO Designer generated code
    private void InternalStartup()
    {
      this.Startup += new System.
        EventHandler(ThisApplication_Startup);
      this.Shutdown += new System.
        EventHandler(ThisApplication_Shutdown);
    }
    #endregion
  }
}

當您使用代碼清單2-4所示的代碼運行項目時,Outlook將啟動加載項加載。 嘗試發送一個包含超過25個人的別名的郵件,您可能希望首先離線,以防您錯誤地輸入代碼。 如果所有功能正確,加載項將顯示一個對話框,警告您向25位以上的人發送電子郵件,您將可以取消發送電子郵件。 退出Outlook以結束調試會話。

第24章“使用VSTO創建Outlook加載項”更詳細地討論了VSTO Outlook加載項。 第9至11章“編程Outlook”,“使用Outlook事件”和“使用Outlook對象”分別討論了Outlook對象模型。

VSTO:使用C#開發Excel、Word【8】