图形属性设置

本节主要介绍图形颜色的设置、线形图元的属性设置、区域图元的属性设置、多义线和曲线顶点属性设置、文本属性设置等内容。[大谦Excel,dqexcel点com]

颜色设置

关于图形的颜色,Excel提供了4种设置方法,即RGB着色、主题颜色着色、配色方案着色和索引着色。图形对象,不管是线形对象还是面对象,它们的BackColor属性和ForeColor属性都会返回一个ColorFormat对象,该对象提供了RGB, ObjectThemeColor, SchemeColor等属性,用它们设置RGB着色、主题颜色着色和配色方案着色。

一、RGB颜色着色

所谓RGB颜色着色,就是用红色、绿色和兰色分量来定义颜色。使用图形对象的Color属性设置RGB颜色着色。如果习惯于指定RGB分量来设置颜色,可以使用xlwings.utils模块中的rgb_to_int方法将类似(255,0,0)的RGB分量指定转换为整型值,然后设置给Color属性。

下面用绿色绘制圆形区域,用兰色绘制圆形边线。代码中ForeColor属性返回一个ColorFormat对象,用它的RGB属性设置RGB着色。

code.python
>>> shp=sht.api.Shapes.AddShape(9, 50, 50, 100, 100)
>>> shp.Fill.ForeColor.RGB=xw.utils.rgb_to_int((0, 255,0))
>>> shp.Line.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255))

效果如图4-18所示。

Document Image

图4-18 RGB颜色着色

也可以直接将一个表示颜色的整数,也就是xw.utils.rgb_to_int()函数的结果赋给RGB属性。

code.python
>>> shp=sht.api.Shapes.AddShape(9, 50, 50, 100, 100)
>>> shp.Fill.ForeColor.RGB= 65280
>>> shp.Line.ForeColor.RGB= 16711680

也可以直接将一个十六进制的颜色值赋给RGB属性。

>>> shp.Line.ForeColor.RGB=0xFF0000

二、主题颜色着色

Excel提供了10余种主题颜色,如表4-12中所示。使用这些主题颜色,可以很方便地给图形着色。

表4-12 主题颜色

名 称 说 明
xlThemeColorAccent1 5 Accent1
xlThemeColorAccent2 6 Accent2
xlThemeColorAccent3 7 Accent3
xlThemeColorAccent4 8 Accent4
xlThemeColorAccent5 9 Accent5
xlThemeColorAccent6 10 Accent6
xlThemeColorDark1 1 Dark1
xlThemeColorDark2 3 Dark2
xlThemeColorFollowedHyperlink 12 Followed hyperlink
xlThemeColorHyperlink 11 Hyperlink
xlThemeColorLight1 2 Light1
xlThemeColorLight2 4 Light2

对于图形对象,使用ForeColor属性和BackColor属性返回的ColorFormat对象的ObjectThemeColor属性,进行主题颜色着色。

code.python
>>> shp=sht.api.Shapes.AddShape(9, 50, 50, 100, 100)
>>> shp.Fill.ForeColor.ObjectThemeColor=10
>>> shp.Line.ForeColor.ObjectThemeColor=3

三、配色方案着色

利用Excel提供的配色方案中的颜色,也可以给图形对象着色。对于图形对象, ForeColor属性和BackColor属性返回的ColorFormat对象有一个SchemeColor属性,而配色方案中的每个颜色都有一个索引号,将它指定给SchemeColor属性即可。

code.python
>>> shp=sht.api.Shapes.AddShape(9, 50, 50, 100, 100)
>>> shp.Fill.ForeColor.SchemeColor=3
>>> shp.Line.ForeColor.SchemeColor=4

四、索引着色

索引着色,预先给定一些颜色,组成一个所谓的颜色查找表。在表中,每种颜色有一个唯一的索引号。如图4-19所示。进行索引着色时,将某个索引号指定给相关的索引着色属性就可以了。

Document Image

图4-19 颜色查找表

索引着色常常用于控件和字体的着色。下面将工作表sht中单元格C3的字体颜色设置为红色。

