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