如何使用 Python openpyxl 包操作 Excel 工作表?openpyxl Worksheet 对象介绍

我被代码海扁署名-非商业-禁演绎
阅读 28:53·字数 8667·发布 
Bilibili 空间
关注 950

本节并不包含 Microsoft Excel 工作表的创建,复制,移动,移除等操作,如果你想了解相关内容,可以查看如何使用 Python openpyxl 包操作 Excel 工作簿?openpyxl Workbook 对象介绍一节。

此外,本节内容也不涉及与 Excel 样式,计算,表格,图表相关的内容。

Python openpyxl 包中的 Excel 工作表对象 Worksheet

Pythonopenpyxl包中的Worksheet类,属于模块openpyxl.worksheet.worksheet,可用于获取或设置 Excel 工作簿中的工作表的相关信息和数据,Worksheet对象可通过openpyxl工作簿对象Workbook获取或创建。如果Workbook是只读的,即read_only属性为True,那么你将只能得到ReadOnlyWorksheet工作表对象(属于模块openpyxl.worksheet._read_only),如果Workbook是只写的,即write_only属性为True,那么你将只能创建并得到WriteOnlyWorksheet工作表对象(属于模块openpyxl.worksheet._write_only)。

Python openpyxl 包的 ReadOnlyWorksheet,WriteOnlyWorksheet 类与 Worksheet 类的关系

虽然 Pythonopenpyxl包的ReadOnlyWorksheetWriteOnlyWorksheet类,与Worksheet类所实现的一些功能是相近的,但他们并不存在继承关系。

无法通过 Python openpyxl 包的 Worksheet,WriteOnlyWorksheet 类的构造器直接创建新的工作表

不要尝试通过WorksheetWriteOnlyWorksheet类的构造器来创建新的 Excel 工作表,Workbook并没有提供将他们添加至 Excel 工作簿的方法,即便Workbook存在特性worksheets

工作簿

想要了解如何通过Workbook对象添加 Excel 工作表,你可以查看使用 Python openpyxl 包的 Workbook 对象创建 Excel 工作表一段。

使用 Python openpyxl 包的 Worksheet 对象获取当前活动的 Excel 单元格的地址

Pythonopenpyxl包的Worksheet对象的active_cell属性,可用于获取 Excel 工作表当前活动的单元格的地址,比如,active_cell属性返回'C1',表示单元格C1处于活动中。

worksheet.active_cell

Excel 工作表的当前活动单元格可能不同于已选中单元格

在 Excel 工作表中,当前活动的单元格通常只有一个,他可能不同于已选中单元格,因为被选中的单元格可以是多个。

active_cell.py
# 请将命令行跳转至 Goods.xlsx 所在的目录,然后运行此脚本文件
from openpyxl import load_workbook

worksheet = load_workbook('Goods.xlsx')['Tables'] # 显示工作表当前活动的单元格的地址 print(f'当前活动的单元格为 {worksheet.active_cell}')
当前活动的单元格为 C1

使用 Python openpyxl 包的 Worksheet 对象为 Excel 工作表添加数据(值)

Pythonopenpyxl包的Worksheet对象的append方法,可用于为 Excel 工作表添加数据(值),被添加的数据将位于工作表末尾一行的下一行,即便在末尾行之前存在某个空行。这里需要指出,openpyxl包确定末尾一行的方式可能和你想象的不一样,我们会在计算已用单元格的最小区域一段中给予说明。

worksheet.append(iterable)

iterable 参数

iterable参数是一个提供数据的对象,可以是列表(list),元组(tuple),区域(range),字典(dict),或 Python 生成器(被isgenerator函数判断为True的对象)。除了字典,以上对象包含的值会从行的第一列开始,被依次写入 Excel 工作表。如果使用字典,那么可以通过键值对的键来指明数据对应的列,键可以是字符串或数字,比如{'A':100}{1:100}都表示第一列的值为100

Python openpyxl 包的 Worksheet 对象可将 Excel 单元格对象作为被添加数据

