如何使用 openpyxl 處理 Excel 列和欄
訂閱 375
本節內容不涉及與 Excel 格式,計算,頁眉頁腳相關的內容。
周遊 Excel 列或欄
Worksheet
物件的屬性rows
和columns
,傳回一個可按照列或欄周遊 Excel 儲存格的 Python 建置器物件,周遊的範圍從工作表的第一列或第一欄開始,至工作表的最大列或最大欄結束。
與Worksheet
物件類似,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>)
Worksheet
物件的方法iter_rows
和iter_cols
,可按照列或欄的方式周遊 Excel 工作表的某個範圍。
與Worksheet
物件類似,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
,那麽其效果等同於使用工作表的最大列和最大欄。需要指出的是,對於
ReadOnlyWorksheet
物件,當參數max_row
大於工作表的最大列時,將采用工作表的最大列。- values_only 參數
values_only
參數的預設值為False
,表示周遊的目標是儲存格,如果設定為True
,那麽將周遊儲存格的值。
在下面的範例中,我們分別使用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, '白糖')
取得 Excel 的最小列,最小欄,最大列,最大欄
Worksheet
和ReadOnlyWorksheet
物件的屬性min_row
,min_column
,max_row
,max_column
,可用於取得 Excel 工作表的最小列,最小欄,最大列,最大欄,他們表示了工作表所有已用儲存格的最小範圍。需要註意的是,Worksheet
物件所計算的工作表的最小列,最小欄,最大列和最大欄,可能會因為對某個儲存格的存取而改變,這包括存取儲存格的方法或函式,比如iter_rows
和iter_cols
。
worksheet|readonlyworksheet.min_row
worksheet|readonlyworksheet.min_column
worksheet|readonlyworksheet.max_row
worksheet|readonlyworksheet.max_column
工作表
關於如何計算 Excel 工作表中已用儲存格的最小範圍,你可以檢視計算包含 Excel 工作表所有已用儲存格的最小範圍一段。
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
插入和刪除 Excel 列或欄
Worksheet
物件的方法insert_rows
和insert_cols
,可用於在指定位置為 Excel 工作表插入指定數量的列或欄。
worksheet.insert_rows(idx, amount=1)
worksheet.insert_cols(idx, amount=1)
- idx 參數
idx
參數表示在工作表的第幾列或第幾欄之前插入新的列或欄,1
表示第一列或第一欄。需要指出,如果將該參數設定為0
或None
,那麽最終效果與設定為1
類似,但可能會導致一些問題。- amount 參數
amount
參數表示需要插入的列或欄的個數,其預設值為1
。如果將該參數設定為0
,那麽整個工作表中的儲存格可能會被清空。
Worksheet
物件的方法delete_rows
和delete_cols
,可用於在指定位置為 Excel 工作表刪除指定數量的列或欄。
worksheet.delete_rows(idx, amount=1)
worksheet.delete_cols(idx, amount=1)
- idx 參數
idx
參數表示在工作表的第幾列或第幾欄執行刪除操作,1
表示第一列或第一欄。需要指出,如果將該參數設定為0
或None
,那麽最終效果與設定為1
類似,但可能會導致一些問題。- amount 參數
amount
參數表示需要刪除的列或欄的個數,其預設值為1
。如果將該參數設定為0
,那麽整個工作表中的儲存格可能會被清空。
工作表
如果希望在 Excel 工作表中新增一列資料,請檢視為 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')
Worksheet 物件不會在插入和刪除列或欄之後轉換儲存格公式
如果你在一些 Office 軟體中插入或刪除工作表中的列或欄,那麽相關儲存格的公式可能會自動轉換,以消除由於儲存格移動而導致的公式計算問題。不過,Worksheet
物件並未提供此類功能,在使用方法insert_rows
,insert_cols
,delete_rows
和delete_cols
之後,相關儲存格的公式不會改變,如果他們擁有公式的話。
在 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')
WriteOnlyWorksheet 應在寫入資料之前設定 Excel 列或欄
應該在寫入任何資料之前,使用WriteOnlyWorksheet
物件的column_dimensions
變數,設定某一個 Excel 欄的相關資訊(比如,顯示狀態,保護資訊等),否則設定可能不會生效。
應該在寫入任何一列資料之前,使用WriteOnlyWorksheet
物件的row_dimensions
變數,設定該 Excel 列的相關資訊(比如,顯示狀態,保護資訊等),否則設定可能不會生效。
取得和設定 Excel 列的高度和欄的寬度
Worksheet
和WriteOnlyWorksheet
物件的變數row_dimensions
,其變數ht
和height
是一個浮點數,用於表示 Excel 列的高度。
worksheet|writeonlyworksheet.row_dimensions[index].ht|height
worksheet|writeonlyworksheet.row_dimensions[index].ht|height = height
- index 值
index
為需要取得或設定高度的列的索引,1
表示第一列。- height 值
height
是表示列的高度的浮點數。
Worksheet
和WriteOnlyWorksheet
物件的變數column_dimensions
,其變數width
是一個浮點數,用於表示 Excel 欄的寬度。
worksheet|writeonlyworksheet.column_dimensions[index].width
worksheet|writeonlyworksheet.column_dimensions[index].width = width
- index 值
index
為需要取得或設定寬度的欄的索引,'A'
表示第一欄。- width 值
width
是表示欄的寬度的浮點數。
在下面的範例中,我們設定了第一列的高度,以及第一欄的寬度,雖然都是30
,但儲存格A1
並不是一個正方形,因為高度和寬度可能采用了不同的度量單位。
# 建立唯寫活頁簿,並新增工作表 HW
from openpyxl import Workbook
wb = Workbook(True)
ws = wb.create_sheet('HW')
# 設定第一列的高度
ws.row_dimensions[1].height = 30
# 設定第一欄的寬度
ws.column_dimensions['A'].width = 30
wb.save('HW.xlsx')
判斷 Excel 列或欄是否自訂了高度或寬度
Worksheet
和WriteOnlyWorksheet
物件的變數row_dimensions
,其customHeight
屬性可用於判斷 Excel 列是否自訂了高度。
worksheet|writeonlyworksheet.row_dimensions[index].customHeight
- index 值
index
為需要判斷是否擁有自訂高度的列的索引,1
表示第一列。
Worksheet
和WriteOnlyWorksheet
物件的變數column_dimensions
,其customWidth
屬性可用於判斷 Excel 欄是否自訂了寬度。
worksheet|writeonlyworksheet.column_dimensions[index].customWidth
- index 值
index
為需要判斷是否擁有自訂寬度的欄的索引,'A'
表示第一欄。
我們為之前的範例新增一些程式碼,判斷第一列是否擁有自訂高度,第一欄是否擁有自訂寬度。
# …
# 是否擁有自訂高度和寬度?
print(ws.row_dimensions[1].customHeight)
print(ws.column_dimensions['A'].customWidth)
True
True
取得和設定 Excel 列或欄的顯示狀態
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
為需要取得或設定顯示狀態的列或欄的索引,1
表示第一列,'A'
表示第一欄。- state 值
state
表示列或欄的顯示狀態,為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')
取得和設定 Excel 列或欄的保護資訊
Worksheet
和WriteOnlyWorksheet
物件的變數row_dimensions
和column_dimensions
,他們的protection
變數用於表示 Excel 列或欄的保護資訊,其型別為openpyxl
套件的Protection
類別。
worksheet|writeonlyworksheet.row_dimensions|column_dimensions[index].protection
worksheet|writeonlyworksheet.row_dimensions|column_dimensions[index].protection = protection
- index 值
index
為需要取得或設定保護資訊的列或欄的索引,1
表示第一列,'A'
表示第一欄。- protection 值
protection
為表示列或欄保護資訊的Protection
物件。
儲存格
關於 Pythonopenpyxl
套件的Protection
物件,請檢視openpyxl Excel 儲存格保護物件 Protection一段。
在下面的範例中,我們設定了 Excel 檔案Food.xlsx
的Sandwich
工作表的第一列的保護資訊。
# 開啟 Food.xlsx 中的工作表 Sandwich
import openpyxl
workbook = openpyxl.load_workbook('Food.xlsx')
worksheet = workbook['Sandwich']
from openpyxl.styles.protection import Protection
# 當工作表被保護時,將隱藏第一列儲存格的公式,並鎖定第一列儲存格
worksheet.row_dimensions[1].protection = Protection(True, True)
workbook.save('PRow.xlsx')
組合 Excel 列或欄
Worksheet
和WriteOnlyWorksheet
物件的變數row_dimensions
和column_dimensions
,他們的group
方法可以組合(可摺疊或展開 Excel 列或欄)工作表中的某些列或欄,他們的outlineLevel
,outline_level
變數可以取得和設定列或欄在組合中的大綱層級。
worksheet|writeonlyworksheet.row_dimensions|column_dimensions.group(start, end=None, outline_level=1, hidden=False)
- start 參數
start
參數表示組合開始的列或欄,比如,1
表示第一列,'A'
表示第一欄。- end 參數
end
參數表示組合結束的列或欄(不能位於開始列的上方,或開始欄的左邊),比如,3
表示第三列,'C'
表示第三欄。預設值為None
,這將僅組合start
參數所表示的列或欄。- outline_level 參數
outline_level
參數為組合的大綱層級(摺疊層級),預設為1
。- hidden 參數
hidden
參數表示被組合的列或欄是否被摺疊(隱藏),預設為False
,不摺疊。
worksheet|writeonlyworksheet.row_dimensions|column_dimensions[index].outlineLevel|outline_level
worksheet|writeonlyworksheet.row_dimensions|column_dimensions[index].outlineLevel|outline_level = level
- index 值
index
為需要取得或設定大綱層級的列或欄的索引,1
表示第一列,'A'
表示第一欄。- level 值
level
表示列或欄的大綱層級,大於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')
取得 Excel 列或欄所隸屬的工作表
Worksheet
和WriteOnlyWorksheet
物件的變數row_dimensions
和column_dimensions
,他們的parent
變數表示了 Excel 列或欄所隸屬的工作表物件。
worksheet|writeonlyworksheet.row_dimensions|column_dimensions[index].parent
- index 值
index
為需要取得隸屬工作表物件的列或欄的索引,1
表示第一列,'A'
表示第一欄。
Excel 列和欄的其他特性
以下是與 Excel 列或欄相關的其他特性。
- index 變數
Workbook
和WriteOnlyWorksheet
物件的變數row_dimensions
和column_dimensions
,他們的index
變數表示了列或欄的索引,1
表示第一列,'A'
表示第一欄,比如,wb['Sheet'].row_dimensions[1].index
。- r 變數
Workbook
和WriteOnlyWorksheet
物件的變數row_dimensions
,他們的r
變數表示了列的索引,1
表示第一列。
原始碼
src/zh-hant/openpyxl/rows_and_columns·codebeatme/office-programming·GitHub