本节介绍工作表中图形的遍历、图形在工作表中的定位以及动画的实现。
遍历工作表中的图形
工作表对象的Shapes属性返回一个Shapes对象,它是一个集合,包含该工作表对象中的所有Shape对象,即所有图形。
用Shapes对象的Count属性,可以获取该集合中图形的个数。下面向工作表sht中添加一个矩形区域、一个椭圆区域和一条直线段,用Shapes对象的Count属性返回集合中图形的个数。
>>> 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循环获取每个图形的名称、图形类型、左上角横坐标、左上角纵坐标、宽度和高度。
>>> 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所示。
图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视频 |
下面遍历集合,统计集合中自选图形的个数。
>>> i=0
>>> for shp in sht.api.Shapes: #遍历集合
if(shp.Type==1): #如果为自选图形
i+=1 #累计个数
>>> print("有"+str(i)+ "个自选图形。")
有2个自选图形。
下面遍历集合,清空工作表sht中的所有图形。
>>> for shp in sht.api.Shapes:
shp.Delete()
>>> sht.api.Shapes.Count
0
固定图形在工作表中的位置
通过绑定图形和工作表中单元格或区域的位置和大小,可以将图形固定在工作表的指定单元格或区域中。图形或单元格(区域)的位置用其左上角的坐标指定,用到Left和Top两个属性,表示左上角的横坐标和纵坐标;图形或单元格(区域)的大小用其宽度和高度指定,对应于Width和Height两个属性。
下面创建一个椭圆区域,将它固定到工作表sht的C3:E5区域。
>>> 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所示。调整左上角的位置,椭圆区域会跟着移动,保持其相对位置不变。
图4-46 固定图形在工作表中的位置
动画
实现动画有两个关键操作,一是图形的动态绘制,比如不断修改图形的位置、大小或颜色;二是延时,即每一步都放慢,不要过得太快。动态部分,改变位置可以通过修改图形的Left属性和Top属性实现,也可以通过几何变换实现;延时部分可以用time包提供的sleep方法实现,该方法提供毫秒级的延时。
下面创建一个简单的动画,将一个窄长的矩形绕其形心旋转一周,整个旋转分36步完成,每步顺时针方向旋转10度,每旋转一步停留1秒。旋转用Shape对象的IncrementRotation方法通过旋转变换实现。注意该旋转的角度是相对于前一步的位置计算的,不是相对原始位置计算。整个动态过程用一个循环进行控制。需要首先导入time包。
>>> 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]
图4-47 旋转动画