code.python
>>> sht.api.Range("C3").Font.ColorIndex=3
>>> sht.api.Range("C3").Value="Hello"

线条属性-LineFormat对象

在Excel图形对象中,线形对象用LineFormat对象表示。Shape对象的Line属性返回LineFormat对象,例如直线段本身、矩形区域和圆形区域的边、标注的引线等都是LineFormat对象。

例如下面:

code.python
>>> shp=sht.api.Shapes.AddLine(10,10,50,50)
>>> lf=shp.Line

shp是一个表示直线段的Shape对象,它的Line属性返回一个表示直线段本身的LineFormat对象。

又比如:

code.python
>>> shp=sht.api.Shapes.AddShape(9, 50, 50, 200, 100)
>>> lf=shp.Line

shp是一个表示椭圆形区域的Shape对象,它的Line属性返回一个表示椭圆形区域边线的LineFormat对象。

得到LineFormat对象以后,就可以用该对象的属性和方法进行编程。下面两小节内容详细介绍LineFormat对象,即线形对象颜色、线型、线宽、箭头、透明度和图案填充等属性的设置。

线条属性-颜色、线型和线宽

用LineFormat对象的ForeColor属性设置线条的颜色。可以用RGB着色、主题颜色着色、配色方案着色等几种方法进行着色,在4.2.1小节已经进行了比较详细的介绍,请参阅。

用LineFormat对象的DashStyle属性设置线条的线型,可用线型如表4-13中所示。

表4-13 可用线型

名 称 说 明
msoLineDash 4 虚线
msoLineDashDot 5 点虚线
msoLineDashDotDot 6 点点虚线
msoLineDashStyleMixed -2 不支持
msoLineLongDash 7 长虚线
msoLineLongDashDot 8 长点虚线
msoLineRoundDot 3 圆点线
msoLineSolid 1 实线
msoLineSquareDot 2 方点线

用LineFormat对象的Weight属性设置线条的线宽。给该属性设置一个Single型值,表示线条的粗细。

下面创建一个直线段对象和一个椭圆形区域对象,获取对象中的线形对象,然后设置它们的颜色、线型和线宽。

code.python
>>> shp=sht.api.Shapes.AddLine(20, 20, 100, 120)
>>> lf=shp.Line
>>> lf.ForeColor.RGB=xw.utils.rgb_to_int((255,0,0))  #红色
>>> lf.DashStyle=5  #线型,点虚线
>>> lf.Weight=3  #线宽
>>> shp2=sht.api.Shapes.AddShape(9, 200, 30, 120, 80)
>>> lf2=shp2.Line  #圆形区域中的线形对象,即区域的边
>>> lf2.ForeColor.RGB=xw.utils.rgb_to_int((255,0,0))  #红色
>>> lf2.DashStyle=3  #线型,圆点线
>>> lf2.Weight=4  #线宽

生成图4-20。

Document Image

图4-20 设置线形对象的颜色、线型和线宽

线条属性-箭头、透明度和图案填充

可以给直线段两端添加箭头。LineFormat对象跟箭头有关的属性包括:

• BeginArrowheadLength属性:设置或获取起点处箭头的长度。

• BeginArrowheadStyle属性:设置或获取起点处箭头的样式。

• BeginArrowheadWidth属性:设置或获取起点处箭头的宽度。

• EndArrowheadLength属性:设置或获取终点处箭头的长度。

• EndArrowheadStyle属性:设置或获取终点处箭头的样式。

• EndArrowheadWidth属性:设置或获取终点处箭头的宽度。

其中,箭头的长度有3个取值,用1, 2和3表示短、中和长。箭头的宽度也有3个取值,用1, 2和3表示窄、中和宽。箭头样式的设置可以从表4-14中取值。

表4-14 箭头的样式

