如何使用 Python openpyxl 套件操作 Excel 列和欄

閱讀 13:49·字數 4148·發佈 
Youtube 頻道
訂閱 133

本節內容不涉及與 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-hant/openpyxl/rows_and_columns·codebeatme/office-programming·GitHub