[VSTO系列]三、简单的UI设计/QQ联系人导出(下)
接上一篇:http://www.cnblogs.com/longqi293/archive/2010/12/22/vstoforexcel2.html,我们通过VSTO,简单的使用了Ribbon控件,以及如何从QQ邮箱导出联系人。
在有了这些基础之后,我们来开始一个比较复杂的实验吧,这回,我们将对那个生成的联系人Excel文档进行处理,提取出每个好友的QQ号码,然后再将这些号码对应的复制到这些联系人后面。具体效果如何,还是慢慢来看。
慢慢来——
首先,还是建立一个Excel2007的外接程序项目,然后向项目中添加项,选择Office——>功能区(可视化设计),如下图:
我们双击新添加的那个文件,即可打开UI设计界面。
接下来呢,我们就要开始编辑Ribbon1的设计界面了,拖放一个Button空间到Group中,如下图:
我们的程序见面如下所示:
粗略的设计就是如此,大家可以花点时间,慢慢研究Ribbon自带的各类控件的使用,相信通过一段时间,大家能够设计出自己所喜欢的外观。在这里就仅作演示吧。
我们要做什么——
接下来,我们开始最关键的代码编写工作了,首先,我们要明白三件事:
- 获取某一列的所有单元格数据
- 处理每一个单元格的数据
- 把处理后的数据添加到指定列中进行显示
所以,很明确,我们的代码也分为这几步,首先,获取当前的工作薄,其中的某一个区域,我们使用get_range方法来实现,就本例子而言呢,腾讯邮箱生成的那个联系人表格,B列,是每个人的QQ邮箱,我们的QQ号码就从这里提取,提取到邮箱后,把@符号及之后的字符去掉,保留前端的QQ号码,并把处理过后的结果,放到该表格的指定列里面。大致意图,如下所示:
当然了,上图所示,绿色区域为指定的显示列,红色区域为待处理,实际中,绿色的部分可以随意指定。在这里也是举个例子罢了。好啦,有图了,接下来是寻求真相的过程。
通过之前的分析,我们需要先铺垫个小知识:
如何获取一定区域(范围)的单元格?
这个相信大家谷歌一下绝对能找出方法,这里就不在赘述,此文的方法为使用Worksheet的get_range方法,在MSDN中,详细的介绍了此方法的使用,小弟也给出地址,大家可以慢慢参考:http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.get_range(v=VS.100).aspx
这是一个英文地址,为什么呢?主要是它比较关键的说道,在这个方法的参数中,可以使用语意参数,比如,我要获取A1到C4这个4x4区域范围的所有单元格,你可以这么写get_range("A1:C4",Type.Missing)。
反而中文版的文档中,却没提到……不知道是不是我没找到还是什么的……>_<|||.
这个问题一解决了,那后面的事情就好办了,看代码:
private void GetRidOfQQ()
{
////初始化一个Worksheet实例,用于获取当前激活的工作薄
Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet;
////计算目标列的行数,这里不是很科学,推荐使用UsedRange属性进行统计
int rows = ws.get_Range("B2:B125", Type.Missing).Count;
////初始化一个数组,用于保存处理后的号码
string[] QQNum = new string[rows];
for (int j = 0; j < rows; )
{
foreach (Range rng in ws.get_Range("B2:B125", Type.Missing))///获取指定范围内的单元格集合
{
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];////往指定单元格赋值
}
}
相信注释已经比较详细了,代码不太美观,也仅仅作为演示使用了。
之后,为那个Ribbon上的按钮添加单击事件代码:
try
{
GetRidOfQQ();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
ok,至此,这个程序就制作完毕了,下面就是来看看运行效果对不对,测试结果如下图:
小结:
大家也许看到了吧,如果联系人用了一个文字类的邮箱替代了QQ号码邮箱,则这个结果是文字的,并不能够当做QQ号码来用,所以,这次示例的局限性也很明显,收到了联系人表格的限制,不过,我们也从简单的RibbonUI设计,走到了具体的Excel对象操作,接下来,还有各种各样的Excel对象操作,内容包罗万象,可想而知不是一个系列就能写完的,我们关注的是VSTO能给我们带来什么新的变化。
试想,客户已经基于Office套件,进行着各类业务数据的存储、处理,相对来说,比较成熟。但是某一天,他需要对Excel表格数据进行一些不大不小的分析,比如报表、统计等等。难道我们给他从Asp.net开始……Bla……Bla。
我们换个思路,紧紧抓住客户最关心的业务来开展我们的工作,直接为Excel客户端开发Add-In级别的插件,以解决最实际的需求为目标,这不是更好吗?当然,效率、可维护性、可扩展性……等等一大堆话题将会被引入……
这只是我一己之见吧,希望广大园友热烈拍砖~~
下一节,将会带来一些部署方面的说明和探讨。
出处:http://longqi293.cnblogs.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
本篇博文 by Jack Fan is licensed under a Creative Commons 署名-非商业性使用-相同方式共享 2.5 中国大陆 License.
这是我的公众号,【代码只是副业】