现在的位置: 首页 > 综合 > 正文

[VSTO系列]三、简单的UI设计/QQ联系人导出(下)

2012年03月19日 ⁄ 综合 ⁄ 共 2470字 ⁄ 字号 评论关闭

接上一篇: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级别的插件,以解决最实际的需求为目标,这不是更好吗?当然,效率、可维护性、可扩展性……等等一大堆话题将会被引入……

这只是我一己之见吧,希望广大园友热烈拍砖~~

下一节,将会带来一些部署方面的说明和探讨。

抱歉!评论已关闭.