Pythonopenpyxl包的Worksheet对象的append方法,除了可以添加字符串或数字类型的值以外,还可以将创建的 Excel 单元格对象(Cell)作为被添加的数据,如果单元格对象已经隶属于某个 Excel 工作表,即某个Worksheet对象,那么该Worksheet对象必须是调用append方法的Worksheet对象,此时添加的效果类似于移动指定 Excel 的单元格,这会体现在openpyxlWorkbook对象所保存的 Excel 文件中(程序中可能不会体现)。

在读取 Excel 文件Goods.xlsx之后,我们创建了一个工作表,并为工作表添加了几行数据,其中 Python 字典的键24分别对应了列BD,把单元格A1B1作为添加数据,将导致他们被移动至第二行,你可以在Append.xlsx的工作表Sheet中发现这一点,虽然print函数所显示的A1B1的值依然为1.62.5

append.py
# 请将命令行跳转至 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)

Pythonopenpyxl包的WriteOnlyWorksheet对象的append方法,同样可用于为 Excel 工作表添加数据,其效果与Worksheet对象的append方法类似,只不过其能够接受的数据形式更少。

writeonlyworksheet.append(iterable)

iterable 参数

iterable参数是一个提供数据的对象,可以是列表(list),元组(tuple),区域(range),或 Python 生成器(被isgenerator函数判断为True的对象)。

下面的示例,创建了只写的 Excel 工作簿和工作表对象,在调用append方法写入数据后,我们将其保存为文件AppendWriteOnly.xlsx

append.py
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')

使用 Python openpyxl 包的 Worksheet 对象获取 Excel 单元格

Pythonopenpyxl包的Worksheet对象的cell方法或[]运算符,可用于获取 Excel 工作表中的某个或某些单元格。其中,cell方法的返回值是表示 Excel 单元格的Cell对象,[]运算符的返回值是Cell对象,或包含多个Cell对象的 Python 元组,或以嵌套形式包含多行多列 Excel 单元格的 Python 元组。

worksheet.cell(row, column, value=None)
worksheet[address]

row 参数

row参数是一个整数,表示需要获取的 Excel 单元格位于第几行。

column 参数

column参数是一个整数,表示需要获取的 Excel 单元格位于第几列。

value 参数

value参数是需要为 Excel 单元格设置的值,可以是数字,字符串或时间。如果不希望在获取 Excel 单元格的同时设置单元格的值,可以保持value参数的默认值None

address 值

address为需要获取的某个 Excel 单元格的地址,比如'B2',或者包含多个 Excel 单元格的区域表达式,比如'A1:C3'(从单元格A1C3),2:4(在第二行和第四行之间,从第一列开始至工作表最大列结束)。

Worksheet对象的cell方法和[]运算符类似,Pythonopenpyxl包的ReadOnlyWorksheet对象的cell方法和[]运算符,同样可用于获取 Excel 工作表中的某个或某些单元格。不同的是,ReadOnlyWorksheet对象的cell方法和[]运算符,返回的是ReadOnlyCellEmptyCell对象而非Cell,调用cell方法时,不能为value参数指定非None值,否则将导致异常,[]运算符会排除 Excel 工作表末尾所有的空行。

在 Excel 文件Goods.xlsxPhones工作表中,第一列没有任何数据,但区域2:4依然会包含该列中的EmptyCell,由于openpyxl将工作表Phones的最大列计算为4,因此区域2:4会包含第四列的单元格,即便他们都是EmptyCell,由于第四行是Phones工作表末尾的空行,因此ReadOnlyWorksheet对象会将其忽略。

在 Excel 文件Goods.xlsxCups工作表中,第五行和其之后的行都是工作表末尾的空行,因此ReadOnlyWorksheet对象会将他们忽略。

get_cells.py
# 请将命令行跳转至 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>))

使用 Python openpyxl 包的 Worksheet 对象遍历 Excel 单元格的值

Pythonopenpyxl包的WorksheetReadOnlyWorksheet对象的values属性,返回一个可用于按行遍历 Excel 单元格的值的生成器对象,遍历的范围从单元格A1开始,至 Excel 工作表的最大行和最大列结束,空单元格的值将被表示为None

