博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[VSTO系列]三、简单的UI设计/QQ联系人导出(下)
阅读量:4549 次
发布时间:2019-06-08

本文共 2522 字,大约阅读时间需要 8 分钟。

接上一篇:,我们通过VSTO,简单的使用了Ribbon控件,以及如何从QQ邮箱导出联系人。

在有了这些基础之后,我们来开始一个比较复杂的实验吧,这回,我们将对那个生成的联系人Excel文档进行处理,提取出每个好友的QQ号码,然后再将这些号码对应的复制到这些联系人后面。具体效果如何,还是慢慢来看。

慢慢来——

首先,还是建立一个Excel2007的外接程序项目,然后向项目中添加项,选择Office——>功能区(可视化设计),如下图:

功能区

我们双击新添加的那个文件,即可打开UI设计界面。

双击

接下来呢,我们就要开始编辑Ribbon1的设计界面了,拖放一个Button空间到Group中,如下图:

拖放

我们的程序见面如下所示:

2011021014155754.jpg

粗略的设计就是如此,大家可以花点时间,慢慢研究Ribbon自带的各类控件的使用,相信通过一段时间,大家能够设计出自己所喜欢的外观。在这里就仅作演示吧。

我们要做什么——

接下来,我们开始最关键的代码编写工作了,首先,我们要明白三件事:

  • 获取某一列的所有单元格数据
  • 处理每一个单元格的数据
  • 把处理后的数据添加到指定列中进行显示

所以,很明确,我们的代码也分为这几步,首先,获取当前的工作薄,其中的某一个区域,我们使用get_range方法来实现,就本例子而言呢,腾讯邮箱生成的那个联系人表格,B列,是每个人的QQ邮箱,我们的QQ号码就从这里提取,提取到邮箱后,把@符号及之后的字符去掉,保留前端的QQ号码,并把处理过后的结果,放到该表格的指定列里面。大致意图,如下所示:

2011021014220844.jpg

当然了,上图所示,绿色区域为指定的显示列,红色区域为待处理,实际中,绿色的部分可以随意指定。在这里也是举个例子罢了。好啦,有图了,接下来是寻求真相的过程。

通过之前的分析,我们需要先铺垫个小知识:

如何获取一定区域(范围)的单元格?

这个相信大家谷歌一下绝对能找出方法,这里就不在赘述,此文的方法为使用Worksheet的get_range方法,在MSDN中,详细的介绍了此方法的使用,小弟也给出地址,大家可以慢慢参考:

这是一个英文地址,为什么呢?主要是它比较关键的说道,在这个方法的参数中,可以使用语意参数,比如,我要获取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,至此,这个程序就制作完毕了,下面就是来看看运行效果对不对,测试结果如下图:

2011021014432849.jpg

2011021014435493.jpg

2011021014440849.jpg

小结:

大家也许看到了吧,如果联系人用了一个文字类的邮箱替代了QQ号码邮箱,则这个结果是文字的,并不能够当做QQ号码来用,所以,这次示例的局限性也很明显,收到了联系人表格的限制,不过,我们也从简单的RibbonUI设计,走到了具体的Excel对象操作,接下来,还有各种各样的Excel对象操作,内容包罗万象,可想而知不是一个系列就能写完的,我们关注的是VSTO能给我们带来什么新的变化。

试想,客户已经基于Office套件,进行着各类业务数据的存储、处理,相对来说,比较成熟。但是某一天,他需要对Excel表格数据进行一些不大不小的分析,比如报表、统计等等。难道我们给他从Asp.net开始……Bla……Bla。

我们换个思路,紧紧抓住客户最关心的业务来开展我们的工作,直接为Excel客户端开发Add-In级别的插件,以解决最实际的需求为目标,这不是更好吗?当然,效率、可维护性、可扩展性……等等一大堆话题将会被引入……

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

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

转载于:https://www.cnblogs.com/longqi293/archive/2011/02/10/vstoforexcel3.html

你可能感兴趣的文章
有两种分别用<bgsound>和<embed></embed>标签,当用<embed>插入背景音乐时可以设置宽度和高度为0,隐藏播放器。...
查看>>
JavaI/O(输入/输出)
查看>>
电文保密
查看>>
dhcpd已分配动态分配地址管理工具DHCPd Tools
查看>>
mysql,命令导入\导出表结构或数据
查看>>
easyui datagrid的API
查看>>
linux 上修改了nginx.conf 怎么重新加载配置文件生效
查看>>
比较:I/O成员函数getline() 与 get()(第二种用法)的用法异同
查看>>
哪里有好用的电脑pdf编辑器免费版
查看>>
开发简单的Kafka应用
查看>>
PL/0 词法分析
查看>>
Eclipse配置--智能补全
查看>>
MySQL查看索引、表信息、触发器
查看>>
ThreadLocal
查看>>
mysql 根据一张表更新另一张表
查看>>
java 反射与JVM
查看>>
使用maven打包项目遇到错误: http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException...
查看>>
【IDEA】IDEA中部署的项目添加Tomcat自带的一些项目
查看>>
队列Q(Wannafly挑战赛19)
查看>>
前台数据Json的转换和后台的保存
查看>>