名 称 说 明
msoArrowheadDiamond 5 菱形
msoArrowheadNone 1 无箭头
msoArrowheadOpen 3 打开
msoArrowheadOval 6 椭圆形
msoArrowheadStealth 4 隐匿形状
msoArrowheadStyleMixed -2 只返回值,表示其他状态的组合
msoArrowheadTriangle 2 三角形

下面向工作表sht中添加一条两端有箭头的直线段。在该线条的起点处为一椭圆, 终点处为三角形。

code.python
>>> shp=sht.api.Shapes.AddLine(80, 50, 200, 300)  #创建直线段Shape对象
>>> lf=shp.Line  #获取线形对象
>>> lf.Weight=2  #线宽
>>> lf.BeginArrowheadLength=1  #起点处箭头长度
>>> lf.BeginArrowheadStyle=6  #起点处箭头样式
>>> lf.BeginArrowheadWidth=1  #起点处箭头宽度
>>> lf.EndArrowheadLength=3  #终点处箭头长度
>>> lf.EndArrowheadStyle=2  #终点处箭头样式
>>> lf.EndArrowheadWidth=3  #终点处箭头宽度

生成图4-21所示的图形。

Document Image

图4-21 给直线段添加箭头

用LineFormat对象的Transparency属性设置或获取线条的透明性,取值范围为0.0(不透明)到1.0(清晰)之间。

下面的例子先绘制一个兰色椭圆区域作为背景,然后绘制两条线宽为8的红色直线段,一条不透明,另一条透明度为0.7。

code.python
>>> sht.api.Shapes.AddShape(9, 150, 50, 200, 100)  #椭圆区域
>>> shp=sht.api.Shapes.AddLine(100, 75, 400, 75)  #直线段
>>> shp.Line.Weight=8  #线宽
>>> shp.Line.ForeColor.RGB=xw.utils.rgb_to_int((255,0,0))  #红色
>>> shp2=sht.api.Shapes.AddLine(100, 125, 400, 125)  #第2条直线段
>>> shp2.Line.Weight=8  #线宽
>>> shp2.Line.ForeColor.RGB=xw.utils.rgb_to_int((255,0,0))  #红色
>>> shp2.Line.Transparency=0.7  #透明度0.70~1

效果如图4-22所示。可见,下面一条直线段因为设置透明度为0.7,可以透过它看到底下的兰色椭圆区域。

Document Image

图4-22 设置线条的透明度

使用LineFormat对象的Pattern属性,可以对线形对象进行图案填充。该属性设置或返回一个MsoPatternType枚举类型的值,它表示填充的图案。可以从表4-15中取值。该表中列出了部分填充图案,更多图案,请参见微软官方文档。

表4-15 填充图案(部分)

名 称 说 明
msoPatternCross 51 交叉网格
msoPatternDarkDownwardDiagonal 15 黑色向下的对角线
msoPatternDarkHorizontal 13 黑色水平线
msoPatternDarkUpwardDiagonal 16 黑色向上的对角线
msoPatternDarkVertical 14 黑色垂直线
msoPatternHorizontal 49 水平线
msoPatternVertical 50 垂直线
msoPatternSmallGrid 23 小网格
msoPatternWave 48 波纹
……

下面创建一条线宽为8的直线段,设置其填充图案为波纹。

code.python
>>> shp=sht.api.Shapes.AddLine(100, 55, 400, 125)
>>> shp.Line.Weight=8
>>> shp.Line.Pattern=16  #给直线段设置图案填充

效果如图4-23所示。

Document Image

图4-23 填充波纹图案的直线段

多义线、曲线和多边形的顶点属性

使用Shape对象的Vertices属性,可以获取多义线、多边形和贝塞尔曲线的顶点坐标。可以提取坐标,也可以利用原对象的坐标创建新的图形。

4.1节讲到了,用xlwings包和Win32COM包创建多义线和曲线时存在问题,我们用COMTypes包测试获得成功。所以,本小节的内容需要使用COMTypes包,使用之前,如果没有安装,请在DOS命令窗口中用pip install comtypes进行安装。

下面首先用COMTypes包创建一条贝塞尔曲线shp2,关于曲线创建的细节大家请参见4.1节内容,这里不再赘述。