需要指出,工作表的最大行和最大列可能会在openpyxl包的Worksheet对象中发生变化,关于这一点,我们会在计算已用单元格的最小区域一段给予说明。

worksheet|readonlyworksheet.values

在通过Worksheet对象访问 Excel 单元格A4之后,Excel 工作表Phones的最大行由3变成了4

get_values.py
# 请将命令行跳转至 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)

使用 Python openpyxl 包的 Worksheet 对象移动 Excel 单元格

Pythonopenpyxl包的Worksheet对象的move_range方法,可用于移动 Excel 工作表中的某个单元格或指定区域内的所有单元格,移动的目标区域中的单元格将被覆盖。

worksheet.move_range(cell_range, rows=0, cols=0, translate=False)

cell_range 参数

cell_range参数为某个 Excel 单元格的地址,或表示单元格区域的表达式和CellRange对象。

rows 参数

rows参数为 Excel 单元格移动的行数,大于0时向下移动,小于0时向上移动。

cols 参数

cols参数为 Excel 单元格移动的列数,大于0时向右移动,小于0时向左移动。

translate 参数

translate参数表示是否对被移动单元格的公式进行转换,默认为False,不转换。

Python openpyxl 包的 Worksheet 对象不会移动公式引用的 Excel 单元格

如果将openpyxlWorksheet对象的move_range方法的translate参数设置为True,那么会对移动的 Excel 单元格的公式进行转换,公式中使用的地址将被重新计算。比如,将公式为=A1的单元格B1向下移动一行,那么被覆盖的单元格B2的公式将是=A2

需要说明的是,对公式进行转换并不表示会移动公式所引用的单元格,除非这些单元格本身处于被移动的区域中。

Python openpyxl 包的 Worksheet 对象无法正常移动拥有数组公式的 Excel 单元格

无论是转换还是不转换公式,openpyxlWorksheet对象的move_range方法都无法可靠的移动拥有数组公式的 Excel 单元格。当translate参数为False时,单元格的数组公式可能丢失,当translate参数为True时,将导致异常的发生。

在 Excel 文件Goods.xlsxPens工作表中,单元格C1C2C3,包含了对区域A1:B3的计算公式,我们调用Worksheet对象的move_range方法来移动他们,并将translate参数设置为True,以确保移动后公式计算的结果依然准确。

move_range.py
# 请将命令行跳转至 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')

使用 Python openpyxl 包的 Worksheet 对象合并或取消合并 Excel 单元格

Pythonopenpyxl包的Worksheet对象的merge_cells方法,可用于合并 Excel 工作表中某个区域内的所有单元格,合并之后,原本区域左上角的单元格将占据整个区域,并可以通过该单元格原本的地址来访问他。如果只给出一个单元格,那么合并操作不会产生任何效果。

Pythonopenpyxl包的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_rowstart_columnend_rowend_column

start_row 参数

start_row参数是一个整数,表示被合并或取消合并的区域开始于第几行。

start_column 参数

start_column参数是一个整数,表示被合并或取消合并的区域开始于第几列。

end_row 参数

end_row参数是一个整数,表示被合并或取消合并的区域结束于第几行。

end_column 参数

end_column参数是一个整数,表示被合并或取消合并的区域结束于第几列。

被 Python openpyxl 包的 Worksheet 对象合并的 Excel 单元格将成为只读的

除了左上角的 Excel 单元格,被合并区域内的其他单元格将被转换为openpyxl包的MergedCell对象,其值或公式会被清空并成为只读的。如果被合并的 Excel 单元格通过unmerge_cells方法取消了合并,那么相关的MergedCell对象将重新转换为支持写入的Cell对象。

在下面的示例中,Excel 单元格B2并不位于被合并区域的左上角,因此B2的公式在合并之后被清空。

merge_cells.py
# 请将命令行跳转至 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

使用 Python openpyxl 包的 Worksheet 对象获取 Excel 工作表中所有被合并的区域

