如何使用 Python openpyxl 包操作 Excel 行和列

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

本节内容不涉及与 Excel 样式,计算,页眉页脚相关的内容。

使用 Python openpyxl 包的 Worksheet 对象遍历 Excel 行或列

Pythonopenpyxl包的Worksheet对象的属性rowscolumns,返回一个可按照行或列遍历 Excel 单元格的 Python 生成器对象,遍历的范围从 Excel 工作表的第一行或第一列开始,至 Excel 工作表的最大行或最大列结束。

Worksheet对象类似,Pythonopenpyxl包的ReadOnlyWorksheet对象同样拥有属性rows,但ReadOnlyWorksheet并不具有属性columns

worksheet|readonlyworksheet.rows
worksheet.columns

Excel 文件Food.xlsxFruit工作表的最大行和最大列均为2

get.py
# 读取 Excel 文件 Food.xlsx 中的工作表 Fruit
from openpyxl import load_workbook
workbook = load_workbook('Food.xlsx')
worksheet = workbook['Fruit']

# 工作表最大行是 2,最大列是 2 for row in worksheet.rows: print(row)
for column in worksheet.columns: print(column)
(<Cell 'Fruit'.A1>, <Cell 'Fruit'.B1>)
(<Cell 'Fruit'.A2>, <Cell 'Fruit'.B2>)
(<Cell 'Fruit'.A1>, <Cell 'Fruit'.A2>)
(<Cell 'Fruit'.B1>, <Cell 'Fruit'.B2>)

Pythonopenpyxl包的Worksheet对象的方法iter_rowsiter_cols,可按照行或列的方式遍历 Excel 工作表的某个区域。

Worksheet对象类似,Pythonopenpyxl包的ReadOnlyWorksheet对象同样拥有方法iter_rows,但ReadOnlyWorksheet并不具有方法iter_cols

worksheet|readonlyworksheet.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False)
worksheet.iter_cols(min_col=None, max_col=None, min_row=None, max_row=None, values_only=False)

min_row,min_col,max_row,max_col 参数

参数min_rowmin_colmax_rowmax_col分别为最小行,最小列,最大行和最大列,他们将用于表示被遍历的区域。如果min_rowmin_col为默认值None,那么其效果等同于设置为1,如果max_rowmax_col为默认值None,那么其效果等同于使用 Excel 工作表的最大行和最大列。

需要指出的是,对于ReadOnlyWorksheet对象,当参数max_row大于 Excel 工作表的最大行时,将采用 Excel 工作表的最大行。

values_only 参数

values_only参数的默认值为False,表示遍历的目标是 Excel 单元格,如果设置为True,那么将遍历 Excel 单元格的值。

在下面的示例中,我们分别使用iter_rowsiter_cols方法,遍历了 Excel 文件Food.xlsxSweets工作表的区域B1:C3A1:B2

iter.py
# 读取 Excel 文件 Food.xlsx 中的工作表 Sweets
from openpyxl import load_workbook
workbook = load_workbook('Food.xlsx')
worksheet = workbook['Sweets']

# 按照行的方式遍历单元格区域 B1:C3 for row in worksheet.iter_rows(max_row=3, min_col=2, max_col=3): print(row)
# 按照列的方式遍历区域 A1:B2 内的单元格的值 for column_values in worksheet.iter_cols(max_col=2, max_row=2, values_only=True): print(column_values)
(<Cell 'Sweets'.B1>, <Cell 'Sweets'.C1>)
(<Cell 'Sweets'.B2>, <Cell 'Sweets'.C2>)
(<Cell 'Sweets'.B3>, <Cell 'Sweets'.C3>)
(None, None)
(None, '白糖')

使用 Python openpyxl 包的 Worksheet 对象获取 Excel 的最小行,最小列,最大行,最大列

Pythonopenpyxl包的WorksheetReadOnlyWorksheet对象的属性min_rowmin_columnmax_rowmax_column,可用于获取 Excel 工作表的最小行,最小列,最大行,最大列,他们表示了工作表所有已用单元格的最小区域。需要注意的是,Worksheet对象所计算的 Excel 工作表的最小行,最小列,最大行和最大列,可能会因为对某个 Excel 单元格的访问而改变,这包括访问单元格的方法或函数,比如iter_rowsiter_cols

worksheet|readonlyworksheet.min_row
worksheet|readonlyworksheet.min_column
worksheet|readonlyworksheet.max_row
worksheet|readonlyworksheet.max_column