code.python
>>> from comtypes.client import CreateObject  #使用comtypes包
>>> app2=CreateObject("Excel.Application")
>>> app2.Visible=True
>>> bk2=app2.Workbooks.Add()
>>> sht2=bk2.Sheets(1)
>>> pts=[[0,0],[72,72],[100,40],[20,50],[90,120],[60,30],[150,90]]
>>> shp2=sht2.Shapes.AddCurve(pts)

用Shape对象的Vertices属性获取该曲线的顶点坐标,把它读入到一个二维数组。

code.python
>>> vertArray=shp2.Vertices  #获取多边形的顶点
>>> vertArray
((0.0, 0.0), (72.0, 72.0), (100.0, 40.0), (20.0, 50.0), (90.0, 120.0), (60.0, 30.0), (150.0, 90.0))

通过索引读取前两个顶点的坐标。

code.python
>>> x1=vertArray[0][0]
>>> y1=vertArray[0][1]
>>> x1
0.0
>>> y1
0.0
>>> x2=vertArray[1][0]
>>> y2=vertArray[1][1]
>>> x2
72.0
>>> y2
72.0

利用已有贝塞尔曲线shp2的顶点创建一个新的曲线shp3。

code.python
>>> shp3=sht2.Shapes.AddCurve(shp2.Vertices)

创建以后,两条曲线是重叠的。用鼠标拖拉操作把它们分开,如图4-24所示。

Document Image

图4-24 利用原有曲线的顶点创建新曲线

面的属性-FillFormat对象、颜色和透明度

点、线、面是基本的图形元素。前面介绍了线的属性设置,接下来介绍面的属性设置。4.1节介绍的矩形、椭圆、圆、多边形区域都属于面,是具有2至3个维度的图形。

Excel中,用FillFormat对象表示面。利用Shape对象的Fill属性可以获取到该对象中的FillFormat对象,即面对象,然后对该对象的成员进行编程。

下面用Shapes对象的AddShape方法创建一个矩形区域,该方法返回一个表示矩形区域的Shape对象。它实际上由两部分组成,一是内部的区域,是一个面,另一个是区域的边线,是一条线。面是FillFormat对象,线是LineFormat对象。LineFormat对象前面已经介绍了。下面第2行代码用Shape对象的Fill属性获取该对象中区域的部分。

code.python
>>> shp1=sht.api.Shapes.AddShape(1, 100, 50, 200, 100)
>>> ff1=shp1.Fill

下面创建椭圆形区域,并用Shape对象的Fill属性获取其中区域的部分,即FillFormat对象。

code.python
>>> shp2=sht.api.Shapes.AddShape(9, 50, 50, 200, 100)
>>> ff2=shp2.Fill

把图形对象中区域,即面的部分提取出来,即得到FillFormat对象以后,就可以用该对象的属性和方法进行编程,进行更多的设置和操作。

使用FillFormat对象的ForeColor属性,返回一个ColorFormat对象,利用该对象的RGB属性、ObjectThemeColor属性和SchemeColor属性可以对FillFormat对象所表示的面进行RGB着色、主题颜色着色和配色方案着色。关于图形对象的着色,4.2.1小节有详细介绍,请参阅。

下面创建一个矩形区域,用FillFormat对象的ForeColor属性返回的ColorFormat对象的RGB属性将区域默认的兰色修改为绿色。

code.python
>>> shp=sht.api.Shapes.AddShape(1, 150, 50, 200, 100)
>>> ff=shp.Fill  #从矩形区域提取出区域部分
>>> ff.ForeColor.RGB= xw.utils.rgb_to_int((0,255,0))  #改变区域的颜色为绿色

效果如图4-25所示。

Document Image

图4-25 面的着色

用FillFormat对象的Transparency属性设置或获取面的透明性,取值范围为0.0(不透明)到 1.0(清晰)之间。

下面首先绘制一个兰色矩形区域作为背景,然后叠加一个红色椭圆区域,设置它的透明度为0.7。