Pythonopenpyxl包的Worksheet对象的merged_cells变量是一个MultiCellRange对象,可用于表示 Excel 工作表中所有被合并的区域,通过该对象和in关键字,你可判断某个 Excel 单元格是否已经被合并。

worksheet.merged_cells

merge_cells.py
# …
# 合并区域 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

使用 Python openpyxl 包的 Worksheet 对象计算包含 Excel 工作表所有已用单元格的最小区域

Pythonopenpyxl包的Worksheet对象的calculate_dimension方法和dimensions属性,可用于计算包含 Excel 工作表已用单元格的最小区域,并返回该最小区域的表达式。Excel 已用单元格可能包括值为空的单元格,比如,一个没有数据但被设置了背景颜色的单元格。

worksheet.calculate_dimension()
worksheet.dimensions

Pythonopenpyxl包的ReadOnlyWorksheet对象的calculate_dimension方法,与Worksheet对象的calculate_dimension方法类似,只不过ReadOnlyWorksheet对象的calculate_dimension方法增加了一个参数force。出于对性能的考虑,如果一个 Excel 工作表尚未确定最大行和最大列,那么默认情况下,调用calculate_dimension方法会导致异常,此时可将参数force设置为True,以强制计算未确定的最大行和最大列。

readonlyworksheet.calculate_dimension(force=False)

force 参数

force参数表示是否强制计算已用单元格的最小区域,默认为False,不强制计算。

Python openpyxl 包的 Worksheet 对象所计算的已用单元格最小区域可能不准确

openpyxlWorksheet对象的calculate_dimension方法,会通过该对象的_cells变量来获取其包含的单元格的最小坐标和最大坐标,以确定整个 Excel 工作表的最小行,最小列,最大行,最大列以及最小区域。当使用Worksheet访问某个单元格时,新的单元格可能会被添加至_cells,从而导致最小行,最小列,最大行,最大列,最小区域的改变,即便被访问的单元格中没有任何数据。

Worksheet对象不同,openpyxlReadOnlyWorksheet对象的calculate_dimension方法采用了不同的运算逻辑,其返回的最小区域并不会随意改变。

在下面的例子中,我们分别通过WorksheetReadOnlyWorksheet对象访问单元格E5,该单元格不在原有最小区域B2:C3之内,输出结果表明Worksheet对象的calculate_dimension方法的计算结果发生了变化。

dimension.py
# 请将命令行跳转至 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

Pythonopenpyxl包的ReadOnlyWorksheet对象的reset_dimensions方法,会将ReadOnlyWorksheet对象计算的最大行和最大列设置为None,这导致在调用calculate_dimension方法时,需要把参数force设置为True,以重新计算最大行和最大列,否则会出现异常。

readonlyworksheet.reset_dimensions()

dimension.py
# …
# 重置最大行和最大列
r_empty.reset_dimensions()
# ERROR 需要将 force 参数设置为 True
r_empty.calculate_dimension()
ValueError: Worksheet is unsized, use calculate_dimension(force=True)

使用 Python openpyxl 包的 Worksheet 对象获取拥有数组公式的 Excel 单元格及其影响区域

Pythonopenpyxl包的Worksheet对象的array_formulae属性,返回一个 Python 字典,用于表示 Excel 工作表中所有拥有数组公式的单元格及其影响的区域,字典键值对的键为拥有数组公式的单元格的地址,字典键值对的值为数组公式所影响的区域对应的表达式,该区域中的单元格将存储公式的计算结果。比如,{'E1':'E1:E3'}表示单元格E1具有数组公式,该公式的计算结果存储在区域E1:E3中。

worksheet.array_formulae

使用 Python openpyxl 包的 Worksheet 对象获取和设置 Excel 工作表的名称(标题)

Pythonopenpyxl包的WorksheetWriteOnlyWorksheet对象的title属性,可用于获取或设置 Excel 工作表的名称(标题)。Pythonopenpyxl包的ReadOnlyWorksheet对象的title变量,用于表示 Excel 工作表的名称,对该变量进行修改并没有太大意义,因为无法将其保存至 Excel 文件。

