图形更多操作

本节介绍工作表中图形的遍历、图形在工作表中的定位以及动画的实现。

遍历工作表中的图形

工作表对象的Shapes属性返回一个Shapes对象,它是一个集合,包含该工作表对象中的所有Shape对象,即所有图形。

用Shapes对象的Count属性,可以获取该集合中图形的个数。下面向工作表sht中添加一个矩形区域、一个椭圆区域和一条直线段,用Shapes对象的Count属性返回集合中图形的个数。

code.python
>>> shp1=sht.api.Shapes.AddShape(1, 50, 50, 200, 100)  #矩形区域
>>> shp2=sht.api.Shapes.AddShape(9, 30, 80, 200, 100)  #椭圆区域
>>> shp2.Fill.ForeColor.RGB=xw.utils.rgb_to_int((255,0,0))
>>> shp2.Fill.Transparency=0.7
>>> shp3=sht.api.Shapes.AddLine(10,10,200,120)  #直线段
>>> sht.api.Shapes.Count  #工作表中Shape对象的个数
3

然后用for循环获取每个图形的名称、图形类型、左上角横坐标、左上角纵坐标、宽度和高度。

code.python
>>> sht.range("F1").value=["名称","类型","左上角横坐标","左上角纵坐标","宽度","高度"]  #表头
>>> i=0
>>> for shp in sht.api.Shapes:  #遍历工作表中每个Shape对象
		i+=1
		sht.api.Cells(i+1, "F").Value=shp.Name  #输出每个Shape对象的属性
		sht.api.Cells(i+1, "G").Value=shp.Type
		sht.api.Cells(i+1, "H").Value=shp.Left
		sht.api.Cells(i+1, "I").Value=shp.Top
		sht.api.Cells(i+1, "J").Value=shp.Width
		sht.api.Cells(i+1, "K").Value=shp.Height

结果如图4-45所示。

Document Image

图4-45 用遍历输出各图形的属性值

使用Shape对象的Type属性可以获取图形的类型。对集合中的图形进行遍历时,经常需要判断图形的类型,以便对某一类型的图形进行处理。表4-21中列出了全部可用的Type属性取值。

表4-21 表示图形类型的Type属性的取值

名 称 说 明
mso3DModel 30 3d 模型
msoAutoShape 1 自选图形
msoCallout 2 标注
msoCanvas 20 画布
msoChart 3 图表
msoComment 4 批注
msoContentApp 27 内容Office插件
msoDiagram 21 流程图
msoEmbeddedOLEObject 7 嵌入式OLE对象
msoFormControl 8 表单控件
msoFreeform 5 Freeform
msoGraphic 28 图形
msoGroup 6 图形块
msoIgxGraphic 24 SmartArt图形
msoInk 22 墨迹
msoInkComment 23 墨迹批注
msoLine 9 直线段
msoLinked3DModel 31 链接的3d模型
msoLinkedGraphic 29 链接的图形
msoLinkedOLEObject 10 链接的OLE对象
msoLinkedPicture 11 链接的图片
msoMedia 16 媒体
msoOLEControlObject 12 OLE控件对象
msoPicture 13 图片
msoPlaceholder 14 占位符
msoScriptAnchor 18 脚本定位标记
msoShapeTypeMixed -2 混和图形类型
msoTable 19
msoTextBox 17 文本框
msoTextEffect 15 艺术字
msoWebVideo 26 Web视频

下面遍历集合,统计集合中自选图形的个数。

code.python
>>> i=0
>>> for shp in sht.api.Shapes:  #遍历集合
		if(shp.Type==1):  #如果为自选图形
			i+=1  #累计个数
>>> print("有"+str(i)+ "个自选图形。")
有2个自选图形。

下面遍历集合,清空工作表sht中的所有图形。

code.python
>>> for shp in sht.api.Shapes:
		shp.Delete()
>>> sht.api.Shapes.Count
0

固定图形在工作表中的位置

通过绑定图形和工作表中单元格或区域的位置和大小,可以将图形固定在工作表的指定单元格或区域中。图形或单元格(区域)的位置用其左上角的坐标指定,用到Left和Top两个属性,表示左上角的横坐标和纵坐标;图形或单元格(区域)的大小用其宽度和高度指定,对应于Width和Height两个属性。

下面创建一个椭圆区域,将它固定到工作表sht的C3:E5区域。

code.python
>>> shp=sht.api.Shapes.AddShape(9, 30, 80, 200, 100)
>>> rng=sht.api.Range("C3:E5")
>>> shp.Left=rng.Left+1  #根据图形和区域的位置和形状属性进行固定
>>> shp.Top=rng.Top+1
>>> shp.Width=rng.Width-2
>>> shp.Height=rng.Height-2

效果如图4-46所示。调整左上角的位置,椭圆区域会跟着移动,保持其相对位置不变。

Document Image

图4-46 固定图形在工作表中的位置

动画

实现动画有两个关键操作,一是图形的动态绘制,比如不断修改图形的位置、大小或颜色;二是延时,即每一步都放慢,不要过得太快。动态部分,改变位置可以通过修改图形的Left属性和Top属性实现,也可以通过几何变换实现;延时部分可以用time包提供的sleep方法实现,该方法提供毫秒级的延时。

下面创建一个简单的动画,将一个窄长的矩形绕其形心旋转一周,整个旋转分36步完成,每步顺时针方向旋转10度,每旋转一步停留1秒。旋转用Shape对象的IncrementRotation方法通过旋转变换实现。注意该旋转的角度是相对于前一步的位置计算的,不是相对原始位置计算。整个动态过程用一个循环进行控制。需要首先导入time包。

code.python
>>> import time  #导入time模块
>>> shp=sht.api.Shapes.AddShape(1, 100, 100, 200, 20)  #矩形区域
>>> shp.Fill.PresetTextured(5)  #预设纹理
>>> for i in range(36):  #循环,动画次数
shp.IncrementRotation(10)  #每次动画顺时针旋转10度
time.sleep(1)  #每次动画延时1秒

生成图4-47所示旋转动画,类似钟表指针的轨迹。[大谦Excel,dqexcel点com]

Document Image

图4-47 旋转动画