如何使用 openpyxl 处理 Excel 单元格的命名格式?NamedStyle 对象介绍
关注 1421
openpyxl Excel 命名格式对象 NamedStyle
openpyxl
包的NamedStyle
类,属于模块openpyxl.styles.named_styles
,用于表示 Excel 中的命名格式。NamedStyle
对象存储在工作簿对象中,可以被任意工作表中的单元格对象以某种形式引用。
什么是 Excel 命名格式?
Microsoft Excel 工作表中的单元格可以拥有单独的格式,修改他们不会影响其他单元格,而命名格式可以被多个单元格引用,修改命名格式将影响所有引用他的单元格。
Excel 命名格式拥有自己的名称,字体格式,填充格式,边框格式,对齐格式,数字格式,以及保护信息。
创建 Excel 命名格式
如果你希望为 Excel 工作簿添加命名格式,那么需要首先创建openpyxl
包的NamedStyle
对象,然后通过工作簿对象的相关方法执行添加操作。
NamedStyle(name='Normal', font=None, fill=None, border=None, alignment=None, number_format=None, protection=None, builtinId=None, hidden=False,)
- name 参数
name
参数是一个表示命名格式名称的字符串。- font 参数
font
参数是表示字体格式的Font
对象。- fill 参数
fill
参数是表示填充格式的PatternFill
对象或GradientFill
对象。- border 参数
border
参数是表示边框格式的Border
对象。- alignment 参数
alignment
参数是表示对齐格式的Alignment
对象。- number_format 参数
number_format
参数是表示如何对数字进行格式化的字符串。- protection 参数
protection
参数是表示保护信息的Protection
对象。- builtinId 参数
builtinId
参数是表示内置 ID 的整数,其效果未知。- hidden 参数
hidden
参数是一个布尔值,其效果未知。
NamedStyle 对象的变量
NamedStyle
对象拥有变量name
,font
,fill
,border
,alignment
,number_format
,protection
,builtinId
,hidden
,在未作出修改时,他们的值与传递给NamedStyle
构造器的实参的值相同。
格式,单元格
关于openpyxl
包的Font
,PatternFill
,GradientFill
,Border
,Alignment
,Protection
对象,你可以查看如何使用 openpyxl 获取和设置 Excel 单元格格式一节,以及openpyxl Excel 单元格保护对象 Protection一段。
from openpyxl.styles import Font, Border, Side
from openpyxl.styles.named_styles import NamedStyle
# 名称为 My Style 的命名格式
NamedStyle(
'My Style',
# 字体,20 磅
font=Font(sz=20),
# 下边框为红色双实线
border=Border(bottom=Side('double', 'FF0000'))
)
为 Excel 工作簿添加命名格式
Workbook
对象的add_named_style
方法,可用于为 Excel 工作簿添加命名格式,当然,这需要一个有效的NamedStyle
对象。
workbook.add_named_style(style)
- style 参数
style
参数是一个NamedStyle
对象,其对应的命名格式将被添加至工作簿。
在下面的示例中,我们创建了一个新的命名格式,并将其添加至工作簿。
# 创建只写工作簿
from openpyxl import Workbook
wb = Workbook(True)
from openpyxl.styles import Font
from openpyxl.styles.named_styles import NamedStyle
# 创建一个命名格式
ns = NamedStyle(
'绿色主题',
# 字体,绿色
font=Font(color='00FF00'),
# 数字显示为百分比
number_format='0%'
)
# 将命名格式添加至 Excel 工作簿
wb.add_named_style(ns)
wb.save('Add.xlsx')
无法将命名格式名称相同的 NamedStyle 对象添加至同一个工作簿对象
如果NamedStyle
命名格式对象的名称(name
变量),与工作簿对象中的某个命名格式的名称相同,那么此NamedStyle
对象将无法被添加至工作簿对象,这会引发异常ValueError: Style … exists already
。
当然,大部分 Excel 文件都会包含一些内置的命名格式,比如,名称为Normal
,Comma
,Currency
,Percent
的命名格式。
在下面的示例中,由于文件Style.xlsx
已经包含命名格式Normal
,因此,方法add_named_style
抛出了异常。
# 读取 Excel 文件 Style.xlsx
from openpyxl import load_workbook
wb = load_workbook('Style.xlsx')
from openpyxl.styles.named_styles import NamedStyle
# ERROR 工作簿已经包含名称为 Normal 的命名格式
wb.add_named_style(NamedStyle('Normal'))
ValueError: Style Normal exists already
获取 Excel 工作簿中所有命名格式的名称
Workbook
对象的named_styles
和style_names
属性,他们的返回值是一个 Python 字符串列表,列表包含了 Excel 工作簿中所有的命名格式的名称。
workbook.named_styles
workbook.style_names
# 读取 Excel 文件 Style.xlsx
from openpyxl import load_workbook
wb = load_workbook('Style.xlsx')
# 显示 Excel 工作簿中的所有命名格式的名称
print(wb.style_names)
print(wb.named_styles)
['Normal', 'Comma', 'Comma [0]', 'Currency', 'Currency [0]', 'Percent']
['Normal', 'Comma', 'Comma [0]', 'Currency', 'Currency [0]', 'Percent']
获取和设置 Excel 单元格的命名格式
Cell
对象拥有名称为style
的变量,他可被用于获取和设置 Excel 单元格所引用的命名格式。当获取命名格式时,style
变量为命名格式的名称,如果单元格没有引用任何命名格式,则返回的名称为Normal
,如果引用了命名格式,则可能会引发异常IndexError: list index out of range
。当设置命名格式时,需要将命名格式的名称或一个命名格式对象赋值给style
变量。
cell.style
cell.style = style
- style 值
style
可以是表示命名格式名称的字符串,工作簿对象必须拥有该名称的命名格式,否则将导致异常ValueError: … is not a known style
。当然,
style
也可以是一个NamedStyle
命名格式对象,这将导致该命名格式对象被添加至工作簿对象,并被单元格引用,因此,NamedStyle
对象的名称不能与工作簿对象中的某个命名格式的名称相同。
在下面的示例中,我们为单元格A1
设置了默认的命名格式Comma
,为单元格B1
设置了新的命名格式MyStyle
。
# 读取 Excel 文件 Style.xlsx 中的工作表 Cell
from openpyxl import load_workbook
wb = load_workbook('Style.xlsx')
ws = wb['Cell']
from openpyxl.styles.named_styles import NamedStyle
# 将单元格 A1 的命名格式设置为默认的 Comma
ws['A1'].style = 'Comma'
# 将单元格 B1 的命名格式设置为 MyStyle
b1 = ws['B1']
print(b1.style)
b1.style = NamedStyle('MyStyle')
print(b1.style)
wb.save('Cell.xlsx')
Normal
MyStyle
源码
src/zh/openpyxl/styles/named_styles·codebeatme/office-programming·GitHub