code.python
>>> shp=sht.api.Shapes.AddShape(1, 200, 50, 200, 100)  #矩形区域
>>> shp2=sht.api.Shapes.AddShape(9, 150, 70, 200, 100)  #椭圆区域
>>> ff=shp2.Fill
>>> ff.ForeColor.RGB= xw.utils.rgb_to_int((255,0,0))  #椭圆区域设置为红色
>>> ff.Transparency=0.7  #透明度0.7

效果如图4-26所示。

Document Image

图4-26 面的透明性

面的属性-单色填充和渐变色填充

创建区域图形以后,可以对其中的面进行填充操作。可用的填充方式包括单色填充、渐变色填充、图案填充、图片填充和纹理填充等。

使用FillFormat对象的Solid方法进行单色填充。下面创建一个椭圆形区域,用红色进行单色填充。

code.python
>>> shp=sht.api.Shapes.AddShape(9, 100, 50, 200, 100)
>>> ff=shp.Fill
>>> ff.Solid
>>> ff.ForeColor.RGB= xw.utils.rgb_to_int((255,0,0))

用FillFormat对象的OneColorGradient方法进行单色渐变色填充。所谓单色渐变色填充,指的是填充的颜色仅有一种颜色色阶的变化。该方法的语法格式为:

ff.OneColorGradient(Style, Variant, Degree)

其中,ff表示一个FillFormat对象。各参数的意义如表4-16中所示。

表4-16 OneColorGradient方法的参数

名 称 必需/可选 数据类型 说 明
Style 必需 MsoGradientStyle 渐变样式
Variant 必需 Integer 渐变变量。 取值范围为1到4。 如果GradientStyle设为 msoGradientFromCenter,则Variant参数只能设为 1 或 2
Degree 必需 Single 渐变程度。 可以为 0.0(暗)到 1.0(亮)之间的值

OneColorGradient方法的Style参数指定渐变填充的样式,其取值如表4-17中所示。

表4-17 OneColorGradient方法的Style参数的取值

名 称 说 明
msoGradientDiagonalDown 4 从左下角到右上角对角渐变
msoGradientDiagonalUp 3 从右下角到左上角对角渐变
msoGradientFromCenter 7 从中心到各个角渐变
msoGradientFromCorner 5 从各个角向中心渐变
msoGradientFromTitle 6 从标题向外的渐变
msoGradientHorizontal 1 水平渐变
msoGradientMixed -2 混和渐变
msoGradientVertical 2 垂向渐变

下面创建一个矩形区域和一个椭圆形区域,矩形区域用红色渐变色填充,从右下角到左上角对角渐变;椭圆形区域用兰色渐变色填充,从中心到各个角渐变。

code.python
>>> shp1=sht.api.Shapes.AddShape(1, 100, 50, 200, 100)  #矩形区域
>>> ff1=shp1.Fill
>>> ff1.ForeColor.RGB= xw.utils.rgb_to_int((255,0,0))
>>> #单色渐变填充,白色到红色,右下角到左上角渐变
>>> ff1.OneColorGradient(3, 1, 1)
>>> shp2=sht.api.Shapes.AddShape(9, 400, 50, 200, 100)  #椭圆区域
>>> ff2=shp2.Fill
>>> ff2.ForeColor.RGB= xw.utils.rgb_to_int((0,0,255))
>>> #单色渐变填充,白色到兰色,中心到各个角渐变
>>> ff2.OneColorGradient(7, 1, 1)

效果如图4-27所示。

Document Image

图4-27 单色渐变色填充

设置OneColorGradient方法的第2个参数和第3个参数,可以对渐变填充有更多的控制。下面在填充矩形区域时设置第2个参数的值为3,填充椭圆区域时设置第2个参数的值为3,第3个参数的值为0.8。

