本專題概要
- 引言
- 創建VSTO項目
- Excel對象模型
- 創建Excel外接程序
- 創建Excel文檔級自定義項
- 小結
一、引言
也許很多朋友都沒有聽說過VSTO這個東西的,本人之前也同樣也不知道的,但是由於工作的原因接觸了這方面,由於VSTO方面國內的資料比較少,本人剛開始學習的時候都是參考MSDN的,但是上面很多資料都是英文的,可能學習起來會比較慢點,所以本人把最近一段時間學習的內容記錄下來,一來是作為一個鞏固的學習筆記,二來希望這些博客可以幫助一些剛接觸VSTO的朋友可以有所借鑒。
講了這么多廢話(指的上面一些過渡的話),到底VSTO到底是什么呢?這里我簡單的概括下的——VSTO是微軟推出一種對Office產品進行操作的技術,其中提供了一些類庫來讓開發人員可以更方便地開發出Office的解決方案,即對Word/Excel/Outlook實現一些擴展功能。 對於VSTO的更多介紹大家可以參看該系列的第一篇博文。在這個專題將為大家介紹下,如何創建Excel的解決方案?
二、創建VSTO項目
對於剛接觸VSTO的朋友來說,可能根本就不知道如何去創建一個VSTO的項目的,相信通過這個部分大家就會覺得是如此的簡單。
環境的搭建
進行VSTO開發的環境搭建是相當簡單的,只需要安裝Visual Studio 2010(當然安裝VS2010的時候在安裝組件中必須勾選VSTO選擇,這個選項是默認勾上的。大家可以在安裝VS的時候留意下)和Office 2010就可以,當然VS2008 和Office 2007的安裝也可以完成環境的搭建。
創建第一個Excel工程來開始我們的VSTO之旅
第一步, 選擇新建項目->Visual C#->Office->2010,然后選擇Excel 2010外接程序(如何是英文版即Excel 2010 Add-in),如下圖:
從圖中可以看到,除了外接程序外,還有Excel模板和Excel文檔這兩種項目類型,他們的區別是 外接程序是應用程序級別的,即如果你創建了Excel 2010外接程序,該程序對所有Excel應用都是有效的,因為每次Excel的啟動過程都會加載該插件(即該程序),大家肯定留意到當我們啟動Excel或Word的時候都會加載一些加載項,其實這些加載項就是屬於外接程序,即插件,啟動過程見下面圖:
而 文檔和模板項目,都是屬於文檔級別的程序,該程序只對當前文檔和模板有效,創建這兩種類型的項目,會在項目的工程目錄下會生成一個word文件(文檔項目會生成一個 Document1.docx文件,模板項目會生成一個Document1.dotx文件)。
創建成功之后,外接程序的項目文件結構見下圖:
從圖中可以看出,剛創建的VSTO外接程序都只有一個ThisAddIn.cs文件,該文件即是一個宿主項(更多關於宿主項和宿主控件的內容可以查看該系列的第一篇博文),我們可以通過這個文件來對Excel對象進行訪問。同時該類中有ThisAddIn_Startup和ThisAddIn_Shutdown兩個方法,從兩個方法中命名中可以知道,如果你的代碼想在加載外接程序時運行的話,就放把代碼放在ThisAddIn_Startup方法內容,如果你想在外接程序卸載的時候運行你的代碼,就把這些代碼放在ThisAddIn_Shutdown方法內。
三、Excel對象模型
要開發Excel的項目,就自然少不了對Excel對象模型的了解了,只有了解Excel對象模型,這樣才能更好地對Excel進行處理。下面先給出一張Excel對象模型的圖:
下面就具體對上圖中的各個對象做一個簡單的介紹:
Application對象——Excel中的Application對象表示Excel應用程序,該對象是所有Excel對象的根,你可以通過Application對象,獲取到其他對象,在外接程序中,我們可以通過下面的方式來獲得Application對象:Globals.ThisAddIn.Application
Workbooks對象代表Workbook對象的集合,而Workbook對象表示Excel中的單個工作簿,我們可以通過下面的方式來獲得工作簿對象:Globals.ThisAddIn.Application.ThisWorkbook
Worksheets對象代表Worksheet對象的集合,而Worksheet代表的就是Excel中的表,下面的代碼可以獲得Worksheet對象:Globals.ThisAddIn.Application.ThisWorkbook.ActiveSheet (激活的表,每次打開一個Excel文件,都是表一即sheet1被激活,所以通過該代碼就說獲得表一對象)
Range對象代表一個范圍,是操作Excel文檔最常用的對象,它可以表示為一個單元格、一行、一列或多個單元格塊(可以連續,也可以不連續)的單元格選定范圍,甚至多個工作表中的一組單元格。可能上面的解釋過於枯燥,相信大家通過下圖可以更好地理解Excel中的各個對象:
四、創建Excel外接程序
介紹完了Excel對象模型之后,我們就可以利用這些對象來對Excel文檔進行操作了,下面就創建一個簡單的Excel外接程序的。
首先我們模擬一個需求,大多說軟件在使用時都會彈出一個歡迎界面,這樣我們就創建一個外接程序,每次打開Excel文件時彈出一個歡迎界面,退出時彈出“謝謝使用”界面。
我們只需要在上面的創建工程中介入下面的代碼即可:
using System.Windows.Forms; namespace MyExcelAddIn1 { public partial class ThisAddIn { private void ThisAddIn_Startup(object sender, System.EventArgs e) { // 因為歡迎使用窗口要在打開Excel的時候彈出,所以把下面代碼放在Startup方法內 MessageBox.Show("歡迎使用Microsoft Excel"); } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { // 在退出Excel的時候彈出謝謝使用窗口,所以把下面的代碼放在Shutdown方法內 MessageBox.Show("謝謝使用!"); } #region VSTO 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(ThisAddIn_Startup); this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); } #endregion } }
這樣,我們就完成了上面簡單的一個模擬需求了,下面讓我們按F5來測試下效果吧!
按F5運行該程序時,首先打開一個Excel之后,一個歡迎界面就會彈出:
點擊Excel窗口上的"X"按鈕時,就會彈出一個 “謝謝使用!”的窗口,效果如下:
點擊 Ok 按鈕之后才會正常退出Excel。這樣就完成了一個簡單的Excel外接程序了,上面提到過外接程序是應用程序級別的,所以當你每次打開Excel的時候都會有這樣的一個歡迎界面和關閉Excel時都有一個"謝謝使用"窗口,有些朋友想問了,如果我想卸載這個插件怎么辦呢?方法很簡單,只需要右鍵你的解決方案——>清理,這樣可以了,另外你也可以從開發工具選項卡——>COM 插件,在彈出的窗口中選擇你自定義的插件 再按下移除按鈕。具體步驟見下圖:
五、創建Excel文檔級自定義項
介紹完了創建Excel外接程序之后,下面看看如何創建一個文檔級的項目:
1. 新建一個Excel 2010 Workbook(即Excel工作簿)項目:
2. 單擊 OK按鈕,在下面的窗口中單擊 ”OK“按鈕:
3. 在第一創建Excel工作簿項目是會彈出下面的一個窗口(窗口意思為:是否允許創建的項目訪問VBA項目系統),此時我們只需要點擊“Ok”就完成了Excel工作簿項目的創建。
現在我們來模擬一個需求,比如現在有一個成績單工作表,我們希望獲得各科目不及格同學的名字。此時我們只需要在上面創建的工作簿項目中添加一個ComboBox,一個Button,一個textbox。在button的Click事件中添加下面的代碼:
// 找出各科目不及格同學的名字 private void btnSearch_Click(object sender, EventArgs e) { // 清除textbox中的內容 txtResult.Clear(); // 從復選框中獲得選擇的科目索引 int subjectIndex = cbxsubjects.SelectedIndex; if (subjectIndex == -1) { MessageBox.Show("請先選擇一個科目"); return; } // 獲得選擇的科目名稱 string subjectName = cbxsubjects.SelectedItem.ToString(); // 獲得工作表對象 Excel.Worksheet worksheet =(Excel.Worksheet)Globals.ThisWorkbook.ActiveSheet; for (int row = 2; row < worksheet.UsedRange.Rows.Count+1; row++) { Excel.Range rng =(Excel.Range)worksheet.Cells[row,subjectIndex + 2]; Excel.Range rng1 = (Excel.Range)worksheet.Cells[row, 1]; if (rng.Value< 60) { txtResult.Text += rng1.Value + "; "; } } if (txtResult.Text.Length == 0) { txtResult.Text = subjectName + "沒有不及格的同學"; } }
運行該項目結果為:
六、小結
到這里本專題的介紹就結束了, 本專題首先主要介紹了Excel的對象模型和如何創建Excel的兩種項目類型,希望通過本專題大家可以開發出一些簡單的Excel的解決方案,后面一個專題將為大家介紹如何為Excel自定義一個選項卡和上下文菜單。
專題源碼:http://files.cnblogs.com/zhili/ExcelWorkbook2.zip