如何使用 openpyxl 處理 Excel 列和欄
訂閱 480
本節內容不涉及與 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