code.python
>>> shp1=sht.api.Shapes.AddShape(1, 100, 50, 200, 100)
>>> ff1=shp1.Fill
>>> ff1.ForeColor.RGB= xw.utils.rgb_to_int((255,0,0))
>>> ff1.OneColorGradient(3, 3, 1)  #设置第2和第3个参数
>>> shp2=sht.api.Shapes.AddShape(1, 400, 50, 200, 100)
>>> ff2=shp2.Fill
>>> ff2.ForeColor.RGB= xw.utils.rgb_to_int((0,0,255))
>>> ff2.OneColorGradient(3, 3, 0.8) #设置第2和第3个参数

效果如图4-28所示,试比较不同参数设置带来的差别。

Document Image

图4-28 渐变色填充的更多设置

算法上实现渐变色填充,是在两个位置上给定两种不同的颜色,这两个位置之间各位置上的颜色利用给定的两种颜色根据该位置与两端的距离线性插值得到。默认时,给定的两种颜色是白色和Shape对象的前景色。

利用FillFormat对象的GradientStops属性返回一个GradientStops对象,使用该对象的Insert方法可以往已有渐变序列中在指定位置上添加新的颜色节点。比如原来只有红色和白色,现在在中间位置插入兰色,那么前半部分利用红色和兰色渐变填充,后半部分利用兰色和白色渐变填充。该方法指定新颜色节点的位置是用一个0到1之间的小数指定的,表示该位置到起点的距离占整个距离的百分比。

下面在创建矩形区域和椭圆区域时在0.25, 0.5和0.75的位置添加红色、绿色和兰色节点。

code.python
>>> shp1=sht.api.Shapes.AddShape(1, 100, 50, 200, 100)  #矩形区域
>>> ff1=shp1.Fill
>>> ff1.ForeColor.RGB= xw.utils.rgb_to_int((255,0,0))
>>> ff1.OneColorGradient(3, 1, 1)  #单色渐变填充
>>> #在渐变序列中插入颜色节点
>>> ff1.GradientStops.Insert(xw.utils.rgb_to_int((255,0,0)), 0.25)
>>> ff1.GradientStops.Insert(xw.utils.rgb_to_int((0,255,0)), 0.5)
>>> ff1.GradientStops.Insert(xw.utils.rgb_to_int((0,0,255)), 0.75)
>>> shp2=sht.api.Shapes.AddShape(9, 400, 50, 200, 100)  #椭圆区域
>>> ff2=shp2.Fill
>>> ff2.ForeColor.RGB= xw.utils.rgb_to_int((0,0,255))
>>> ff2.OneColorGradient(7, 1, 1)  #单色渐变填充
>>> #在渐变序列中插入颜色节点
>>> ff2.GradientStops.Insert(xw.utils.rgb_to_int((255,0,0)), 0.25)
>>> ff2.GradientStops.Insert(xw.utils.rgb_to_int((0,255,0)), 0.5)
>>> ff2.GradientStops.Insert(xw.utils.rgb_to_int((0,0,255)), 0.75)

效果如图4-29所示。

Document Image

图4-29 添加颜色节点到渐变色

使用FillFormat对象的TwoColorGradient方法进行双色渐变色填充。该方法有两个参数,这两个参数跟OneColorGradient方法的前两个参数相同,请参阅。

下面创建一个矩形区域和一个椭圆形区域,矩形区域用红色和绿色渐变色填充,从左上角到右下角对角渐变;椭圆形区域用兰色和绿色渐变色填充,也是从左上角到右下角对角渐变。注意,起点处颜色用Shape对象的ForeColor属性设置,终点处颜色用BackColor属性设置。

code.python
>>> shp1=sht.api.Shapes.AddShape(1, 100, 50, 200, 100)  #矩形区域
>>> ff1=shp1.Fill
>>> ff1.ForeColor.RGB= xw.utils.rgb_to_int((255,0,0))  #起始颜色
>>> ff1.TwoColorGradient(3, 1)  #双色渐变填充
>>> ff1.BackColor.RGB= xw.utils.rgb_to_int((0, 255,0))  #终止颜色
>>> shp2=sht.api.Shapes.AddShape(9, 400, 50, 200, 100)  #椭圆区域
>>> ff2=shp2.Fill
>>> ff2.ForeColor.RGB= xw.utils.rgb_to_int((0,0,255))  #起始颜色
>>> ff2.TwoColorGradient(3, 1)  #双色渐变填充
>>> ff2.BackColor.RGB= xw.utils.rgb_to_int((0, 255,0))  #终止颜色