worksheet|writeonlyworksheet|readonlyworksheet.title
worksheet|writeonlyworksheet|readonlyworksheet.title = name

name 值

name为 Excel 工作表的名称。

sheet.py
# 请将命令行跳转至 Goods.xlsx 所在的目录,然后运行此脚本文件
from openpyxl import load_workbook

workbook = load_workbook('Goods.xlsx') # 修改工作表 Tables 的名称,并保存为 Name.xlsx workbook['Tables'].title = 'New Tables' workbook.save('Name.xlsx')

使用 Python openpyxl 包的 Worksheet 对象获取和设置 Excel 工作表的显示状态

Pythonopenpyxl包的WorksheetWriteOnlyWorksheetReadOnlyWorksheet对象的sheet_state变量,可用于获取或设置 Excel 工作表的显示状态(是否被隐藏),当然,修改ReadOnlyWorksheet对象的sheet_state变量意义不大,因为无法进行保存。sheet_state变量的有效取值有以下几种。

'visible'

'visible'对应了Worksheet的类变量SHEETSTATE_VISIBLE,表示 Excel 工作表处于显示状态。

'hidden'

'hidden'对应了Worksheet的类变量SHEETSTATE_HIDDEN,表示 Excel 工作表处于隐藏状态,一般可通过 Office 软件重新显示。

'veryHidden'

'veryHidden'对应了Worksheet的类变量SHEETSTATE_VERYHIDDEN,表示 Excel 工作表处于隐藏状态,且无法通过 Office 软件重新显示(由具体的 Office 软件决定)。

worksheet|writeonlyworksheet|readonlyworksheet.sheet_state
worksheet|writeonlyworksheet|readonlyworksheet.sheet_state = state

state 值

state为 Excel 工作表的显示状态。

sheet.py
# …
workbook = load_workbook('Goods.xlsx')
# 隐藏工作表 Pens,Cups
workbook['Pens'].sheet_state = 'hidden'
workbook['Cups'].sheet_state = 'veryHidden'
workbook.save('Hidden.xlsx')

使用 Python openpyxl 包的 Worksheet 对象获取 Excel 工作表所隶属的工作簿

Pythonopenpyxl包的WorksheetWriteOnlyWorksheetReadOnlyWorksheet对象的parent属性,表示了 Excel 工作表所隶属的工作簿对象。如果 Excel 工作表不属于任何工作簿,那么parent属性将返回空值None

worksheet|writeonlyworksheet|readonlyworksheet.parent

sheet.py
from openpyxl import Workbook

worksheet = Workbook(True).create_sheet() worksheet.title = 'MySheet' # 通过 parent 属性获取工作表对应的工作簿对象 worksheet.parent.save('Parent.xlsx')

使用 Python openpyxl 包的 Worksheet 对象获取和设置 Excel 工作表的保护信息

Pythonopenpyxl包的WorksheetWriteOnlyWorksheet对象的protection变量是一个SheetProtection对象,该对象包含了 Excel 工作表的保护信息。这些保护信息仅被 Office 软件用于限制用户的行为,并不会对 Pythonopenpyxl包的行为造成影响。

worksheet|writeonlyworksheet.protection

sheet.py
# …
workbook = load_workbook('Goods.xlsx')
protection = workbook['Flowers'].protection
# 启用对工作表 Flowers 的保护
protection.sheet = True
# 允许用户在 Office 软件中删除行或列
protection.deleteColumns = False
protection.deleteRows = False
workbook.save('Protection.xlsx')

Python openpyxl 包的 Worksheet 对象的其他特性

以下是与openpyxl包的WorksheetReadOnlyWorksheetWriteOnlyWorksheet对象相关,但不太重要的一些特性,这些特性可能并非从 Microsoft Excel 文件获取,只是由openpyxl包给出了固定值。

encoding 属性

WorkbookReadOnlyWorksheetWriteOnlyWorksheet对象的encoding属性,用于表示 Excel 工作表所属的工作簿的编码,他由openpyxl指定为'utf-8'

源码

src/zh/openpyxl/worksheets·codebeatme/office-programming·GitHub