Excel 文件Food.xlsxCakes工作表的已用单元格的最小区域为B2:C3,在通过Worksheet对象访问单元格A1D4之后,最小区域将发生变化。

min_and_max.py
# 读取 Excel 文件 Food.xlsx 中的工作表 Cakes
from openpyxl import open
workbook = open('Food.xlsx')
worksheet = workbook['Cakes']

# 工作表的已用单元格的最小区域为 B2:C3 print(f'最小行 {worksheet.min_row},最小列 {worksheet.min_column},最大行 {worksheet.max_row},最大列 {worksheet.max_row}')
# 在访问单元格 A1 和 D4 之后,最小区域发生改变 worksheet['A1'] worksheet['D4'] print(f'最小行 {worksheet.min_row},最小列 {worksheet.min_column},最大行 {worksheet.max_row},最大列 {worksheet.max_row}')
最小行 2,最小列 2,最大行 3,最大列 3
最小行 1,最小列 1,最大行 4,最大列 4

使用 Python openpyxl 包的 Worksheet 对象插入和删除 Excel 行或列

Pythonopenpyxl包的Worksheet对象的方法insert_rowsinsert_cols,可用于在指定位置为 Excel 工作表插入指定数量的行或列。

worksheet.insert_rows(idx, amount=1)
worksheet.insert_cols(idx, amount=1)

idx 参数

idx参数表示在 Excel 工作表的第几行或第几列之前插入新的行或列,1表示第一行或第一列。需要指出,如果将该参数设置为0None,那么最终效果与设置为1类似,但可能会导致一些问题。

amount 参数

amount参数表示需要插入的 Excel 行或列的个数,其默认值为1。如果将该参数设置为0,那么整个 Excel 工作表中的单元格可能会被清空。

Pythonopenpyxl包的Worksheet对象的方法delete_rowsdelete_cols,可用于在指定位置为 Excel 工作表删除指定数量的行或列。

worksheet.delete_rows(idx, amount=1)
worksheet.delete_cols(idx, amount=1)

idx 参数

idx参数表示在 Excel 工作表的第几行或第几列执行删除操作,1表示第一行或第一列。需要指出,如果将该参数设置为0None,那么最终效果与设置为1类似,但可能会导致一些问题。

amount 参数

amount参数表示需要删除的 Excel 行或列的个数,其默认值为1。如果将该参数设置为0,那么整个 Excel 工作表中的单元格可能会被清空。

工作表

如果希望在 Excel 工作表中添加一行数据,请查看使用 Python openpyxl 包的 Worksheet 对象为 Excel 工作表添加数据(值)一段。

下面的代码,我们为 Excel 文件Food.xlsxBread工作表先后插入和删除一些行和列,并将其保存为NewFood.xlsx

insert_and_delete.py
# 读取 Excel 文件 Food.xlsx 中的工作表 Bread
import openpyxl
workbook = openpyxl.load_workbook('Food.xlsx')
worksheet = workbook['Bread']

# 在当前第一行的位置插入两行 worksheet.insert_rows(1, 2) # 在当前第一列的位置插入两列 worksheet.insert_cols(1, 2) # 删除第四行和第四列 worksheet.delete_rows(4) worksheet.delete_cols(4)
# 保存为 Excel 文件 NewFood.xlsx workbook.save('NewFood.xlsx')

Python openpyxl 包的 Worksheet 对象不会在插入和删除行或列之后转换 Excel 单元格公式

如果你在一些 Office 软件中插入或删除 Excel 工作表中的行或列,那么相关 Excel 单元格的公式可能会自动转换,以消除由于单元格移动而导致的公式计算问题。不过,openpyxlWorksheet对象并未提供此类功能,在使用方法insert_rowsinsert_colsdelete_rowsdelete_cols之后,相关 Excel 单元格的公式不会改变,如果他们拥有公式的话。

在 Excel 文件Food.xlsxFish工作表中,单元格B4拥有计算公式=SUM(B1:B3),在插入两行向下移动之后,单元格B6(原B4)的计算公式没有变化。

formula.py
# 读取 Excel 文件 Food.xlsx 中的工作表 Fish
import openpyxl
workbook = openpyxl.load_workbook('Food.xlsx')
worksheet = workbook['Fish']