效果如图4-30所示。

Document Image

图4-30 双色渐变色填充

面的属性-图案填充、图片填充和纹理填充

除了颜色填充外,还可以用图案、图片和纹理对区域进行填充。

使用FillFormat对象的Patterned方法进行图案填充。该方法有一个参数,是一个MsoPatternType枚举类型的值,表示填充图案。该枚举的部分值请参见4.2.4小节的表4-15。

下面创建矩形区域和椭圆区域,给它们添加斜条纹图案和波纹图案,并设置绿色和兰色背景色。

code.python
>>> shp1=sht.api.Shapes.AddShape(1, 100, 50, 200, 100)  #矩形区域
>>> ff1=shp1.Fill
>>> ff1.ForeColor.RGB= xw.utils.rgb_to_int((255,0,0))
>>> ff1.Patterned(22)  #图案填充
>>> ff1.BackColor.RGB= xw.utils.rgb_to_int((0,255,0))
>>> shp2=sht.api.Shapes.AddShape(9, 400, 50, 200, 100)  #椭圆区域
>>> ff2=shp2.Fill
>>> ff2.ForeColor.RGB= xw.utils.rgb_to_int((255,255,0))
>>> ff2.Patterned(48)  #图案填充
>>> ff2.BackColor.RGB= xw.utils.rgb_to_int((0,0,255))

效果如图4-31所示。可见,绘制图案时使用的是前景色。

Document Image

图4-31 图案填充

使用FillFormat对象的UserPicture方法进行图片填充。该方法有一个参数,值为字符串类型,表示图片文件的文件路径, 如果图片在当前工作目录中, 指定图片文件的名称即可。图片填充时不必设置前景色和背景色。

下面创建矩形区域和椭圆区域,给它们进行图片填充。

code.python
>>> shp1=sht.api.Shapes.AddShape(1, 100, 50, 200, 100)  #矩形区域
>>> ff1=shp1.Fill
>>> ff1.UserPicture(r"D:\picpy.jpg")  #图片填充
>>> shp2=sht.api.Shapes.AddShape(9, 400, 50, 200, 100)  #椭圆区域
>>> ff2=shp2.Fill
>>> ff2.UserPicture(r"D:\picpy.jpg")  #图片填充

效果如图4-32所示。可见,对于矩形区域,填充时对图片按长宽比例进行了缩放,使得图片在矩形区域内正好能放下;对于椭圆区域,填充时对图片也按长轴和短轴的长度比例进行了缩放,椭圆区域以外的部分被裁剪掉。

Document Image

图4-32 图片填充

使用FillFormat对象的UserTextured方法进行纹理填充。该方法有一个参数,值为字符串类型,表示纹理图片文件的文件路径, 如果图片在当前工作目录中, 指定图片文件的名称即可。图片填充时不必设置前景色和背景色。

下面创建矩形区域和椭圆区域,给它们进行纹理填充。

code.python
>>> shp1=sht.api.Shapes.AddShape(1, 100, 50, 200, 100)  #矩形区域
>>> ff1=shp1.Fill
>>> ff1.UserTextured(r"D:\picpy.jpg")  #纹理填充
>>> shp2=sht.api.Shapes.AddShape(9, 400, 50, 200, 100)  #椭圆区域
>>> ff2=shp2.Fill
>>> ff2.UserTextured(r"D:\picpy.jpg")  #纹理填充

效果如图4-33所示。可见,纹理填充时是对纹理图片在区域内进行平铺显示,纹理图片保持原来的大小,超出区域的部分被裁剪掉。

Document Image

图4-33 纹理填充

