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

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

message 正在 oba 簡單的 rand mes nts 支持 文檔

文件背後的代碼
VSTO支持文檔背後的代碼,要求開發人員使用VSTO項目中生成的具有預連接上下文和預連接事件的類。這些類有時被稱為“代碼後面”類,因為它們是與特定文檔或工作表相關聯的代碼。在Word中,與文檔對應的類後面有一個代碼。在Excel中,工作簿中的classone有多個代碼,工作簿中的每個工作表或圖表工作表都有一個代碼。

您的代碼在文檔項目後面的VSTO代碼中第一次運行時,當Office引發由為您創建的類後面的任何代碼處理的Startup事件。 VSTO通過您正在編寫代碼的類的代碼的基類提供上下文。自定義Excel工作表的類後面的VSTO代碼源自包含Excel工作表的所有方法,屬性和事件的基類。這使您能夠在工作表類的啟動方法中編寫這樣的代碼。

MessageBox.Show(String.Format("{0} is the sheet name", this.Name));

通過使用this.Name,您是指從基類繼承的Excel Worksheet對象的Name屬性。 清單2-6顯示了Excel Worksheet的類後面的VSTO代碼。 除了類中的代碼中的啟動和關閉方法之外,還有一個名為InternalStartup的生成方法。 您不應該將任何代碼放在這個InternalStartup方法中,因為它是由VSTO自動生成的,修改它可能會破壞Visual Studio對類後面的代碼的支持。 相反,您的啟動代碼應該在啟動事件處理程序中。 文檔類後面的VSTO代碼也使用部分類來隱藏VSTO生成的一些附加代碼。

清單2-6 VSTO Excel工作簿定制

using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;

