如何使用 Python openpyxl 套件操作 Excel 列和欄
本節內容不涉及與 Excel 樣式,計算,頁眉頁腳相關的內容。
使用 Python openpyxl 套件的 Worksheet 物件周遊 Excel 列或欄
Pythonopenpyxl
套件的Worksheet
物件的屬性rows
和columns
,傳回一個可按照列或欄周遊 Excel 儲存格的 Python 建置器物件,周遊的範圍從 Excel 工作表的第一列或第一欄開始,至 Excel 工作表的最大列或最大欄結束。
與Worksheet
物件類似,Pythonopenpyxl
套件的ReadOnlyWorksheet
物件同樣擁有屬性rows
,但ReadOnlyWorksheet
並不具有屬性columns
。
worksheet|readonlyworksheet.rows
worksheet.columns
Excel 檔案Food.xlsx
的Fruit
工作表的最大列和最大欄均為2
。
# 讀取 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_rows
和iter_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_row
,min_col
,max_row
,max_col
分別為最小列,最小欄,最大列和最大欄,他們將用於表示被周遊的範圍。如果min_row
,min_col
為預設值None
,那麽其效果等同於設定為1
,如果max_row
,max_col
為預設值None
,那麽其效果等同於使用 Excel 工作表的最大列和最大欄。需要指出的是,對於
ReadOnlyWorksheet
物件,當參數max_row
大於 Excel 工作表的最大列時,將采用 Excel 工作表的最大列。- values_only 參數
values_only
參數的預設值為False
,表示周遊的目標是 Excel 儲存格,如果設定為True
,那麽將周遊 Excel 儲存格的值。
在下面的範例中,我們分別使用iter_rows
和iter_cols
方法,周遊了 Excel 檔案Food.xlsx
的Sweets
工作表的範圍B1:C3
和A1:B2
。
# 讀取 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
套件的Worksheet
和ReadOnlyWorksheet
物件的屬性min_row
,min_column
,max_row
,max_column
,可用於取得 Excel 工作表的最小列,最小欄,最大列,最大欄,他們表示了工作表所有已用儲存格的最小範圍。需要註意的是,Worksheet
物件所計算的 Excel 工作表的最小列,最小欄,最大列和最大欄,可能會因為對某個 Excel 儲存格的存取而改變,這包括存取儲存格的方法或函式,比如iter_rows
和iter_cols
。
worksheet|readonlyworksheet.min_row
worksheet|readonlyworksheet.min_column
worksheet|readonlyworksheet.max_row
worksheet|readonlyworksheet.max_column
Excel 檔案Food.xlsx
的Cakes
工作表的已用儲存格的最小範圍為B2:C3
,在通過Worksheet
物件存取儲存格A1
和D4
之後,最小範圍將發生變化。
# 讀取 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_rows
和insert_cols
,可用於在指定位置為 Excel 工作表插入指定數量的列或欄。
worksheet.insert_rows(idx, amount=1)
worksheet.insert_cols(idx, amount=1)
- idx 參數
idx
參數表示在 Excel 工作表的第幾列或第幾欄之前插入新的列或欄,1
表示第一列或第一欄。需要指出,如果將該參數設定為0
或None
,那麽最終效果與設定為1
類似,但可能會導致一些問題。- amount 參數
amount
參數表示需要插入的 Excel 列或欄的個數,其預設值為1
。如果將該參數設定為0
,那麽整個 Excel 工作表中的儲存格可能會被清空。
Pythonopenpyxl
套件的Worksheet
物件的方法delete_rows
和delete_cols
,可用於在指定位置為 Excel 工作表刪除指定數量的列或欄。
worksheet.delete_rows(idx, amount=1)
worksheet.delete_cols(idx, amount=1)
- idx 參數
idx
參數表示在 Excel 工作表的第幾列或第幾欄執行刪除操作,1
表示第一列或第一欄。需要指出,如果將該參數設定為0
或None
,那麽最終效果與設定為1
類似,但可能會導致一些問題。- amount 參數
amount
參數表示需要刪除的 Excel 列或欄的個數,其預設值為1
。如果將該參數設定為0
,那麽整個 Excel 工作表中的儲存格可能會被清空。
工作表
如果希望在 Excel 工作表中新增一列資料,請檢視使用 Python openpyxl 套件的 Worksheet 物件為 Excel 工作表新增資料(值)一段。
下面的程式碼,我們為 Excel 檔案Food.xlsx
的Bread
工作表先後插入和刪除一些列和欄,並將其儲存為NewFood.xlsx
。
# 讀取 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 儲存格的公式可能會自動轉換,以消除由於儲存格移動而導致的公式計算問題。不過,openpyxl
Worksheet
物件並未提供此類功能,在使用方法insert_rows
,insert_cols
,delete_rows
和delete_cols
之後,相關 Excel 儲存格的公式不會改變,如果他們擁有公式的話。
在 Excel 檔案Food.xlsx
的Fish
工作表中,儲存格B4
擁有計算公式=SUM(B1:B3)
,在插入兩列向下移動之後,儲存格B6
(原B4
)的計算公式沒有變化。
# 讀取 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
套件的Worksheet
和WriteOnlyWorksheet
物件的變數row_dimensions
和column_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.xlsx
的Fruit
工作表的第一列和第一欄,並儲存為檔案Hidden.xlsx
。
# 讀取 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
套件的Worksheet
和WriteOnlyWorksheet
物件的變數row_dimensions
和column_dimensions
,他們的group
方法可以組合(可折疊或展開 Excel 列或欄)Excel 工作表中的某些列或欄,他們的outlineLevel
,outline_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.xlsx
的Sweets
工作表的第2
列至第4
列,B
欄至D
欄。
# 讀取 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
套件的Worksheet
和WriteOnlyWorksheet
物件的變數row_dimensions
和column_dimensions
,他們的parent
變數表示了 Excel 列或欄所隸屬的工作表物件。
worksheet|writeonlyworksheet.row_dimensions|column_dimensions[index].parent
- index 值
index
為需要取得隸屬工作表物件的 Excel 列或欄的索引,1
表示第一列,'A'
表示第一欄。
Excel 列和欄的其他特性
以下是與 Excel 列或欄相關的其他特性。
- index 變數
Workbook
和WriteOnlyWorksheet
物件的變數row_dimensions
和column_dimensions
,他們的index
變數表示了 Excel 列或欄的索引,1
表示第一列,'A'
表示第一欄,比如,wb['Sheet'].row_dimensions[1].index
。
程式碼
src/zh-hant/openpyxl/rows_and_columns·codebeatme/office-programming·GitHub