除了用指定图片作为纹理外,Excel还提供了预设纹理。用FillFormat对象的PresetTextured方法设置预设纹理。该方法有一个参数,表示要应用的纹理类型。该参数的部分取值如表4-18中所示,有大理石纹理、花岗岩纹理、木质纹理、纸质纹理等很多种。

表4-18 预设纹理

名 称 说 明
msoTextureGranite 12 花岗岩纹理
msoTextureGreenMarble 9 绿色大理石纹理
msoTextureMediumWood 24 中木纹理
msoTextureNewsprint 13 新闻纸纹理
msoTextureOak 23 橡木纹理
msoTexturePaperBag 6 纸张袋纹理
msoTexturePapyrus 1 Papyrus 纹理
msoTextureParchment 15 羊皮纸纹理
msoTextureWalnut 22 胡桃木纹理
msoTextureWaterDroplets 5 水滴纹理
……

下面创建矩形区域和椭圆区域,给它们分别预设绿色大理石纹理和胡桃木纹理。

code.python
>>> shp1=sht.api.Shapes.AddShape(1, 100, 50, 200, 100)  #矩形区域
>>> ff1=shp1.Fill
>>> ff1.PresetTextured(9)  #预设纹理,大理石
>>> shp2=sht.api.Shapes.AddShape(9, 400, 50, 200, 100)  #椭圆区域
>>> ff2=shp2.Fill
>>> ff2.PresetTextured(22)  #预设纹理,胡桃木

效果如图4-34所示。

Document Image

图4-34 预设纹理

文本属性

Excel中用Font对象表示字体。当要设置字体时,往往是通过某个属性获取Font对象,然后利用该对象的属性和方法进行设置。

Font对象的主要属性包括:

• Bold属性:是否加粗,值为True时加粗,为False时不加粗。

• Color属性:RGB颜色着色。

• ColorIndex属性:索引着色。颜色查找表中某种颜色的索引号。

• FontStyle属性:字体样式,例如"Bold Italic"。

• Italic属性:是否倾斜,值为True时倾斜,为False时不倾斜。

• Name属性:字体名称。

• Size属性:字体大小。

• Strikethrough属性:是否添加删除线,值为True时添加,为False时不加。

• Subscript属性:是否设置为下标,值为True时设置,为False时不设置。

• Superscript属性:是否设置为上标,值为True时设置,为False时不设置。

• ThemeColor属性:主题颜色着色。

• ThemeFont属性:主题字体。

• TintAndShade属性:对字体颜色变暗或加亮,值为-1(最暗)到1(最亮)之间。

• Underline属性:下划线的类型,值为-4142时,无下划线;值为2时,单下划线;值为-4119时,粗双下划线;值为5时,为紧靠在一起的细双下划线。

下面的代码中,ft为工作表sht中单元格C3对象的Font属性返回的Font对象,利用Font对象的属性设置C3单元格中字体的属性。

code.python
>>> sht.api.Range("C3").Value="字体设置测试Test123"
>>> ft=sht.api.Range("C3").Font
>>> ft.Name = "黑体"
>>> ft.ColorIndex = 3
>>> ft.Size = 20
>>> ft.Bold=True
>>> ft.Strikethrough = False
>>> ft.Underline = 5
>>> ft.Italic=True

字体设置效果如图4-35中所示。

Document Image

图4-35 字体设置

4.1节介绍图形创建的时候讲到了,使用xlwings包创建包含文本的图形如标签、文本框、标注等时,文本内容无法创建。例如,使用下面的代码创建标注并设置字体:

code.python
>>> shp=sht.api.Shapes. AddCallout(2, 10, 10, 200, 50)
>>> shp.TextFrame.Characters.Text="Test Box"
>>> ft=shp.TextFrame.Characters.Font
>>> ft.Bold=True
>>> ft.Italic=True
>>> ft.Color=xw.utils.rgb_to_int((255,0,0))

结果只显示标注背景框,文本内容的创建和字体设置均告失败。笔者也测试了win32com和comtypes包,均未成功。[大谦Excel,dqexcel点com]