图片操作

图片也是组成图表的基本图形元素。常将图片用于面的填充,或直接在图表中添加图片作为标注。本节介绍图片的创建和几何变换。[大谦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所示。

Document Image
\[\]

图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所示。注意,对称变换是在前面旋转变换结果的基础上进行的,而不是针对原始图片。

Document Image
\[\]

图2-49 对图片作旋转变换

在图表中添加图片

图2-50将一组数据从大到小排序后,利用排序数据绘制简单柱状图。然后在图表中添加一张箭头图片,指示柱状图中柱面从高到低的下降趋势。

Document Image
\[\]

图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.。