装配中的脑袋

用程序装配大脑,再用大脑装配程序
随笔 - 118, 评论 - 1214, 引用 - 11

导航

关于

如果想发较大的信件,请用Ninputer @ gmail.com

不要在我的Blog评论中张贴广告,除非同意向我付款。

标签

每月存档

最新留言

广告

 

这是我第一次发Office开发相关的帖子。说到Office开发,我只能算新手。这次是碰巧开发了一个Excel智能文档项目,其中用到了这个小小的技巧,就发出来让大家看看。
在Excel开发中,工作表上最基本也是最常用的元素就是Range,Range可以表达一个获任意多个单元格或者矩形区域的组合,其复杂程度相当高。如果我们的智能文档程序要与用户打交道的话,势必要编程控制文档中的单元格,或与用户选择的单元格交互。而Range的对象模型并不符合.NET开发人员的习惯,要想获取用户选中区域的形状或者操作特定形状的区域都十分繁琐。而MSDN和VSTO的推销人员们只关心诸如怎么把单元格和数据源或者XML绑定之类,这种“小事”只能靠我们自己动手了。我的任务就是编写一个Range的封装类,将Range中所有单元格和矩形区域转化为易于访问的对象模型。首先我们看看Range的组成,一个普通的Range可以是一个或多个矩形区域的集合,每个矩形区域都由一组连续的列和连续的行组成。其中行使用阿拉伯数字索引,而列采用字母索引。如图所示:

注意,多个矩形区域可以不连续,还可以交叠。每个Range都有一个描述其位置的字符串,称为Range的地址字符串。地址字符串不但包含所有位置信息,还可以被Excel用来直接快速定位,所以我们就以地址字符串为桥梁,编写我们的包装类。
ColumnWrapper类:主要用于吧表示列的字符串“A”,“B”,“AA”等转化为1开始的整数序列,或者相反。我这里用到的算法可以支持无限大的整数与列名字符串互转,但其实Excel只支持到256列。

ColumnWrapper

有了ColumnWrapper,下面就是CellWrapper,表示单个单元格。
CellWrapper

接下来我们要表示矩形区域RectRangeWrapper。我们用来表示矩形区域。当我们需要计算矩形区域的大小时,只要使用着两个角单元格的位置信息即可算出。
RectRangeWrapper

最后是多个矩形区域组成的完整Range,我们用MultiRectRangeWrapper类来描述。它其实就是一个矩形区域的集合。
MultiRectRangeWrapper

好了,现在四个包装类已经全部写完了。用法就简单多了。用Range.Address属性初始化MultiRectRangeWrapper类,就可以得到一个该Range中所有矩形区域的集合,进而轻松访问该举行区域中每个单元格。比如下面这个例子,展示了一些简单的区域操作:
'取得用户选定的区域
Dim myrange As New MultiRectRangeWrapper(Application.Selection.Address)
For Each rectRange As RectRangeWrapper In myrange.Areas
    
If Not rectRange.IsWideRange Then
        
'非扩展选择的区域,比如整行或整列
        '修改左上角的数字格式
        Me.Range(rectRange.LeftTopCell.Address).NumberFormat = "0.00"

        
'将最后一个选中区域复制到剪贴版
        Me.Range(rectRange.Address).Cut()
    
End If
Next

我写这个只是为了我自己写程序方便,并没有考虑太多因素,所以可能写得比较粗糙,功能有限。有兴趣的可以在我这程序的基础上继续改进。

打印 | 张贴于 2006-03-23 11:49:00 | Tag:技术随笔

留言反馈

#re: Excel开发(VSTO2005):简化工作表中选定区域的操作。 编辑
听了vs.net 2005 的讲课,过来遛遛。
2006-04-13 09:04:00 | [匿名:中国搜]
#re: Excel开发(VSTO2005):简化工作表中选定区域的操作。 编辑
dll?
2006-03-23 16:48:00 | [匿名:ayya__#hotmail.com]
#re: Excel开发(VSTO2005):简化工作表中选定区域的操作。 编辑
你贴的代码好酷阿,怎么弄得呢,能不能以评论的形式在我的随笔里,一定会让我蓬荜生辉。
2006-03-23 16:08:00 | [匿名:天生舞男]
#re: Excel开发(VSTO2005):简化工作表中选定区域的操作。 编辑
@zz

微软应该不太愿意让你这么做。。
2006-03-23 14:18:00 | [匿名:Ninputer]
#re: Excel开发(VSTO2005):简化工作表中选定区域的操作。 编辑
不知能否将利用EXCEL的强大功能作成程序发布,脱离EXCEL运行???
2006-03-23 14:13:00 | [匿名:zz]
#re: Excel开发(VSTO2005):简化工作表中选定区域的操作。 编辑
类在哪里呀?
2006-03-23 13:58:00 | [匿名:margiex]
#re: Excel开发(VSTO2005):简化工作表中选定区域的操作。 编辑
@wayfarer

刚才有问题,现在好了。。
2006-03-23 13:58:00 | [匿名:Ninputer]
#re: Excel开发(VSTO2005):简化工作表中选定区域的操作。 编辑
怎么展不开代码啊?
2006-03-23 13:51:00 | [匿名:wayfarer]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0