最近写一个工具,要用到openpyxl设置excel单元格属性。网上关于这方面的介绍不少,其他属性设置的介绍都够详细了,但设置单元格填充属性的介绍都比较简单。于是自己查看openpyxl模块的源代码,并测试摸索,终于弄清楚了使用方法,现总结一下。若有错漏,敬请指出!
from openpyxl.styles import PatternFill, GradientFill
Excel的单元格填充有两种类型:PatternFill图案填充,和 GradientFill渐变色填充(对应Excel单元格格式设置面板中填充选项卡上的填充效果)。二者只能任选其一,不能同时使用。
1.PatternFill图案填充。
语法:
cell.fill = PatternFill(patternType=None, fgColor=Color(), bgColor=Color(), fill_type=None, start_color=None, end_color=None)
参数说明:
patternType或fill_type:填充图案类型。
fgColor或start_color:图案前景色。
bgColor或end_color:图案背景色。
六个参数实际生效的是三个,前述三组是别名关系。当patternType与fill_type同时给出时, fill_type优先生效,其值将赋给patternType。同理,start_color优先于fgColor生效,end_color优先于bgColor生效。
patternType或fill_type为'none'时无填充。其余可设置的值及对应的图案为:
颜色:Color(rgb=None, indexed=None, auto=None, theme=None, tint=0.0, type=None)
若省略参数,则默认黑色。若指定颜色,有四种方式:
第一优先度方式:用颜色索引号,可用范围为1-63。
如fgColor=Color(rgb=None, indexed=4, auto=None, theme=None, tint=0.0, type='indexed')。可简写为fgColor=Color(indexed=4)。指定蓝色。
第二优先度方式:使用主题颜色号。
如fgColor=Color(rgb=None, indexed=None, auto=True, theme=None, tint=0.0, type='auto')。fgColor=Color(theme=1, tint=0.4),指定主题颜色1,浅化40%。tint值若为负值,如-0.25,表示主题颜色号深化25%。
第三优先度方式:使用自动颜色:
如fgColor=Color(rgb=None, indexed=None, auto=True, theme=None, tint=0.0, type='auto')。可简写为fgColor=Color(auto=Ture)。fgColor颜色auto为白色,bgColor颜色auto为无颜色。
第四优先度方式:使用不带透明度的rgb颜色,如fgColor=Color(rgb='FF0000')或fgColor='FF0000'。也可以使用带透明度的rgb颜色,如fgColor=Color(rgb='10FF0000')或fgColor='10FF0000'。实际测试中透明度值似乎不起作用。
第一种方式的颜色索引与颜色对应关系如下:
Index |
|||||
0-4 |
00000000 |
00FFFFFF |
00FF0000 |
0000FF00 |
000000FF |
5-9 |
00FFFF00 |
00FF00FF |
0000FFFF |
00000000 |
00FFFFFF |
10-14 |
00FF0000 |
0000FF00 |
000000FF |
00FFFF00 |
00FF00FF |
15-19 |
0000FFFF |
00800000 |
00008000 |
00000080 |
00808000 |
20-24 |
00800080 |
00008080 |
00C0C0C0 |
00808080 |
009999FF |
25-29 |
00993366 |
00FFFFCC |
00CCFFFF |
00660066 |
00FF8080 |
30-34 |
000066CC |
00CCCCFF |
00000080 |
00FF00FF |
00FFFF00 |
35-39 |
0000FFFF |
00800080 |
00800000 |
00008080 |
000000FF |
40-44 |
0000CCFF |
00CCFFFF |
00CCFFCC |
00FFFF99 |
0099CCFF |
45-49 |
00FF99CC |
00CC99FF |
00FFCC99 |
003366FF |
0033CCCC |
50-54 |
0099CC00 |
00FFCC00 |
00FF9900 |
00FF6600 |
00666699 |
55-60 |
00969696 |
00003366 |
00339966 |
00003300 |
00333300 |
60-63 |
00993300 |
00993366 |
00333399 |
00333333 |
|
【注意】在excel2007中,当图案样式(即patternType)为除了'solid'之外的其他图案时,所填充图案的背景色为单元格格式设置对话框里填充选项卡中的背景色所指定颜色,图案上的线条的颜色为项卡中“图案颜色”所指定的颜色。而当图案样式(即patternType)为'solid'时,是用填充选项卡中的背景色进行纯色填充的。所以,图案样式(即patternType)为'solid'时,openpyxl中fgColor对应excel2007中的背景色,bgColor对应excel2007中的图案颜色,单元格用fgColor纯色填充。图案样式(即patternType)为其他类型时,openpyxl中fgColor对应excel2007中的图案颜色,bgColor对应excel2007中的背景色,单元格以fgColor颜色的线条图案、bgColor颜色的背景填充。
2.GradientFill渐变色填充。
语法:
cell.fill = GradientFill(type="linear", degree=0, left=0, right=0, top=0, bottom=0, stop=())
参数说明:
type:填充类型。
支持两种类型:linear和path。默认类型为linear。在省略全部参数或只给出填充类型,未给出其他参数的情况下,默认色(黑色)纯色填充。
stop:指定渐变的各种颜色色分布范围。
其值应为一个全部元素均为颜色的序列或一个全部元素均为Stop对象的序列。但不能是颜色和Stop对象混合的序列,否则会报错。
当stop参数使用Stop对象序列时,可以自行指定各种颜色的渐变间隔比例,此时需要导入Stop类。
from openpyxl.styles.fills import Stop
Stop对象指定了一种颜色,以及在渐变方向上的宽度范围中,该颜色的纯色所在比例位置。其语法为Stop(color, position)。第一个参数为颜色,第二个参数为一个0到1之间的float类型数值。在一个Stop对象的序列中,各Stop对象的position参数值不能重复,否则会报错。
Stop对象序列范例:stop=(Stop('FF0000', 0.0), Stop('00FF00', 0.6), Stop('FF0000', 1.0))
当stop参数使用颜色序列时,颜色的表示方法如PatternFill中所述一样。各颜色的渐变间隔为自动均匀分配。不能自行指定,同时也无需导入Stop类。
颜色序列范例:stop=('FFFF00', '0000FF'),stop=('FFFF00', Color(theme=2, tint=0.6), '0000FF')
其余参数与type类型相关,分别在两种type类型中说明。
linear渐变类型:颜色线性渐变填充。linear渐变类型可实现对应excel中填充效果渐变设置中底纹样式的水平、垂直、斜上和斜下的几种效果,并且用openpyxl可设置比excel中更多的渐变效果。
使用linear渐变类型时,lef、right、top、bottom参数无效。
参数degree指定渐变的方向,默认值0为自左向右渐变,即序列中的颜色1在最左,序列中最后一种颜色在最右。degree由0增大到360代表渐变方向由向右方向顺时针变化一周。如degree=315表示自左下向右上渐变,degree=45表示自左上向右下渐变。degree也可以大于360,degree=365相当于degree=5。如下图所示:
使用linear渐变填充的示例:
两种颜色自左向右渐变:
cell.fill = GradientFill('linear', stop=(Stop('FF0000', 0.0), Stop('00FF00', 1.0)))
三种颜色均匀间隔渐变:
cell.fill = GradientFill('linear', stop=('FF0000', '00FF00', Color(indexed=5)))
三种颜色不均匀间隔比例渐变:
cell.fill = GradientFill('linear', stop=(Stop('FF0000', 0.0), Stop('0000FF', 0.3), Stop('FF0000', 1.0)))
当给出的间隔参数不是覆盖0~1时,未指定颜色的宽度比例部分默认黑色:
cell.fill = GradientFill('linear', stop=(Stop('FF0000', 0.2), Stop('0000FF', 0.6), Stop('FF0000', 1.0)))
实际填充效果为:,其中0~0.2之间为黑色到红色(颜色1)渐变。
指定方向的渐变:
cell.fill = GradientFill('linear', degree=45, stop=(Stop('FF0000', 0.2), Stop('0000FF', 0.6), Stop('FF0000', 1.0)))
path类型:对应excel中填充效果渐变设置中底纹样式角部辐射和中心辐射。
使用path类型渐变时,参数degree无效。stop参数同linear类型渐变。
left、right参数为颜色序列中第一种颜色的纯色填充区域的左右边界距离单元格左侧的距离,top、bottom参数为颜色序列中第一种颜色的纯色填充区域的上下边界距离单元格顶部的距离。这四个参数有效数据均为0.0至1.0,超出取值范围程序能正常运行,但用excel打开文件时会出错。当right
四个参数的含义如下图所示:
使用path渐变填充的示例:
当left、 right、 top、bottom参数均为0.5时,即为excel中的中心辐射填充效果。如
cell.fill = GradientFill('path', left=0.5, right=0.5, top=0.5, bottom=0.5, stop=('FFFF00', '0000FF'))
excel中角部辐射填充效果1,从左上辐射:
cell.fill = GradientFill('path', left=0.0, right=0.0, top=0.0, bottom=0.0, stop=('FFFF00', '0000FF'))
excel中角部辐射填充效果2,从右上辐射:
cell.fill = GradientFill('path', left=1.0, right=1.0, top=0.0, bottom=0.0, stop=('FFFF00', '0000FF'))
excel中角部辐射填充效果3,从左下辐射:
cell.fill = GradientFill('path', left=0.0, right=0.0, top=1.0, bottom=1.0, stop=('FFFF00', '0000FF'))
excel中角部辐射填充效果4,从右下辐射:
cell.fill = GradientFill('path', left=1.0, right=1.0, top=1.0, bottom=1.0, stop=('FFFF00', '0000FF'))
当然,openpyxl能实现比excel里的设置更多样的效果。如下所示:
cell.fill = GradientFill('path', left=0.3, right=0.0, top=0.0, bottom=1.0, stop=('FFFF00', '0000FF'))
cell.fill = GradientFill('path', left=0.0, right=0.3, top=1.0, bottom=0.0, stop=('FFFF00', '0000FF'))
cell.fill = GradientFill('path', left=0.3, right=0.8, top=0.2, bottom=0.6, stop=('FFFF00', '0000FF', 'FF0000'))