图片也是组成图表的基本图形元素。常将图片用于面的填充,或直接在图表中添加图片作为标注。本节介绍图片的创建和几何变换。[大谦Excel,dqexcel点com]
添加图片
使用Shape对象的AddPicture方法从现有文件创建图片。 该方法返回一个表示新图片的Shape对象。该方法的语法格式为:
code.python
sht.api.Shapes.AddPicture(FileName,LinkToFile,SaveWithDocument,Left,Top,Width,Height)
其中,sht为工作表。各参数的意义如表2-14中所示。
表2-14 AddPicture方法各参数的意义
| 名 称 | 必需/可选 | 数据类型 | 说 明 |
|---|---|---|---|
| FileName | 必需 | String | 图片文件名 |
| LinkToFile | 必需 | MsoTriState | 设置为False时,使图片成为文件的独立副本,不链接。设置为True时将图片链接到创建它的文件 |
| SaveWithDocument | 必需 | MsoTriState | 将图片与文档一起保存。使用False仅将链接信息存储在文档中。 使用True将链接的图片与插入到的文档一起保存。 如果LinkToFile的值为 False,则此参数必须为 True |
| Left | 必需 | Single | 图片左上角相对于文档左上角的位置 (以磅为单位) |
| Top | 必需 | Single | 图片左上角相对于文档顶部的位置(以磅为单位) |
| Width | 必需 | Single | 图片的宽度, 以磅为单位 (输入-1 可保留现有文件的宽度) |
| Height | 必需 | Single | 图片的高度, 以磅为单位 (输入-1 可保留现有文件的高度) |
本示例将一张图片添加到图表坐标系中。完整代码见:Samples->ch05 创建新图表->44 添加图片->py.py。
code.python
#... 省略部分代码
cht.SeriesCollection().NewSeries() #新建序列
cht.Shapes.AddPicture(r'd:\picpy.jpg',True,True,100,50,100,100) #添加图片
效果如图2-48所示。
\[\]
图2-48 创建图片
图片的几何变换
2.6节介绍了图形的几何变换,使用Shape对象提供的方法,可以对给定的图形进行平移变换、旋转变换、比例变换和对称变换。在实现方法上,图片几何变换的完全相同。
下面利用指定文件创建图片后,对它连续进行旋转变换和水平对称变换。完整代码见:Samples->ch05 创建新图表->45 图片的几何变换->py.py。
code.python
#... 省略部分代码
cht.SeriesCollection().NewSeries() #新建序列
shp2=cht.Shapes.AddPicture(r'd:\picpy.jpg',True,True,100,50,100,100) #添加图片
shp2.IncrementRotation(30) #绕中心顺时针方向旋转30度
shp2.Flip(0) #水平翻转
旋转变换和对称变换后的图片如图2-49所示。注意,对称变换是在前面旋转变换结果的基础上进行的,而不是针对原始图片。
\[\]
图2-49 对图片作旋转变换
在图表中添加图片
图2-50将一组数据从大到小排序后,利用排序数据绘制简单柱状图。然后在图表中添加一张箭头图片,指示柱状图中柱面从高到低的下降趋势。
\[\]
图2-50 带误差条的柱状图
图片导入图表中后,其位置和大小可能需要调整,就要用到2.7.2小节介绍的图片几何变换的知识。
下面的代码创建柱状图并添加箭头图片,然后将图片在水平方向和垂直方向上进行缩放变换,以调整到合适的大小。完整代码见:Samples->ch05 创建新图表->46 在图表中添加图片->py.py。
code.python
root=os.getcwd() #获取当前工作路径
app=xw.App(visible=True,add_book=False) #创建Excel应用
wb=app.books.open(root+r'/data.xlsx',read_only=False) #打开数据文件返回工作簿对象
sht=wb.sheets('Sheet1') #获取指定工作表对象
data=sht.range('B2:B7').value #获取数据
app.kill() #退出应用
#从comtypes包中导入CreateObject函数
from comtypes.client import CreateObject
app2=CreateObject("Excel.Application") #创建Excel应用
app2.Visible=True #应用窗口可见
#app2.ScreenUpdating=False
wb2=app2.Workbooks.Open(root+r'/data.xlsx') #添加工作簿
sht2=wb2.Sheets('Sheet1') #获取第1个工作表
shp=sht2.Shapes.AddChart2() #创建空白图表
shp.Left=20
cht=shp.Chart #获取图表
cht.ChartType=-4169 #散点图
ax1=cht.Axes(1) #获取横轴
ax2=cht.Axes(2) #获取纵轴
ax1.MinimumScale=0 #横轴最小值
ax1.MaximumScale=7
ax2.MinimumScale=0 #纵轴最小值
ax2.MaximumScale=0.7
set_style(cht) #设置样式
cht.SeriesCollection().NewSeries() #新建序列
#绘制柱状图
draw_bar(cht,data[0],1,76,200,132,0.5,False)
draw_bar(cht,data[1],2,76,200,132,0.5,False)
draw_bar(cht,data[2],3,76,200,132,0.5,False)
draw_bar(cht,data[3],4,76,200,132,0.5,False)
draw_bar(cht,data[4],5,76,200,132,0.5,False)
draw_bar(cht,data[5],6,76,200,132,0.5,False)
#添加图片并通过几何变换缩放到合适的大小
x=shape_x(cht,2.6)
y=shape_y(cht,0.55)
w=cht.PlotArea.InsideWidth/(ax1.MaximumScale-ax1.MinimumScale)*4
h=cht.PlotArea.InsideHeight/(ax2.MaximumScale-ax2.MinimumScale)*0.4
shp2=cht.Shapes.AddPicture(r"d:\arrow.png",True,True,x,y,w,h) #添加图片
shp2.ScaleWidth(0.7, False) #缩放变换
shp2.ScaleHeight(0.7, False)
运行代码生成图2-50.。