namespace ExcelWorkbook1
{
  public partial class Sheet1
  {
    
private void Sheet1_Startup(object sender, EventArgs e) { // Initial entry point. // This code gets run first when the code behind is created // The context is implicit in the Sheet1 class MessageBox.Show("Code behind the document running."); MessageBox.Show(String.Format("{0} is the sheet name", this.Name)); } private void Sheet1_Shutdown(object sender, EventArgs e) { } #region VSTO Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InternalStartup() { this.Startup += new System.EventHandler(Sheet1_Startup); this.Shutdown += new System.EventHandler(Sheet1_Shutdown); } #endregion } }

Excel中的文檔後面的VSTO代碼
在本節中,我們使用VSTO在Excel中為文檔創建一些簡單的代碼。 首先,啟動VSTO並選擇文件>新建>項目菜單項。 如前所述,導航到Visual C#根下的Office節點。

我們將使用C#創建一個Excel工作簿項目。 如果您已經有一個要添加VSTO自定義代碼的工作簿,則可以在“新建項目”對話框中單擊“確定”後出現的對話框中指定其位置。 這一次,我們將從零開始,創建一個新的,空白的工作簿。


圖2-8 選擇與您的代碼關聯的工作簿

技術分享

圖2-7 使用“新建項目”對話框創建Excel Workbook項目

技術分享

創建項目後,會出現設計器視圖,如圖2-9所示。

圖2-9 VSTO Excel代碼的設計視圖。

技術分享

請註意圖2-9中的一些有趣的事情。 首先,Excel作為設計器在Visual Studio 2005中運行,與開發Windows窗體項目時的Windows窗體設計器相同。

其次,看菜單欄如圖2-10所示。 VSTO將Visual Studio菜單(構建,調試等)和Excel菜單項(格式,數據等)合並在一起。 在Visual Studio和Excel(例如工具)中顯示的菜單項通過向Visual Studio菜單(如Microsoft Office Excel工具)添加子菜單進行合並,可以選擇此菜單項以查看Excel工具菜單。


圖2-10 合並Visual Studio和Excel菜單

技術分享

第三,請註意圖2-9中的工具箱包含一個新的類別:Excel控件。使用Visual Studio設計文檔時,可以使用Excel用戶熟悉的Excel菜單項或Visual Studio用戶熟悉的工具箱習慣,創建命名範圍和列表對象。

第四,請註意,在這種情況下,“屬性”窗口顯示所選對象的屬性Sheet1。您可以使用“屬性”窗口來編輯Excel對象的屬性,與Windows窗體項目中編輯控件和窗體的屬性相同。

第五,請註意,解決方案資源管理器已經有四個類。每個底層的Excel工作表和工作簿對象都由一個可以擴展和自定義的.NET類來表示。當您對設計器中的文檔進行更改時,後面的代碼將自動更新。例如,將列表對象從工具箱拖到Sheet1設計器上,並將其繪制為10行×4列,如圖2-11所示。


圖2-11 在設計器中創建ListObject

技術分享

從“屬性”窗口可以看到,設計者為新的列表對象選擇了一個默認名稱。我們可以編輯它,但在這個例子中,我們將保留默認名稱List1。

我們來看看這個工作表背後的代碼,並對它進行一些簡單的更改。右鍵單擊解決方案資源管理器中的Sheet1.cs並選擇查看代碼。我們將簡要說明兩個VSTO功能:ActionsPane和列表對象數據綁定。我們將聲明一個Windows窗體按鈕作為類的成員變量,並將其稱為myButton。在啟動事件中,我們將通過將其添加到ActionsPane的Controls集合中,在Excel的“文檔操作”任務窗格中顯示該按鈕。這樣做會導致Excel顯示“文檔操作”任務窗格並顯示我們的按鈕。我們還將處理按鈕的Click事件,當點擊按鈕時,我們將數據將我們的列表對象綁定到隨機生成的DataTable。清單2-7顯示了這段代碼。

清單2-7 將文檔操作任務窗格和數據添加控件的VSTO自定義將ListObject控件綁定到數據表

using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;

namespace ExcelWorkbook1
{
  public partial class Sheet1
  {
    Button myButton = new Button();
    DataTable table;

    private void Sheet1_Startup(object sender, EventArgs e)
    {
      myButton.Text = "Databind!";
      myButton.Click += new EventHandler(myButton_Click);
      Globals.ThisWorkbook.ActionsPane.Controls.Add(myButton);
    }

    void myButton_Click(object sender, EventArgs e)
    {
      List1.DataSource = null;
      table = new DataTable();
      Random r = new Random();

      for (int i = 0; i < 4; i++)
        table.Columns.Add("Col " + i.ToString());

      for (int i = 0; i < 20; i++)
        table.Rows.Add(r.NextDouble(), r.NextDouble(), 
          r.NextDouble(), r.NextDouble());

      List1.DataSource = table;
    }

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

    #region VSTO Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InternalStartup()
    {
      this.Startup += new System.EventHandler(Sheet1_Startup);
      this.Shutdown += new System.EventHandler(Sheet1_Shutdown);
    }

    #endregion
  }
}

構建並運行代碼,並確保Excel啟動,為工作表引發啟動事件,並將該按鈕添加到操作窗格。 單擊按鈕,生成隨機DataTable並綁定到列表對象,如圖2-12所示。 退出Excel以結束調試會話。

圖2-12 運行清單2-7並單擊我們添加到“文檔操作”任務窗格中的按鈕的結果

技術分享

我們簡要說明了VSTO對“文檔操作”任務窗格的支持以及VSTO添加到Excel的列表對象的數據綁定能力。 有關VSTO對“文檔操作”任務窗格的支持的更多信息,請參見第15章“使用操作窗格”。 有關VSTO對數據綁定的支持的更多信息,請參見第17章“VSTO數據編程”。

結論
本章介紹了Office解決方案的三種基本模式:一個自動化可執行文件,一個加載項和一個文檔後面的代碼。 本章還介紹了如何使用Visual Studio 2005和Visual Studio 2005 Tools for Office構建這三種基本模式的解決方案。

現在您知道如何在文檔解決方案中創建基本的自動化可執行文件,加載項和代碼,您將在下一章中使用這些技能,因為重點轉向Excel,Word,Outlook和InfoPath的特定功能 可以在你的解決方案中使用

本章僅作為文檔中的加載項和代碼介紹。 第24章介紹Outlook的VSTO加載項。 第23章介紹Word和Excel的COM加載項。 第3章介紹了Excel的自動化加載項。 第13至17章詳細介紹了VSTO文檔模型背後的代碼。

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