熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

VC#.NET綁定Office自動化服務器

2013-11-13 10:12:00  來源: .NET編程 

  早期綁定

  采用早期綁定時Visual C# 使用有關所涉及的 Office 應用程序的可用類型信息直接綁定到它需要使用的方法或屬性編譯器可以執行類型和語法檢查以確保傳遞到方法或屬性的參數的數量和類型正確無誤並且返回的值是所期望的類型 由於早期綁定在運行時調用屬性或方法所需的工作量較小因此有時速度較快然而雖然早期綁定可能速度較快但與晚期綁定之間的性能差異通常不大 

  早期綁定確實有這樣一個小缺點可能會帶來版本兼容性問題例如假定諸如 Microsoft Excel 之類的自動化服務器引入了 Excel 中沒有的新方法或屬性或者更改了現有的屬性或方法這些更改可能會改變對象的二進制布局並導致使用 Excel 類型信息實現 Excel 自動化的 Visual C# 應用程序出現問題為了避免早期綁定發生這樣的問題通常建議您在開發和測試自動化客戶端時使用您希望支持的最低版本的 Office 應用程序的類型信息 

  下列步驟說明了如何創建使用早期綁定的自動化客戶端請注意正如這些步驟所說明的那樣早期綁定要求您引用自動化客戶端的類型庫  

創建使用早期綁定的自動化客戶端

  啟動 Microsoft Visual Studio NET在文件菜單上單擊新建然後單擊項目從 Visual C# 項目類型中選擇 Windows 應用程序默認情況下會創建 Form

  添加對 Microsoft Excel 對象庫的引用為此請按照下列步驟操作

  在項目菜單上單擊添加引用

  在 COM 選項卡上找到 Microsoft Excel 對象庫並單擊選擇  

  注意Office 包含主 Interop 程序集 (PIA)Office XP 不包含 PIA但您可以下載 PIA 有關 Office XP PIA 的其他信息請單擊下面的文章編號以查看 Microsoft 知識庫中相應的文章

   INFOMicrosoft Office XP PIA 可供下載   

  在添加引用對話框中單擊確定以接受您的選擇如果系統提示您為選定的庫生成包裝請單擊是

  在視圖菜單上選擇工具箱以顯示工具箱然後向 Form 添加一個按鈕

  雙擊 Button將出現該窗體的代碼窗口

  在代碼窗口中將以下代碼private void button_Click(object sender SystemEventArgs e)

  {
  }
  替換為 private void button_Click(object sender SystemEventArgs e)
  {
   ExcelApplication objApp;
   Excel_Workbook objBook;
   ExcelWorkbooks objBooks;
   ExcelSheets objSheets;
   Excel_Worksheet objSheet;
   ExcelRange range;
   try
   {
   // Instantiate Excel and start a new workbook
   objApp = new ExcelApplication();
   objBooks = objAppWorkbooks;
   objBook = objBooksAdd( MissingValue );
   objSheets = objBookWorksheets;
   objSheet = (Excel_Worksheet)objSheetsget_Item();
   range = objSheetget_Range(A MissingValue);
   rangeset_Value(MissingValue Hello World! );   //Return control of Excel to the user
   objAppVisible = true;
   objAppUserControl = true;
   }
   catch( Exception theException )
   {
   String errorMessage;
   errorMessage = Error: ;
   errorMessage = StringConcat( errorMessage theExceptionMessage );
   errorMessage = StringConcat( errorMessage Line: );
   errorMessage = StringConcat( errorMessage theExceptionSource ); 
   MessageBoxShow( errorMessage Error );
   }
  }

  滾動到代碼窗口的頂部將下面的代碼行添加到 using 指令列表的末尾using SystemReflection;

  using Excel = MicrosoftOfficeInteropExcel;

  晚期綁定

  與早期綁定不同晚期綁定要等到運行時才會將屬性和方法調用綁定到它們的對象為此目標對象必須實現一個特殊的 COM 接口IDispatch利用 IDispatch::GetIDsOfNames 方法Visual C# 可以詢問對象支持哪些方法和屬性然後IDispatch::Invoke 方法允許 Visual C# 調用這些方法和屬性這種晚期綁定的優點是它消除了早期綁定所固有的某些版本依賴性然而它也有以下缺點省略了對自動化代碼完整性的編譯時檢查也不提供智能感知功能(該功能可提供有助於正確調用方法和屬性的提示)  

  要在 Visual C# 中使用晚期綁定請使用 SystemTypeInvokeMember 方法此方法調用 IDispatch::GetIDsOfNames 和 IDispatch::Invoke 來綁定到自動化服務器的方法和屬性 

創建使用晚期綁定的自動化客戶端

  啟動 Microsoft Visual Studio NET在文件菜單上單擊新建然後單擊項目從 Visual C# 項目類型中選擇 Windows 應用程序默認情況下會創建 Form

  在視圖菜單上選擇工具箱以顯示工具箱然後向 Form 添加一個按鈕

  雙擊 Button將出現該窗體的代碼窗口

  在代碼窗口中將以下代碼 private void button_Click(object sender SystemEventArgs e)

  {
  }
  替換為private void button_Click(object sender SystemEventArgs e)
  {
   object objApp_Late;
   object objBook_Late;
   object objBooks_Late;
   object objSheets_Late;
   object objSheet_Late;
   object objRange_Late;
   object[] Parameters;
   try
   {
   // Instantiate Excel
   objApp_Late = (object)new ExcelApplication();
   //Get the workbooks collection
   objBooks_Late = objApp_LateGetType()InvokeMember( Workbooks
   BindingFlagsGetProperty null objApp_Late null );
   //Add a new workbook
   objBook_Late = objBooks_LateGetType()InvokeMember( Add
   BindingFlagsInvokeMethod null objBooks_Late null );
   //Get the worksheets collection
   objSheets_Late = objBook_LateGetType()InvokeMember( Worksheets
   BindingFlagsGetProperty null objBook_Late null );
   //Get the first worksheet
   Parameters = new Object[];
   Parameters[] = ;
   objSheet_Late = objSheets_LateGetType()InvokeMember( Item
   BindingFlagsGetProperty null objSheets_Late Parameters );
   //Get a range object that contains cell A
   Parameters = new Object[];
   Parameters[] = A;
   Parameters[] = MissingValue;
   objRange_Late = objSheet_LateGetType()InvokeMember( Range
   BindingFlagsGetProperty null objSheet_Late Parameters );   //Write Hello World! in cell A
   Parameters = new Object[];
   Parameters[] = Hello World!;
   objRange_LateGetType()InvokeMember( Value BindingFlagsSetProperty
   null objRange_Late Parameters );
   //Return control of Excel to the user
   Parameters = new Object[];
   Parameters[] = true;
   objApp_LateGetType()InvokeMember( Visible BindingFlagsSetProperty
   null objApp_Late Parameters );
   objApp_LateGetType()InvokeMember( UserControl BindingFlagsSetProperty
   null objApp_Late Parameters );
   }
   catch( Exception theException )
   {
   String errorMessage;
   errorMessage = Error: ;
   errorMessage = StringConcat( errorMessage theExceptionMessage );
   errorMessage = StringConcat( errorMessage Line: );
   errorMessage = StringConcat( errorMessage theExceptionSource );
   MessageBoxShow( errorMessage Error );
  }
  }  

  滾動到代碼窗口的頂部將下面的代碼行添加到 using 指令列表的末尾using SystemReflection;


From:http://tw.wingwit.com/Article/program/net/201311/12868.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.