如何使用 openpyxl 处理 Excel 工作表?Worksheet 对象介绍
关注 1421
本节并不包含 Microsoft Excel 工作表的创建,复制,移动,移除等操作,如果你想了解相关内容,可以查看如何使用 openpyxl 处理 Excel 工作簿?Workbook 对象介绍一节。
此外,本节内容也不涉及与 Excel 格式,计算,表格,图表相关的内容。
openpyxl Excel 工作表对象 Worksheet
openpyxl
包的Worksheet
类,属于模块openpyxl.worksheet.worksheet
,可用于获取或设置 Excel 工作表的相关信息和数据,Worksheet
对象可通过工作簿对象Workbook
获取或创建。如果Workbook
是只读的,即read_only
属性为True
,那么你将只能得到ReadOnlyWorksheet
工作表对象(属于模块openpyxl.worksheet._read_only
),如果Workbook
是只写的,即write_only
属性为True
,那么你将只能创建并得到WriteOnlyWorksheet
工作表对象(属于模块openpyxl.worksheet._write_only
)。
ReadOnlyWorksheet,WriteOnlyWorksheet 类与 Worksheet 类的关系
虽然ReadOnlyWorksheet
和WriteOnlyWorksheet
类,与Worksheet
类所实现的一些功能是相近的,但他们并不存在继承关系。
无法通过 Worksheet,WriteOnlyWorksheet 类的构造器直接创建新的工作表
不要尝试通过Worksheet
和WriteOnlyWorksheet
类的构造器来创建新的工作表,Workbook
并没有提供将他们添加至工作簿的方法,即便Workbook
存在特性worksheets
。
工作簿
想要了解如何通过Workbook
对象添加 Excel 工作表,你可以查看创建 Excel 工作表一段。
获取当前活动的 Excel 单元格的地址
Worksheet
对象的active_cell
属性,可用于获取 Excel 工作表当前活动的单元格的地址,比如,active_cell
属性返回'C1'
,表示单元格C1
处于活动中。
worksheet.active_cell
Excel 工作表的当前活动单元格可能不同于已选中单元格
在 Excel 工作表中,当前活动的单元格通常只有一个,他可能不同于已选中单元格,因为被选中的单元格可以是多个。
# 请将命令行跳转至 Goods.xlsx 所在的目录,然后运行此脚本文件
from openpyxl import load_workbook
worksheet = load_workbook('Goods.xlsx')['Tables']
# 显示工作表当前活动的单元格的地址
print(f'当前活动的单元格为 {worksheet.active_cell}')
当前活动的单元格为 C1
为 Excel 工作表添加数据(值)
Worksheet
对象的append
方法,可用于为 Excel 工作表添加数据(值),被添加的数据将位于工作表末尾一行的下一行,即便在末尾行之前存在某个空行。这里需要指出,openpyxl
包确定末尾一行的方式可能和你想象的不一样,我们会在计算包含所有已用单元格的最小区域一段中给予说明。
worksheet.append(iterable)
- iterable 参数
iterable
参数是一个提供数据的对象,可以是列表(list
),元组(tuple
),区域(range
),字典(dict
),或 Python 生成器(被isgenerator
函数判断为True
的对象)。除了字典,以上对象包含的值会从行的第一列开始,被依次写入工作表。如果使用字典,那么可以通过键值对的键来指明数据对应的列,键可以是字符串或数字,比如{'A':100}
和{1:100}
都表示第一列的值为100
。
Worksheet 对象可将单元格对象作为被添加数据
Worksheet
对象的append
方法除了可以添加字符串或数字类型的值以外,还可以将创建的单元格对象(Cell
)作为被添加的数据,如果单元格对象已经隶属于某个工作表,即某个Worksheet
对象,那么该Worksheet
对象必须是调用append
方法的Worksheet
对象,此时添加的效果类似于移动指定的单元格,这会体现在Workbook
对象所保存的 Excel 文件中(程序中可能不会体现)。
在读取 Excel 文件Goods.xlsx
之后,我们创建了一个工作表,并为工作表添加了几行数据,其中 Python 字典的键2
和4
分别对应了列B
和D
,把单元格A1
和B1
作为添加数据,将导致他们被移动至第二行,你可以在Append.xlsx
的工作表Sheet
中发现这一点,虽然print
函数所显示的A1
和B1
的值依然为1.6
和2.5
。
# 请将命令行跳转至 Goods.xlsx 所在的目录,然后运行此脚本文件
from openpyxl import load_workbook
workbook = load_workbook('Goods.xlsx')
worksheet = workbook.create_sheet()
# 以不同形式为工作表添加 4 行数据
worksheet.append((1.6, 2.5))
# 这相当于将单元格 A1 和 B1 移动至 A2 和 B2 的所在位置
worksheet.append([worksheet['A1'], worksheet['B1']])
worksheet.append({2: 1.0, 4: 2.0})
worksheet.append({'C': 1.1, 'E': 2.4})
# 保存为 Append.xlsx
workbook.save('Append.xlsx')
# 显示所有单元格的值
for r in worksheet.values:
print(r)
# 第一行中的 1.6 和 2.5 不会在 Append.xlsx 的 Sheet 工作表中出现
(1.6, 2.5, None, None, None)
(1.6, 2.5, None, None, None)
(None, 1.0, None, 2.0, None)
(None, None, 1.1, None, 2.4)
WriteOnlyWorksheet
对象的append
方法,同样可用于为 Excel 工作表添加数据,其效果与Worksheet
对象的append
方法类似,只不过其能够接受的数据形式更少。
writeonlyworksheet.append(iterable)
- iterable 参数
iterable
参数是一个提供数据的对象,可以是列表(list
),元组(tuple
),区域(range
),或 Python 生成器(被isgenerator
函数判断为True
的对象)。
下面的示例,创建了只写的工作簿和工作表对象,在调用append
方法写入数据后,我们将其保存为文件AppendWriteOnly.xlsx
。
from openpyxl import Workbook
workbook = Workbook(True)
worksheet = workbook.create_sheet()
# 为只写工作表添加数据,并保存为 AppendWriteOnly.xlsx
worksheet.append((1.6, 2.5))
worksheet.append([1.8, 2.2])
workbook.save('AppendWriteOnly.xlsx')
获取 Excel 单元格
Worksheet
对象的cell
方法或[]
运算符,可用于获取 Excel 工作表中的某个或某些单元格。其中,cell
方法的返回值是表示单元格的Cell
对象,[]
运算符的返回值是Cell
对象,或包含多个Cell
对象的元组,或以嵌套形式包含多行多列单元格的元组。
worksheet.cell(row, column, value=None)
worksheet[address]
- row 参数
row
参数是一个整数,表示需要获取的单元格位于第几行。- column 参数
column
参数是一个整数,表示需要获取的单元格位于第几列。- value 参数
value
参数是需要为单元格设置的值,可以是数字,字符串或时间。如果不希望在获取单元格的同时设置单元格的值,可以保持value
参数的默认值None
。- address 值
address
为需要获取的某个单元格的地址,比如'B2'
,或者包含多个单元格的区域表达式,比如'A1:C3'
(从单元格A1
到C3
),2:4
(在第二行和第四行之间,从第一列开始至工作表最大列结束)。
与Worksheet
对象的cell
方法和[]
运算符类似,ReadOnlyWorksheet
对象的cell
方法和[]
运算符,同样可用于获取 Excel 工作表中的某个或某些单元格。不同的是,ReadOnlyWorksheet
对象的cell
方法和[]
运算符,返回的是ReadOnlyCell
或EmptyCell
对象而非Cell
,调用cell
方法时,不能为value
参数指定非None
值,否则将导致异常,[]
运算符会排除工作表末尾所有的空行。
在 Excel 文件Goods.xlsx
的Phones
工作表中,第一列没有任何数据,但区域2:4
依然会包含该列中的EmptyCell
,由于openpyxl
将工作表Phones
的最大列计算为4
,因此区域2:4
会包含第四列的单元格,即便他们都是EmptyCell
,由于第四行是Phones
工作表末尾的空行,因此ReadOnlyWorksheet
对象会将其忽略。
在 Excel 文件Goods.xlsx
的Cups
工作表中,第五行和其之后的行都是工作表末尾的空行,因此ReadOnlyWorksheet
对象会将他们忽略。
# 请将命令行跳转至 Goods.xlsx 所在的目录,然后运行此脚本文件
import openpyxl
workbook = openpyxl.load_workbook('Goods.xlsx', True)
phones = workbook['Phones']
# 获取单元格 A1,C1
print(phones.cell(1, 1))
print(phones['C1'])
# 获取第二和第四行之间,从第一列开始至最大列结束的区域内的单元格
print(phones[2:4])
cups = workbook['Cups']
# 工作表末尾的一些行将被忽略
print(cups['A1:B10'])
<EmptyCell>
<ReadOnlyCell 'Phones'.C1>
((<EmptyCell>, <ReadOnlyCell 'Phones'.B2>, <ReadOnlyCell 'Phones'.C2>, <EmptyCell>), (<EmptyCell>, <ReadOnlyCell 'Phones'.B3>, <EmptyCell>, <EmptyCell>))
((<ReadOnlyCell 'Cups'.A1>, <ReadOnlyCell 'Cups'.B1>), (<ReadOnlyCell 'Cups'.A2>, <ReadOnlyCell 'Cups'.B2>), (<EmptyCell>, <EmptyCell>), (<ReadOnlyCell 'Cups'.A4>, <ReadOnlyCell 'Cups'.B4>))
遍历 Excel 单元格的值
Worksheet
和ReadOnlyWorksheet
对象的values
属性,返回一个可用于按行遍历 Excel 单元格的值的生成器对象,遍历的范围从单元格A1
开始,至工作表的最大行和最大列结束,空单元格的值将被表示为None
。
需要指出,工作表的最大行和最大列可能会在Worksheet
对象中发生变化,关于这一点,我们会在计算包含所有已用单元格的最小区域一段给予说明。
worksheet|readonlyworksheet.values
在通过Worksheet
对象访问单元格A4
之后,工作表Phones
的最大行由3
变成了4
。
# 请将命令行跳转至 Goods.xlsx 所在的目录,然后运行此脚本文件
import openpyxl
worksheet = openpyxl.load_workbook('Goods.xlsx')['Phones']
# 访问单元格 A4 将导致工作表的最大行发生变化
worksheet['A4']
# 显示 Phones 工作表中的单元格的值
for row in worksheet.values:
print(row)
(None, 'iPhone 100', 10000, 10)
(None, 'Samsung', 9999, None)
(None, 'iPhone 13', None, None)
(None, None, None, None)
移动 Excel 单元格
Worksheet
对象的move_range
方法,可用于移动 Excel 工作表中的某个单元格或指定区域内的所有单元格,移动的目标区域中的单元格将被覆盖。
worksheet.move_range(cell_range, rows=0, cols=0, translate=False)
- cell_range 参数
cell_range
参数为某个单元格的地址,或表示单元格区域的表达式和CellRange
对象。- rows 参数
rows
参数为单元格移动的行数,大于0
时向下移动,小于0
时向上移动。- cols 参数
cols
参数为单元格移动的列数,大于0
时向右移动,小于0
时向左移动。- translate 参数
translate
参数表示是否对被移动单元格的公式进行转换,默认为False
,不转换。
Worksheet 对象不会移动公式引用的单元格
如果将Worksheet
对象的move_range
方法的translate
参数设置为True
,那么会对移动的单元格的公式进行转换,公式中使用的地址将被重新计算。比如,将公式为=A1
的单元格B1
向下移动一行,那么被覆盖的单元格B2
的公式将是=A2
。
需要说明的是,对公式进行转换并不表示会移动公式所引用的单元格,除非这些单元格本身处于被移动的区域中。
Worksheet 对象无法正常移动拥有数组公式的单元格
无论是转换还是不转换公式,Worksheet
对象的move_range
方法都无法可靠的移动拥有数组公式的单元格。当translate
参数为False
时,单元格的数组公式可能丢失,当translate
参数为True
时,将导致异常的发生。
在 Excel 文件Goods.xlsx
的Pens
工作表中,单元格C1
,C2
和C3
,包含了对区域A1:B3
的计算公式,我们调用Worksheet
对象的move_range
方法来移动他们,并将translate
参数设置为True
,以确保移动后公式计算的结果依然准确。
# 请将命令行跳转至 Goods.xlsx 所在的目录,然后运行此脚本文件
from openpyxl import open
workbook = open('Goods.xlsx')
worksheet = workbook['Pens']
# 移动包含数据和公式单元格,并转换公式
worksheet.move_range('A1:C3', 1, 1, True)
workbook.save('Move.xlsx')
合并或取消合并 Excel 单元格
Worksheet
对象的merge_cells
方法,可用于合并 Excel 工作表中某个区域内的所有单元格,合并之后,原本区域左上角的单元格将占据整个区域,并可以通过该单元格原本的地址来访问他。如果只给出一个单元格,那么合并操作不会产生任何效果。
Worksheet
对象的unmerge_cells
方法,可用于取消合并 Excel 工作表中被合并的单元格,你需要为unmerge_cells
方法指明取消合并的区域,该区域应该与之前进行合并操作的区域一致。
worksheet.merge_cells(range_string=None, start_row=None, start_column=None, end_row=None, end_column=None)
worksheet.unmerge_cells(range_string=None, start_row=None, start_column=None, end_row=None, end_column=None)
- range_string 参数
range_string
参数为表示被合并或取消合并的单元格区域的表达式,如果忽略或设置为None
,则需要给出merge_cells
方法的参数start_row
,start_column
,end_row
和end_column
。- start_row 参数
start_row
参数是一个整数,表示被合并或取消合并的区域开始于第几行。- start_column 参数
start_column
参数是一个整数,表示被合并或取消合并的区域开始于第几列。- end_row 参数
end_row
参数是一个整数,表示被合并或取消合并的区域结束于第几行。- end_column 参数
end_column
参数是一个整数,表示被合并或取消合并的区域结束于第几列。
被 Worksheet 对象合并的单元格将成为只读的
除了左上角的单元格,被合并区域内的其他单元格将被转换为openpyxl
MergedCell
对象,其值或公式会被清空并成为只读的。如果被合并的单元格通过unmerge_cells
方法取消了合并,那么相关的MergedCell
对象将重新转换为支持写入的Cell
对象。
在下面的示例中,单元格B2
并不位于被合并区域的左上角,因此B2
的公式在合并之后被清空。
# 请将命令行跳转至 Goods.xlsx 所在的目录,然后运行此脚本文件
from openpyxl import open
workbook = open('Goods.xlsx')
worksheet = workbook['Flowers']
print(f'合并之前的 B2 为 {worksheet["B2"].value}')
# 合并区域 A1:B2 之后,立即取消合并
worksheet.merge_cells('A1:B2')
print(f'合并之后的 B2 为 {worksheet["B2"].value}')
worksheet.unmerge_cells(start_row=1, start_column=1, end_row=2, end_column=2)
合并之前的 B2 为 =B1
合并之后的 B2 为 None
获取 Excel 工作表中所有被合并的区域
Worksheet
对象的merged_cells
变量是一个MultiCellRange
对象,可用于表示 Excel 工作表中所有被合并的区域,通过该对象和in
关键字,你可判断某个单元格是否已经被合并。
worksheet.merged_cells
# …
# 合并区域 B2:C3,D4:H6
worksheet.merge_cells('B2:C3')
worksheet.merge_cells('D4:H6')
# 判断单元格 E3,D4 是否被合并了
print(f'单元格 E3 被合并了吗?{"E3" in worksheet.merged_cells}')
print(f'单元格 D4 被合并了吗?{"D4" in worksheet.merged_cells}')
单元格 E3 被合并了吗?False
单元格 D4 被合并了吗?True
计算包含 Excel 工作表所有已用单元格的最小区域
Worksheet
对象的calculate_dimension
方法和dimensions
属性,可用于计算包含 Excel 工作表已用单元格的最小区域,并返回该最小区域的表达式。已用单元格可能包括值为空的单元格,比如,一个没有数据但被设置了背景颜色的单元格。
worksheet.calculate_dimension()
worksheet.dimensions
ReadOnlyWorksheet
对象的calculate_dimension
方法,与Worksheet
对象的calculate_dimension
方法类似,只不过ReadOnlyWorksheet
对象的calculate_dimension
方法增加了一个参数force
。出于对性能的考虑,如果一个 Excel 工作表尚未确定最大行和最大列,那么默认情况下,调用calculate_dimension
方法会导致异常,此时可将参数force
设置为True
,以强制计算未确定的最大行和最大列。
readonlyworksheet.calculate_dimension(force=False)
- force 参数
force
参数表示是否强制计算已用单元格的最小区域,默认为False
,不强制计算。
Worksheet 对象所计算的已用单元格最小区域可能不准确
Worksheet
对象的calculate_dimension
方法,会通过该对象的_cells
变量来获取其包含的单元格的最小坐标和最大坐标,以确定整个工作表的最小行,最小列,最大行,最大列以及最小区域。当使用Worksheet
访问某个单元格时,新的单元格可能会被添加至_cells
,从而导致最小行,最小列,最大行,最大列,最小区域的改变,即便被访问的单元格中没有任何数据。
与Worksheet
对象不同,ReadOnlyWorksheet
对象的calculate_dimension
方法采用了不同的运算逻辑,其返回的最小区域并不会随意改变。
行和列
关于如何获取 Excel 工作表的最小行,最小列,最大行,最大列,你可以查看获取 Excel 的最小行,最小列,最大行,最大列一段。
在下面的例子中,我们分别通过Worksheet
和ReadOnlyWorksheet
对象访问单元格E5
,该单元格不在原有最小区域B2:C3
之内,输出结果表明Worksheet
对象的calculate_dimension
方法的计算结果发生了变化。
# 请将命令行跳转至 Goods.xlsx 所在的目录,然后运行此脚本文件
from openpyxl import load_workbook
empty = load_workbook('Goods.xlsx')['Empty']
# C3 是一个值为空但拥有背景颜色的单元格
print(empty['C3'])
print(f'最小区域 {empty.dimensions}')
# 访问 E5 导致最小区域改变
empty['E5']
print(f'访问 E5 后的最小区域 {empty.calculate_dimension()}')
r_empty = load_workbook('Goods.xlsx', True)['Empty']
# 对于只读工作表,访问 E5 不会导致最小区域改变
r_empty['E5']
print(f'只读工作表访问 E5 后的最小区域 {r_empty.calculate_dimension()}')
<Cell 'Empty'.C3>
最小区域 B2:C3
访问 E5 后的最小区域 B2:E5
只读工作表访问 E5 后的最小区域 B2:C3
ReadOnlyWorksheet
对象的reset_dimensions
方法,会将ReadOnlyWorksheet
对象计算的最大行和最大列设置为None
,这导致在调用calculate_dimension
方法时,需要把参数force
设置为True
,以重新计算最大行和最大列,否则会出现异常。
readonlyworksheet.reset_dimensions()
# …
# 重置最大行和最大列
r_empty.reset_dimensions()
# ERROR 需要将 force 参数设置为 True
r_empty.calculate_dimension()
ValueError: Worksheet is unsized, use calculate_dimension(force=True)
获取拥有数组公式的 Excel 单元格及其影响区域
Worksheet
对象的array_formulae
属性,返回一个 Python 字典,用于表示 Excel 工作表中所有拥有数组公式的单元格及其影响的区域,字典键值对的键为拥有数组公式的单元格的地址,字典键值对的值为数组公式所影响的区域对应的表达式,该区域中的单元格将存储公式的计算结果。比如,{'E1':'E1:E3'}
表示单元格E1
具有数组公式,该公式的计算结果存储在区域E1:E3
中。
worksheet.array_formulae
获取和设置 Excel 工作表的名称(标题)
Worksheet
和WriteOnlyWorksheet
对象的title
属性,可用于获取或设置 Excel 工作表的名称(标题)。ReadOnlyWorksheet
对象的title
变量,用于表示 Excel 工作表的名称,对该变量进行修改并没有太大意义,因为无法将其保存至 Excel 文件。
worksheet|writeonlyworksheet|readonlyworksheet.title
worksheet|writeonlyworksheet|readonlyworksheet.title = name
- name 值
name
为工作表的名称。
# 请将命令行跳转至 Goods.xlsx 所在的目录,然后运行此脚本文件
from openpyxl import load_workbook
workbook = load_workbook('Goods.xlsx')
# 修改工作表 Tables 的名称,并保存为 Name.xlsx
workbook['Tables'].title = 'New Tables'
workbook.save('Name.xlsx')
获取和设置 Excel 工作表的显示状态
Worksheet
,WriteOnlyWorksheet
和ReadOnlyWorksheet
对象的sheet_state
变量,可用于获取或设置 Excel 工作表的显示状态(是否被隐藏),当然,修改ReadOnlyWorksheet
对象的sheet_state
变量意义不大,因为无法进行保存。sheet_state
变量的有效取值有以下几种。
- 'visible'
'visible'
对应了Worksheet
的类变量SHEETSTATE_VISIBLE
,表示工作表处于显示状态。- 'hidden'
'hidden'
对应了Worksheet
的类变量SHEETSTATE_HIDDEN
,表示工作表处于隐藏状态,一般可通过 Office 软件重新显示。- 'veryHidden'
'veryHidden'
对应了Worksheet
的类变量SHEETSTATE_VERYHIDDEN
,表示工作表处于隐藏状态,且无法通过 Office 软件重新显示(由具体的 Office 软件决定)。
worksheet|writeonlyworksheet|readonlyworksheet.sheet_state
worksheet|writeonlyworksheet|readonlyworksheet.sheet_state = state
- state 值
state
为工作表的显示状态。
# …
workbook = load_workbook('Goods.xlsx')
# 隐藏工作表 Pens,Cups
workbook['Pens'].sheet_state = 'hidden'
workbook['Cups'].sheet_state = 'veryHidden'
workbook.save('Hidden.xlsx')
获取 Excel 工作表所隶属的工作簿
Worksheet
,WriteOnlyWorksheet
和ReadOnlyWorksheet
对象的parent
属性,表示了 Excel 工作表所隶属的工作簿对象。如果工作表不属于任何工作簿,那么parent
属性将返回空值None
。
worksheet|writeonlyworksheet|readonlyworksheet.parent
from openpyxl import Workbook
worksheet = Workbook(True).create_sheet()
worksheet.title = 'MySheet'
# 通过 parent 属性获取工作表对应的工作簿对象
worksheet.parent.save('Parent.xlsx')
openpyxl Excel 工作表保护对象 SheetProtection
openpyxl
包的SheetProtection
类,属于模块openpyxl.worksheet.protection
,用于表示 Excel 工作表的保护信息,以下为其拥有的部分变量。
- sheet 变量
sheet
变量是一个布尔值,表示是否启用对工作表的保护。- objects 变量
objects
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户编辑工作表中的对象。- scenarios 变量
scenarios
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户编辑方案。- formatCells 变量
formatCells
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户设置单元格格式。- formatRows 变量
formatRows
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户设置行的格式。- formatColumns 变量
formatColumns
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户设置列的格式。- insertColumns 变量
insertColumns
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户插入新的列。- insertRows 变量
insertRows
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户插入新的行。- insertHyperlinks 变量
insertHyperlinks
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户插入新的链接。- deleteColumns 变量
deleteColumns
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户删除列。- deleteRows 变量
deleteRows
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户删除行。- selectLockedCells 变量
selectLockedCells
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户选择锁定的单元格。- selectUnlockedCells 变量
selectUnlockedCells
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户选择未锁定的单元格。- sort 变量
sort
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户进行排序。- autoFilter 变量
autoFilter
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户进行筛选。- pivotTables 变量
pivotTables
变量是一个布尔值,如果为False
则表示当工作表被保护时,允许用户使用数据透视表(包括新建,修改等操作)。- password 变量
password
变量是一个表示密码或密码哈希值的字符串,当用户取消对工作表的保护时,需要输入正确的密码。- algorithmName,saltValue,spinCount,hashValue 变量
algorithmName
,saltValue
,spinCount
,hashValue
变量与加密有关。
SheetProtection
对象还拥有一些方法,其中方法enable
和disable
可用于启用或禁用对工作表的保护,这等同于直接设置变量sheet
,方法set_password
可用于设置工作表的保护密码,当用户希望取消保护工作表时,需要输入相关密码。
enable()
disable()
set_password(value='', already_hashed=False)
- value 参数
value
参数是表示密码或密码哈希值的字符串。- already_hashed 参数
already_hashed
参数是一个布尔值,如果为True
则表示value
参数是密码的哈希值,否则value
参数是密码本身。
获取和设置 Excel 工作表的保护信息
Worksheet
和WriteOnlyWorksheet
对象的protection
变量是一个SheetProtection
对象,该对象包含了 Excel 工作表的保护信息。这些保护信息仅被 Office 软件用于限制用户的行为,并不会对openpyxl
包的行为造成影响。
worksheet|writeonlyworksheet.protection
什么是保护 Excel 工作表?
当 Excel 工作表被保护时,工作表中的每个单元格将根据其保护信息被保护,比如,锁定单元格,或隐藏单元格中的公式。
单元格
关于 Excel 单元格的保护信息,你可以查看获取和设置 Excel 单元格的保护信息一段。
# 请将命令行跳转至 Goods.xlsx 所在的目录,然后运行此脚本文件
from openpyxl import load_workbook
workbook = load_workbook('Goods.xlsx')
protection = workbook['Flowers'].protection
# 启用对工作表 Flowers 的保护
protection.enable()
# 允许用户在 Office 软件中删除行或列
protection.deleteColumns = False
protection.deleteRows = False
# 设置密码
protection.set_password('123')
workbook.save('Protection.xlsx')
Worksheet 对象的其他特性
以下是与Worksheet
,ReadOnlyWorksheet
或WriteOnlyWorksheet
对象相关,但不太重要的一些特性,这些特性可能并非从 Microsoft Excel 文件获取,只是由openpyxl
包给出了固定值。
- encoding 属性
Workbook
,ReadOnlyWorksheet
和WriteOnlyWorksheet
对象的encoding
属性,用于表示工作表所属的工作簿的编码,他被指定为'utf-8'
。
源码
src/zh/openpyxl/worksheets·codebeatme/office-programming·GitHub