[VSTO系列]三、简单的UI设计/QQ联系人导出(下)
接上一篇:http://www.cnblogs.com/longqi293/archive/2010/12/22/vstoforexcel2.html,我們通過VSTO,簡單的使用了Ribbon控件,以及如何從QQ郵箱導(dǎo)出聯(lián)系人。
在有了這些基礎(chǔ)之后,我們來開始一個比較復(fù)雜的實驗吧,這回,我們將對那個生成的聯(lián)系人Excel文檔進行處理,提取出每個好友的QQ號碼,然后再將這些號碼對應(yīng)的復(fù)制到這些聯(lián)系人后面。具體效果如何,還是慢慢來看。
慢慢來——
首先,還是建立一個Excel2007的外接程序項目,然后向項目中添加項,選擇Office——>功能區(qū)(可視化設(shè)計),如下圖:
我們雙擊新添加的那個文件,即可打開UI設(shè)計界面。
接下來呢,我們就要開始編輯Ribbon1的設(shè)計界面了,拖放一個Button空間到Group中,如下圖:
我們的程序見面如下所示:
粗略的設(shè)計就是如此,大家可以花點時間,慢慢研究Ribbon自帶的各類控件的使用,相信通過一段時間,大家能夠設(shè)計出自己所喜歡的外觀。在這里就僅作演示吧。
我們要做什么——
接下來,我們開始最關(guān)鍵的代碼編寫工作了,首先,我們要明白三件事:
- 獲取某一列的所有單元格數(shù)據(jù)
- 處理每一個單元格的數(shù)據(jù)
- 把處理后的數(shù)據(jù)添加到指定列中進行顯示
所以,很明確,我們的代碼也分為這幾步,首先,獲取當(dāng)前的工作薄,其中的某一個區(qū)域,我們使用get_range方法來實現(xiàn),就本例子而言呢,騰訊郵箱生成的那個聯(lián)系人表格,B列,是每個人的QQ郵箱,我們的QQ號碼就從這里提取,提取到郵箱后,把@符號及之后的字符去掉,保留前端的QQ號碼,并把處理過后的結(jié)果,放到該表格的指定列里面。大致意圖,如下所示:
當(dāng)然了,上圖所示,綠色區(qū)域為指定的顯示列,紅色區(qū)域為待處理,實際中,綠色的部分可以隨意指定。在這里也是舉個例子罷了。好啦,有圖了,接下來是尋求真相的過程。
通過之前的分析,我們需要先鋪墊個小知識:
如何獲取一定區(qū)域(范圍)的單元格?
這個相信大家谷歌一下絕對能找出方法,這里就不在贅述,此文的方法為使用Worksheet的get_range方法,在MSDN中,詳細的介紹了此方法的使用,小弟也給出地址,大家可以慢慢參考:http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.get_range(v=VS.100).aspx
這是一個英文地址,為什么呢?主要是它比較關(guān)鍵的說道,在這個方法的參數(shù)中,可以使用語意參數(shù),比如,我要獲取A1到C4這個4x4區(qū)域范圍的所有單元格,你可以這么寫get_range("A1:C4",Type.Missing)。
反而中文版的文檔中,卻沒提到……不知道是不是我沒找到還是什么的……>_<|||.
這個問題一解決了,那后面的事情就好辦了,看代碼:
private void GetRidOfQQ(){
////初始化一個Worksheet實例,用于獲取當(dāng)前激活的工作薄
Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet;
////計算目標(biāo)列的行數(shù),這里不是很科學(xué),推薦使用UsedRange屬性進行統(tǒng)計
int rows = ws.get_Range("B2:B125", Type.Missing).Count;
////初始化一個數(shù)組,用于保存處理后的號碼
string[] QQNum = new string[rows];
for (int j = 0; j < rows; )
{
foreach (Range rng in ws.get_Range("B2:B125", Type.Missing))///獲取指定范圍內(nèi)的單元格集合
{
QQNum[j] = rng.Value2.ToString().Replace("@qq.com", "");
j++;
}
}
Globals.ThisAddIn.Application.Cells[1, 11] = "QQ號碼";
for (int i = 1; i <= QQNum.Count(); i++)
{
////注意,這里的Cells索引值從1開始計算
Globals.ThisAddIn.Application.Cells[i + 1, 11] = QQNum[i - 1];////往指定單元格賦值
}
}
相信注釋已經(jīng)比較詳細了,代碼不太美觀,也僅僅作為演示使用了。
之后,為那個Ribbon上的按鈕添加單擊事件代碼:
try{
GetRidOfQQ();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
ok,至此,這個程序就制作完畢了,下面就是來看看運行效果對不對,測試結(jié)果如下圖:
小結(jié):
大家也許看到了吧,如果聯(lián)系人用了一個文字類的郵箱替代了QQ號碼郵箱,則這個結(jié)果是文字的,并不能夠當(dāng)做QQ號碼來用,所以,這次示例的局限性也很明顯,收到了聯(lián)系人表格的限制,不過,我們也從簡單的RibbonUI設(shè)計,走到了具體的Excel對象操作,接下來,還有各種各樣的Excel對象操作,內(nèi)容包羅萬象,可想而知不是一個系列就能寫完的,我們關(guān)注的是VSTO能給我們帶來什么新的變化。
試想,客戶已經(jīng)基于Office套件,進行著各類業(yè)務(wù)數(shù)據(jù)的存儲、處理,相對來說,比較成熟。但是某一天,他需要對Excel表格數(shù)據(jù)進行一些不大不小的分析,比如報表、統(tǒng)計等等。難道我們給他從Asp.net開始……Bla……Bla。
我們換個思路,緊緊抓住客戶最關(guān)心的業(yè)務(wù)來開展我們的工作,直接為Excel客戶端開發(fā)Add-In級別的插件,以解決最實際的需求為目標(biāo),這不是更好嗎?當(dāng)然,效率、可維護性、可擴展性……等等一大堆話題將會被引入……
這只是我一己之見吧,希望廣大園友熱烈拍磚~~
下一節(jié),將會帶來一些部署方面的說明和探討。
總結(jié)
以上是生活随笔為你收集整理的[VSTO系列]三、简单的UI设计/QQ联系人导出(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下怎么退出telnet
- 下一篇: 宫崎骏的动画片真有意思啊。