URLhttps://learnscript.net/zh-hant/office-programming/openpyxl/rows-and-columns/
    複製連結移至說明  範例

    如何使用 openpyxl 處理 Excel 列和欄

    閱讀 17:41·字數 5308·更新 
    Youtube 頻道
    訂閱 375

    本節內容不涉及與 Excel 格式,計算,頁眉頁腳相關的內容。

    周遊 Excel 列或欄

    Worksheet物件的屬性rowscolumns,傳回一個可按照列或欄周遊 Excel 儲存格的 Python 建置器物件,周遊的範圍從工作表的第一列或第一欄開始,至工作表的最大列或最大欄結束。

    Worksheet物件類似,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>)

    Worksheet物件的方法iter_rowsiter_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_rowmin_colmax_rowmax_col分別為最小列,最小欄,最大列和最大欄,他們將用於表示被周遊的範圍。如果min_rowmin_col為預設值None,那麽其效果等同於設定為1,如果max_rowmax_col為預設值None,那麽其效果等同於使用工作表的最大列和最大欄。

    需要指出的是,對於ReadOnlyWorksheet物件,當參數max_row大於工作表的最大列時,將采用工作表的最大列。

    values_only 參數

    values_only參數的預設值為False,表示周遊的目標是儲存格,如果設定為True,那麽將周遊儲存格的值。

    在下面的範例中,我們分別使用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, '白糖')

    取得 Excel 的最小列,最小欄,最大列,最大欄

    WorksheetReadOnlyWorksheet物件的屬性min_rowmin_columnmax_rowmax_column,可用於取得 Excel 工作表的最小列,最小欄,最大列,最大欄,他們表示了工作表所有已用儲存格的最小範圍。需要註意的是,Worksheet物件所計算的工作表的最小列,最小欄,最大列和最大欄,可能會因為對某個儲存格的存取而改變,這包括存取儲存格的方法或函式,比如iter_rowsiter_cols

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

    工作表

    關於如何計算 Excel 工作表中已用儲存格的最小範圍,你可以檢視計算包含 Excel 工作表所有已用儲存格的最小範圍一段。

    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

    插入和刪除 Excel 列或欄

    Worksheet物件的方法insert_rowsinsert_cols,可用於在指定位置為 Excel 工作表插入指定數量的列或欄。

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

    idx 參數

    idx參數表示在工作表的第幾列或第幾欄之前插入新的列或欄,1表示第一列或第一欄。需要指出,如果將該參數設定為0None,那麽最終效果與設定為1類似,但可能會導致一些問題。

    amount 參數

    amount參數表示需要插入的列或欄的個數,其預設值為1。如果將該參數設定為0,那麽整個工作表中的儲存格可能會被清空。

    Worksheet物件的方法delete_rowsdelete_cols,可用於在指定位置為 Excel 工作表刪除指定數量的列或欄。

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

    idx 參數

    idx參數表示在工作表的第幾列或第幾欄執行刪除操作,1表示第一列或第一欄。需要指出,如果將該參數設定為0None,那麽最終效果與設定為1類似,但可能會導致一些問題。

    amount 參數

    amount參數表示需要刪除的列或欄的個數,其預設值為1。如果將該參數設定為0,那麽整個工作表中的儲存格可能會被清空。

    工作表

    如果希望在 Excel 工作表中新增一列資料,請檢視為 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')

    Worksheet 物件不會在插入和刪除列或欄之後轉換儲存格公式

    如果你在一些 Office 軟體中插入或刪除工作表中的列或欄,那麽相關儲存格的公式可能會自動轉換,以消除由於儲存格移動而導致的公式計算問題。不過,Worksheet物件並未提供此類功能,在使用方法insert_rowsinsert_colsdelete_rowsdelete_cols之後,相關儲存格的公式不會改變,如果他們擁有公式的話。

    在 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')

    WriteOnlyWorksheet 應在寫入資料之前設定 Excel 列或欄

    應該在寫入任何資料之前,使用WriteOnlyWorksheet物件的column_dimensions變數,設定某一個 Excel 欄的相關資訊(比如,顯示狀態,保護資訊等),否則設定可能不會生效。

    應該在寫入任何一列資料之前,使用WriteOnlyWorksheet物件的row_dimensions變數,設定該 Excel 列的相關資訊(比如,顯示狀態,保護資訊等),否則設定可能不會生效。

    取得和設定 Excel 列的高度和欄的寬度

    WorksheetWriteOnlyWorksheet物件的變數row_dimensions,其變數htheight是一個浮點數,用於表示 Excel 列的高度。

    worksheet|writeonlyworksheet.row_dimensions[index].ht|height
    worksheet|writeonlyworksheet.row_dimensions[index].ht|height = height

    index 值

    index為需要取得或設定高度的列的索引,1表示第一列。

    height 值

    height是表示列的高度的浮點數。

    WorksheetWriteOnlyWorksheet物件的變數column_dimensions,其變數width是一個浮點數,用於表示 Excel 欄的寬度。

    worksheet|writeonlyworksheet.column_dimensions[index].width
    worksheet|writeonlyworksheet.column_dimensions[index].width = width

    index 值

    index為需要取得或設定寬度的欄的索引,'A'表示第一欄。

    width 值

    width是表示欄的寬度的浮點數。

    在下面的範例中,我們設定了第一列的高度,以及第一欄的寬度,雖然都是30,但儲存格A1並不是一個正方形,因為高度和寬度可能采用了不同的度量單位。

    height_width.py
    # 建立唯寫活頁簿,並新增工作表 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 列或欄是否自訂了高度或寬度

    WorksheetWriteOnlyWorksheet物件的變數row_dimensions,其customHeight屬性可用於判斷 Excel 列是否自訂了高度。

    worksheet|writeonlyworksheet.row_dimensions[index].customHeight

    index 值

    index為需要判斷是否擁有自訂高度的列的索引,1表示第一列。

    WorksheetWriteOnlyWorksheet物件的變數column_dimensions,其customWidth屬性可用於判斷 Excel 欄是否自訂了寬度。

    worksheet|writeonlyworksheet.column_dimensions[index].customWidth

    index 值

    index為需要判斷是否擁有自訂寬度的欄的索引,'A'表示第一欄。

    我們為之前的範例新增一些程式碼,判斷第一列是否擁有自訂高度,第一欄是否擁有自訂寬度。

    height_width.py
    # …
    # 是否擁有自訂高度和寬度?
    print(ws.row_dimensions[1].customHeight)
    print(ws.column_dimensions['A'].customWidth)
    True
    True

    取得和設定 Excel 列或欄的顯示狀態

    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為需要取得或設定顯示狀態的列或欄的索引,1表示第一列,'A'表示第一欄。

    state 值

    state表示列或欄的顯示狀態,為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')

    取得和設定 Excel 列或欄的保護資訊

    WorksheetWriteOnlyWorksheet物件的變數row_dimensionscolumn_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.xlsxSandwich工作表的第一列的保護資訊。

    protection.py
    # 開啟 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 列或欄

    WorksheetWriteOnlyWorksheet物件的變數row_dimensionscolumn_dimensions,他們的group方法可以組合(可摺疊或展開 Excel 列或欄)工作表中的某些列或欄,他們的outlineLeveloutline_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.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')

    取得 Excel 列或欄所隸屬的工作表

    WorksheetWriteOnlyWorksheet物件的變數row_dimensionscolumn_dimensions,他們的parent變數表示了 Excel 列或欄所隸屬的工作表物件。

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

    index 值

    index為需要取得隸屬工作表物件的列或欄的索引,1表示第一列,'A'表示第一欄。

    Excel 列和欄的其他特性

    以下是與 Excel 列或欄相關的其他特性。

    index 變數

    WorkbookWriteOnlyWorksheet物件的變數row_dimensionscolumn_dimensions,他們的index變數表示了列或欄的索引,1表示第一列,'A'表示第一欄,比如,wb['Sheet'].row_dimensions[1].index

    r 變數

    WorkbookWriteOnlyWorksheet物件的變數row_dimensions,他們的r變數表示了列的索引,1表示第一列。

    原始碼

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