如何使用 openpyxl 获取和设置 Excel 单元格格式
关注 1421
与 Excel 命名格式相关的内容,请查看内容分类一段列出的章节。
openpyxl Excel 颜色对象 Color
openpyxl
包的Color
类,属于模块openpyxl.styles.colors
,用于表示 Excel 中的颜色,比如单元格的字体颜色,单元格的边框颜色。
Color
对象的构造器如下,在创建Color
实例时,只需根据颜色的类型给出必要的参数即可。
Color(rgb='00000000', indexed=None, auto=None, theme=None, tint=0.0, index=None, type='rgb')
- rgb 参数
rgb
参数是一个形式为AARRGGBB
或RRGGBB
的字符串,其中RR
,GG
,BB
,AA
是表示红色,绿色,蓝色以及透明度的十六进制数字,取值范围从00
到FF
。AA
为00
表示不透明,AA
为FF
表示完全透明,透明度的效果视具体的 Office 软件而定,一些 Office 软件可能不会支持透明度。- indexed 参数
indexed
参数是一个取值范围在0
到63
之间的整数,用于选择某个预先定义的索引颜色。- auto 参数
auto
参数是一个布尔值,如果为True
则表示使用自动颜色。- theme 参数
theme
参数是一个整数,用于指定颜色是 Excel 文件当前主题中的第几个颜色,比如,0
表示采用当前主题中的第一个颜色。- tint 参数
tint
参数是一个取值范围在-1
到1
之间的浮点数,用于设置颜色的饱和度与亮度,该参数的值越大,则颜色越趋近于白色,该参数的值越小,则颜色越趋近于黑色,如果为0
,则颜色保持原有的饱和度与亮度。- index 参数
index
参数与indexed
参数的作用相同。- type 参数
type
参数用于表示颜色的类型,但事实上他没有任何的作用,Color
对象的颜色类型将由构造器的其他参数确定。
Color
对象的value
属性,可以方便的获取或设置颜色的值,但不能赋值不同类型的颜色。
color.value
color.value = value
- value 值
value
值是某种类型的颜色的值。
openpyxl.styles.colors
模块拥有以下表示颜色的形式为AARRGGBB
的字符串变量,BLACK
(黑色,00000000
),WHITE
(白色,00FFFFFF
),BLUE
(蓝色,000000FF
)。
Color 对象的特性
Color
对象拥有变量rgb
,indexed
,auto
,theme
,tint
和type
,以及只读属性index
,他们的值与传递给Color
构造器的实参的值相同,如果你没有对变量作出修改。
from openpyxl.styles import Color
# 红色,饱和度 50%
c = Color(rgb='FF0000', tint=0.5)
print(c.value)
# 将颜色设置为蓝色
c.value = '0000FF'
# 索引为 2 的索引颜色是红色
Color(indexed=2)
# 自动颜色
Color(auto=True)
from openpyxl.styles.colors import BLACK
# 黑色
Color(rgb=BLACK)
00FF0000
openpyxl Excel 字体对象 Font
openpyxl
包的Font
类,属于模块openpyxl.styles.fonts
,表示 Excel 中的字体格式,通常用于单元格对象Cell
,其构造器如下。
Font(name=None, sz=None, b=None, i=None, charset=None, u=None, strike=None, color=None, scheme=None, family=None, size=None, bold=None, italic=None, strikethrough=None, underline=None, vertAlign=None, outline=None, shadow=None, condense=None, extend=None)
- name 参数
name
参数是一个表示字体名称的字符串。- sz 参数
sz
参数是一个表示字体大小的浮点数,以磅(pt)为单位。- b 参数
b
参数是一个布尔值,如果为True
则采用粗体。- i 参数
i
参数是一个布尔值,如果为True
则采用斜体。- charset 参数
charset
参数是一个整数,表示字体针对的是哪种语言。- u 参数
u
参数是一个表示下划线格式的字符串,可以是以下值之一,'single'
(单下划线,对应Font
的类变量UNDERLINE_SINGLE
),'double'
(双下划线,对应Font
的类变量UNDERLINE_DOUBLE
),'singleAccounting'
(会计单下划线,对应Font
的类变量UNDERLINE_SINGLE_ACCOUNTING
),'doubleAccounting'
(会计双下划线,对应Font
的类变量UNDERLINE_DOUBLE_ACCOUNTING
)。- strike 参数
strike
参数是一个布尔值,如果为True
则采用删除线。- color 参数
color
参数表示字体的颜色,可以是一个Color
对象,或一个形式为AARRGGBB
或RRGGBB
的字符串。- scheme 参数
scheme
参数是一个字符串,用于表示使用字体方案中的哪个字体,可以是以下值之一,'major'
(使用字体方案中的主要字体),'minor'
(使用字体方案中的次要字体)。- family 参数
family
参数(可能)是一个表示字体所属家族的数字。- size 参数
size
参数与sz
参数的作用相同。- bold 参数
bold
参数与b
参数的作用相同。- italic 参数
italic
参数与i
参数的作用相同。- strikethrough 参数
strikethrough
参数与strike
参数的作用相同。- underline 参数
underline
参数与u
参数的作用相同。- vertAlign 参数
vertAlign
参数是一个表示字体的垂直对齐方式的字符串,可以是以下值之一,'superscript'
(字体作为上标显示),'subscript'
(字体作为下标显示),'baseline'
(字体采用基线对齐)。- outline 参数
outline
参数是一个布尔值,如果为True
则显示文本的轮廓。- shadow 参数
shadow
参数是一个布尔值,如果为True
则显示文本的阴影。- condense 参数
condense
参数一个布尔值,如果为True
,则表示缩小文字间距(该参数可能不会产生效果)。- extend 参数
extend
参数一个布尔值,如果为True
,则表示扩大文字间距(该参数可能不会产生效果)。
openpyxl.styles.fonts
模块的变量DEFAULT_FONT
定义了默认字体,其值为表达式Font(name='Calibri', sz=11, family=2, b=False, i=False, color=Color(theme=1), scheme='minor')
的运算结果。
Font 对象的变量
Font
对象拥有变量name
,sz
,b
,i
,charset
,u
,strike
,color
,scheme
,family
,size
,bold
,italic
,strikethrough
,underline
,vertAlign
,outline
,shadow
,condense
,extend
,在未作出修改时,他们的值与传递给Font
构造器的实参的值相同。
from openpyxl.styles import Font, Color
# 粗体,斜体,单下划线,删除线
Font(b=True, i=True, u=Font.UNDERLINE_SINGLE, strike=True)
# 轮廓,阴影,20 磅
Font(outline=True, shadow=True, sz=20)
# 下标
Font(vertAlign='superscript')
# 红色,饱和度 50%
Font(color=Color(rgb='FF0000', tint=0.5))
# 蓝色
Font(color='0000FF')
openpyxl Excel 边对象 Side
openpyxl
包的Side
类,属于模块openpyxl.styles.borders
,用于表示 Excel 中的边的格式。请注意边与边框的区别,边框包含多个边,Side
对象对应了边框中的边,其构造器如下。
Side(style=None, color=None, border_style=None)
- style 参数
style
参数是一个表示边的形状的字符串,可以是以下值之一,'dashDot'
(点状虚线),'dashDotDot'
(点点状虚线),'dashed'
(虚线),'dotted'
(点线),'double'
(双实线),'hair'
(发线),'medium'
(中等实线),'mediumDashDot'
(点状中等虚线),'mediumDashDotDot'
(点点状中等虚线),'mediumDashed'
(中等粗虚线),'slantDashDot'
(斜角点状虚线),'thick'
(粗实线),'thin'
(细实线)。以上值分别对应
openpyxl.styles.borders
模块中的变量BORDER_DASHDOT
,BORDER_DASHDOTDOT
,BORDER_DASHED
,BORDER_DOTTED
,BORDER_DOUBLE
,BORDER_HAIR
,BORDER_MEDIUM
,BORDER_MEDIUMDASHDOT
,BORDER_MEDIUMDASHDOTDOT
,BORDER_MEDIUMDASHED
,BORDER_SLANTDASHDOT
,BORDER_THICK
,BORDER_THIN
。- color 参数
color
参数表示边的颜色,可以是一个Color
对象,或一个形式为AARRGGBB
或RRGGBB
的字符串。- border_style 参数
border_style
参数与style
参数的作用相同。
Side 对象的变量
Side
对象拥有变量style
,color
,border_style
,在未作出修改时,他们的值与传递给Side
构造器的实参的值相同。
from openpyxl.styles import Side
# 红色点线
Side('dotted', 'FF0000')
openpyxl Excel 边框对象 Border
openpyxl
包的Border
类,属于模块openpyxl.styles.borders
,用于表示 Excel 中边框的格式,其构造器如下。
Border(left=None, right=None, top=None, bottom=None, diagonal=None, diagonal_direction=None, vertical=None, horizontal=None, diagonalUp=False, diagonalDown=False, outline=True, start=None, end=None)
- left,right,top,bottom 参数
left
,right
,top
,bottom
参数是表示左边,右边,上边,下边格式的Side
对象。- diagonal 参数
diagonal
参数是表示边框对角线格式的Side
对象。- diagonal_direction 参数
diagonal_direction
参数表示边框对角线的方向,但其用法未知。- vertical 参数
vertical
参数(可能)是表示边框中垂直线格式的Side
对象,当边框包含多个单元格时。- horizontal 参数
horizontal
参数(可能)是表示边框中水平线格式的Side
对象,当边框包含多个单元格时。- diagonalUp 参数
diagonalUp
参数是一个布尔值,如果为True
则在边框中显示上对角线,即从左下角到右上角的对角线。- diagonalDown 参数
diagonalDown
参数是一个布尔值,如果为True
则在边框中显示下对角线,即从左上角到右下角的对角线。- outline 参数
outline
参数(可能)是一个表示是否显示边框外框的布尔值。- start,end 参数
start
参数与left
参数的作用(可能)类似,end
参数与right
参数的作用(可能)类似。
Border 对象的变量
Border
对象拥有变量left
,right
,top
,bottom
,diagonal
,diagonal_direction
,vertical
,horizontal
,diagonalUp
,diagonalDown
,outline
,start
,end
,在未作出修改时,他们的值与传递给Border
构造器的实参的值相同。
from openpyxl.styles import Border, Side, Color
# 左右为红色双实线,上下为蓝色粗实线的边框
double = Side('double', 'FF0000')
thick = Side('thick', Color('0000FF'))
Border(double, double, thick, thick)
openpyxl Excel 填充对象 PatternFill,GradientFill
openpyxl
包中的类PatternFill
和GradientFill
,属于模块openpyxl.styles.fills
,分别用于表示 Excel 中的图案填充格式和渐变填充格式,他们的构造器如下。
PatternFill(patternType=None, fgColor=Color(), bgColor=Color(), fill_type=None, start_color=None, end_color=None)
- patternType 参数
patternType
参数是一个表示图案填充类型的字符串,可以是以下值之一,'solid'
,'darkDown'
,'darkGray'
,'darkGrid'
,'darkHorizontal'
,'darkTrellis'
,'darkUp'
,'darkVertical'
,'gray0625'
,'gray125'
,'lightDown'
,'lightGray'
,'lightGrid'
,'lightHorizontal'
,'lightTrellis'
,'lightUp'
,'lightVertical'
,'mediumGray'
。以上值分别对应
openpyxl.styles.fills
模块中的变量FILL_SOLID
,FILL_PATTERN_DARKDOWN
,FILL_PATTERN_DARKGRAY
,FILL_PATTERN_DARKGRID
,FILL_PATTERN_DARKHORIZONTAL
,FILL_PATTERN_DARKTRELLIS
,FILL_PATTERN_DARKUP
,FILL_PATTERN_DARKVERTICAL
,FILL_PATTERN_GRAY0625
,FILL_PATTERN_GRAY125
,FILL_PATTERN_LIGHTDOWN
,FILL_PATTERN_LIGHTGRAY
,FILL_PATTERN_LIGHTGRID
,FILL_PATTERN_LIGHTHORIZONTAL
,FILL_PATTERN_LIGHTTRELLIS
,FILL_PATTERN_LIGHTUP
,FILL_PATTERN_LIGHTVERTICAL
,FILL_PATTERN_MEDIUMGRAY
。- fgColor 参数
fgColor
参数表示填充的前景(开始)颜色,可以是一个Color
对象,或一个形式为AARRGGBB
或RRGGBB
的字符串。- bgColor 参数
bgColor
参数表示填充的背景(结束)颜色,可以是一个Color
对象,或一个形式为AARRGGBB
或RRGGBB
的字符串。- fill_type 参数
fill_type
参数与patternType
参数的作用相同。- start_color 参数
start_color
参数与fgColor
参数的作用相同。- end_color 参数
end_color
参数与bgColor
参数的作用相同。
openpyxl.styles.fills
模块的变量DEFAULT_EMPTY_FILL
,DEFAULT_GRAY_FILL
定义了默认图案填充格式,其值为表达式PatternFill()
和PatternFill(patternType='gray125')
的运算结果。
PatternFill 对象的变量
PatternFill
对象拥有变量patternType
,fgColor
,bgColor
,fill_type
,start_color
,end_color
,在未作出修改时,他们的值与传递给PatternFill
构造器的实参的值相同。
在GradientFill
类的构造器中,参数degree
,left
,right
,top
,bottom
均可能对渐变的角度产生影响。
GradientFill(type='linear', degree=0, left=0, right=0, top=0, bottom=0, stop=())
- type 参数
type
参数是一个表示渐变填充类型的字符串,可以是以下值之一,'linear'
(线性),'path'
(路径)。- degree 参数
degree
参数是一个浮点数,表示渐变的方向(角度)。- left 参数
left
参数是表示渐变左边位置的浮点数,其具体作用和渐变类型有关,取值范围从0
到1
。- right 参数
right
参数是表示渐变右边位置的浮点数,其具体作用和渐变类型有关,取值范围从0
到1
。- top 参数
top
参数是表示渐变顶部位置的浮点数,其具体作用和渐变类型有关,取值范围从0
到1
。- bottom 参数
bottom
参数是表示渐变底部位置的浮点数,其具体作用和渐变类型有关,取值范围从0
到1
。- stop 参数
stop
参数是一个迭代器对象,包含若干Stop
对象,用于表示渐变的终结点。
GradientFill 对象的变量
GradientFill
对象拥有变量type
,degree
,left
,right
,top
,bottom
,stop
,在未作出修改时,他们的值与传递给GradientFill
构造器的实参的值相同。
openpyxl
包的Stop
类,属于模块openpyxl.styles.fills
,用于表示 Excel 渐变填充格式中的颜色终结点,从一个终结点到另一个终结点,颜色将逐渐发生变化。
Stop(color, position)
- color 参数
color
参数表示终结点的颜色,可以是一个Color
对象,或一个形式为AARRGGBB
或RRGGBB
的字符串。- position 参数
position
参数是表示终结点位置的浮点数,取值范围从0
到1
。
Stop 对象的变量
Stop
对象拥有变量color
,position
,在未作出修改时,他们的值与传递给Stop
构造器的实参的值相同。
from openpyxl.styles import PatternFill, GradientFill, Color
from openpyxl.styles.fills import Stop
# 图案 darkDown,前景红色,背景绿色
PatternFill('darkDown', 'FF0000', Color('00FF00'))
# 旋转 90 度,开始和结束为红色,中间为绿色
GradientFill('path', 90, stop=(
Stop('FF0000', 0),
Stop('00FF00', 0.5),
Stop('FF0000', 1),
))
openpyxl Excel 对齐对象 Alignment
openpyxl
包的Alignment
类,属于模块openpyxl.styles.alignment
,用于表示 Excel 中的对齐格式,其构造器如下。
Alignment(horizontal=None, vertical=None, textRotation=0, wrapText=None, shrinkToFit=None, indent=0, relativeIndent=0, justifyLastLine=None, readingOrder=0, text_rotation=None, wrap_text=None, shrink_to_fit=None, mergeCell=None)
- horizontal 参数
horizontal
参数是一个表示水平对齐方式的字符串,可以是以下值之一,'general'
(常规),'left'
(左对齐),'center'
(居中对齐),'right'
(右对齐),'fill'
(填充,换行效果将被取消,并在需要时重复文字以占满整个行),'justify'
(两端对齐,如果文字即将占满整个行,则扩大文字之间的距离,以占满整个行),'centerContinuous'
(跨列居中,文字会在多个列内居中对齐,即便这些列没有合并),'distributed'
(分散对齐,尝试扩大文字或单词之间的距离以占满整个行)。- vertical 参数
vertical
参数是一个表示垂直对齐方式的字符串,可以是以下值之一,'top'
(靠上对齐),'center'
(居中对齐),'bottom'
(靠下对齐),'justify'
(两端对齐,尝试扩大行之间的距离以占满垂直空间),'distributed'
(分散对齐,尝试扩大行之间的距离以占满垂直空间,如果只有一行,则该行会垂直居中)。- textRotation 参数
textRotation
参数是一个表示文本的旋转角度的整数,比如,30
表示逆时针旋转30
度。- wrapText 参数
wrapText
参数是一个布尔值,如果为True
则表示启用自动换行。- shrinkToFit 参数
shrinkToFit
参数是一个布尔值,如果为True
则会在需要时缩小文字以显示全部。- indent 参数
indent
参数是一个表示行首缩进大小的整数,取值范围在0
至255
之间。- relativeIndent 参数
relativeIndent
参数是一个表示行首的相对缩进大小的整数,取值范围在-255
至255
之间。- justifyLastLine 参数
justifyLastLine
参数是一个布尔值,如果为True
则对最后一行文字采用两端对齐。- readingOrder 参数
readingOrder
参数是一个表示文本方向的整数,1
表示从左到右,2
表示从右到左,0
表示未设置文本方向。- text_rotation 参数
text_rotation
参数与textRotation
参数的作用相同。- wrap_text 参数
wrap_text
参数与wrapText
参数的作用相同。- shrink_to_fit 参数
shrink_to_fit
参数与shrinkToFit
参数的作用相同。- mergeCell 参数
mergeCell
参数没有任何的作用。
Alignment 对象的变量
Alignment
对象拥有变量horizontal
,vertical
,textRotation
,wrapText
,shrinkToFit
,indent
,relativeIndent
,justifyLastLine
,readingOrder
,text_rotation
,wrap_text
,shrink_to_fit
,mergeCell
,在未作出修改时,他们的值与传递给Alignment
构造器的实参的值相同。
from openpyxl.styles import Alignment
# 水平居中,垂直居中,自动换行
Alignment('center', 'center', wrapText=True)
# 需要时缩小文字,行首缩进大小 1
Alignment(shrinkToFit=True, indent=1)
# 文本方向从右到左
Alignment(readingOrder=2)
获取和设置 Excel 单元格的一般格式
Cell
对象拥有名称为font
,border
,fill
,alignment
的变量,可将其类型视为Font
,Border
,PatternFill
或GradientFill
,Alignment
类,他们被用于获取和设置 Excel 单元格的字体格式,边框格式,填充格式,以及对齐格式。
ReadOnlyCell
对象拥有名称为font
,border
,fill
,alignment
的只读属性,其类型分别为Font
,Border
,PatternFill
或GradientFill
,Alignment
类,可用于获取 Excel 单元格的字体格式,边框格式,填充格式,以及对齐格式。
cell|readonlycell.font
cell|readonlycell.border
cell|readonlycell.fill
cell|readonlycell.alignment
cell.font = font
cell.border = border
cell.fill = fill
cell.alignment = alignment
- font 值
font
是一个表示单元格字体格式的Font
对象。- border 值
border
是一个表示单元格边框格式的Border
对象。- fill 值
fill
是一个表示单元格填充格式的PatternFill
对象或GradientFill
对象,。- alignment 值
alignment
是一个表示单元格对齐格式的Alignment
对象。
# 读取 Excel 文件 Style.xlsx 中的工作表 Cell
from openpyxl import load_workbook
wb = load_workbook('Style.xlsx')
ws = wb['Cell']
from openpyxl.styles import Font, Border, PatternFill, Alignment, Color, Side
# 设置字体 Tahoma,15 磅,粗体,绿色,饱和度 50%
ws['A1'].font = Font('Tahoma', 15, True, color=Color('00FF00', tint=0.5))
# 显示蓝色的双实线对角线
ws['B2'].border = Border(diagonal=Side('double', color='0000FF'), diagonalUp=True, diagonalDown=True)
# 图案 lightDown,前景蓝色,背景红色
ws['C3'].fill = PatternFill('lightDown', Color('0000FF'), Color('FF0000'))
# 显示在右上角,在需要时缩小文字
ws['D4'].alignment = Alignment('right', 'top', shrinkToFit=True)
wb.save('Cell.xlsx')
不能通过 Cell 对象直接修改单元格的具体格式
对于Cell
对象,你不能通过其font
,border
,fill
,alignment
变量修改单元格的具体格式,只能通过赋值一个新的Font
,Border
,PatternFill
或GradientFill
,Alignment
对象来替换单元格的原有格式,否则将引发异常AttributeError: Style objects are immutable and cannot be changed.Reassign the style with a copy
。
事实上,openpyxl
包的设计者并未严格实施以上的策略,比如,通过Cell
对象的font
属性的color
变量可以直接修改字体的颜色。
我们为上面的示例添加一些代码,直接修改A1
单元格字体的具体格式,这将导致异常,但通过color
变量修改字体颜色是可以的。
# …
# 可以修改字体颜色
ws['A1'].font.color.rgb = 'FFFF00'
# ERROR 不能直接修改具体格式
ws['A1'].font.b = True
AttributeError: Style objects are immutable and cannot be changed.Reassign the style with a copy
获取和设置 Excel 单元格的数字格式
Cell
对象拥有名称为number_format
的字符串类型变量,可用于表示如何对 Excel 单元格中的数字进行格式化。
ReadOnlyCell
对象拥有名称为number_format
的字符串类型的只读属性,可用于获取 Excel 单元格中数字的格式化方式。
cell|readonlycell.number_format
cell.number_format = format
- format 值
format
是一个表示如何对单元格中的数字进行格式化的字符串。
openpyxl.styles.numbers
模块拥有一些名称以FORMAT
开头的变量,他们是openpyxl
包预先定义的 Excel 数字格式化方式。
在下面的示例中,我们设置了单元格E5
的数字格式,他将使用千位分隔符,并在小于0
时显示为红色。
# 读取 Excel 文件 Style.xlsx 中的工作表 Cell
from openpyxl import load_workbook
wb = load_workbook('Style.xlsx')
ws = wb['Cell']
# 使用千位分隔符,如果是负数,则显示为红色
ws['E5'].number_format = '#,##0;[RED]-#,##0'
wb.save('Format.xlsx')
获取和设置 Excel 行或列中的单元格格式
Worksheet
和WriteOnlyWorksheet
对象的变量row_dimensions
和column_dimensions
,他们的font
,border
,fill
,alignment
,number_format
变量的类型分别为Font
,Border
,PatternFill
或GradientFill
,Alignment
类以及str
字符串,可用于获取和设置 Excel 行或列中的单元格的字体格式,边框格式,填充格式,对齐格式,数字格式。
Worksheet 和 WriteOnlyWorksheet 对象可能无法为拥有格式的单元格设置格式
如果Cell
对象已经拥有格式,那么通过Worksheet
或WriteOnlyWorksheet
对象的row_dimensions
或column_dimensions
变量为其设置格式可能不会成功。
WriteOnlyWorksheet 对象应在写入数据之前设置单元格格式
应该在写入任何数据之前,使用WriteOnlyWorksheet
对象的column_dimensions
变量,为某一列中的单元格设置格式,否则格式可能不会生效。
应该在写入任何一行数据之前,使用WriteOnlyWorksheet
对象的row_dimensions
变量,为该行中的单元格设置格式,否则格式可能不会生效。
在下面的示例中,由于单元格A1
,B2
,D4
(包括在代码执行过程中被设置了格式的单元格)拥有格式,因此,通过行和列设置的格式对他们可能无效。
# 读取 Excel 文件 Style.xlsx 中的工作表 Cell
from openpyxl import load_workbook
wb = load_workbook('Style.xlsx')
ws = wb['Cell']
from openpyxl.styles import Font, Border, PatternFill, Alignment, Side
# 为第一行设置字体 Arial,双实线下划线
ws.row_dimensions[1].font = Font('Arial', u='double')
# 为第二列设置红色底边
ws.column_dimensions['B'].border = Border(bottom=Side('dashed', 'FF0000'))
# 为第四列填充绿色
ws.column_dimensions['D'].fill = PatternFill('solid', '00FF00')
# 为第四行设置左下角对齐
ws.row_dimensions[4].alignment = Alignment('left', 'bottom')
wb.save('RC.xlsx')