# 在工作表的开始插入两行,原单元格 B4 的计算公式不会改变 worksheet.insert_rows(1, 2)
# 保存为 Excel 文件 Formula.xlsx workbook.save('Formula.xlsx')

使用 Python openpyxl 包的 Worksheet 对象获取和设置 Excel 行或列的显示状态

Pythonopenpyxl包的WorksheetWriteOnlyWorksheet对象的变量row_dimensionscolumn_dimensions,他们的hidden变量用于表示 Excel 行或列的显示状态。

worksheet|writeonlyworksheet.row_dimensions|column_dimensions[index].hidden
worksheet|writeonlyworksheet.row_dimensions|column_dimensions[index].hidden = state

index 值

index为需要获取或设置显示状态的 Excel 行或列的索引,1表示第一行,'A'表示第一列。

state 值

state表示 Excel 行或列的显示状态,为True表示隐藏行或列,为False表示显示行或列。

在下面的示例中,我们隐藏了 Excel 文件Food.xlsxFruit工作表的第一行和第一列,并保存为文件Hidden.xlsx

hide.py
# 读取 Excel 文件 Food.xlsx 中的工作表 Fruit
from openpyxl import load_workbook
workbook = load_workbook('Food.xlsx')
worksheet = workbook['Fruit']

# 隐藏第一行或第一列 worksheet.row_dimensions[1].hidden = True worksheet.column_dimensions['A'].hidden = True
workbook.save('Hidden.xlsx')

使用 Python openpyxl 包的 Worksheet 对象组合 Excel 行或列

Pythonopenpyxl包的WorksheetWriteOnlyWorksheet对象的变量row_dimensionscolumn_dimensions,他们的group方法可以组合(可折叠或展开 Excel 行或列)Excel 工作表中的某些行或列,他们的outlineLeveloutline_level变量可以获取和设置 Excel 行或列在组合中的大纲级别。

worksheet|writeonlyworksheet.row_dimensions|column_dimensions.group(start, end=None, outline_level=1, hidden=False)

start 参数

start参数表示组合开始的 Excel 行或列,比如,1表示第一行,'A'表示第一列。

end 参数

end参数表示组合结束的 Excel 行或列(不能位于开始行的上方,或开始列的左边),比如,3表示第三行,'C'表示第三列。默认值为None,这将仅组合start参数所表示的行或列。

outline_level 参数

outline_level参数为组合的大纲级别(折叠级别),默认为1

hidden 参数

hidden参数表示被组合的 Excel 行或列是否被折叠(隐藏),默认为False,不折叠。

worksheet|writeonlyworksheet.row_dimensions|column_dimensions[index].outlineLevel|outline_level
worksheet|writeonlyworksheet.row_dimensions|column_dimensions[index].outlineLevel|outline_level = level

index 值

index为需要获取或设置大纲级别的 Excel 行或列的索引,1表示第一行,'A'表示第一列。

level 值

level表示 Excel 行或列的大纲级别,大于0等同于将行或列加入组合,小于等于0等同于取消行或列的组合。

在下面的代码中,我们组合了 Excel 文件Food.xlsxSweets工作表的第2行至第4行,B列至D列。

group.py
# 读取 Excel 文件 Food.xlsx 中的工作表 Sweets
from openpyxl import load_workbook
workbook = load_workbook('Food.xlsx')
worksheet = workbook['Sweets']

# 组合工作表的区域 B2:D4 worksheet.row_dimensions.group(2, 4, hidden=True) worksheet.column_dimensions['B'].outlineLevel = 1 worksheet.column_dimensions['C'].outlineLevel = 2 worksheet.column_dimensions['D'].outline_level = 1
workbook.save('Group.xlsx')

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

Pythonopenpyxl包的WorksheetWriteOnlyWorksheet对象的变量row_dimensionscolumn_dimensions,他们的parent变量表示了 Excel 行或列所隶属的工作表对象。

worksheet|writeonlyworksheet.row_dimensions|column_dimensions[index].parent

index 值

index为需要获取隶属工作表对象的 Excel 行或列的索引,1表示第一行,'A'表示第一列。

Excel 行和列的其他特性

以下是与 Excel 行或列相关的其他特性。

index 变量

WorkbookWriteOnlyWorksheet对象的变量row_dimensionscolumn_dimensions,他们的index变量表示了 Excel 行或列的索引,1表示第一行,'A'表示第一列,比如,wb['Sheet'].row_dimensions[1].index

源码

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