1. 程式人生 > 程式設計 >說說如何使用 python 的 openpyxl 讀取 Excel

說說如何使用 python 的 openpyxl 讀取 Excel

Python 的 openpyxl 模組可以讓我們能讀取和修改 Excel 檔案。

首先讓我們先理解一些 Excel 基礎概念。

1 Excel 基礎概念

Excel 檔案也稱做為工作簿。每個工作簿可以包含多個工作表(Sheet)。使用者當前檢視的表或關閉 Excel 前最後檢視的表,稱為活動表。

每一張表都是由列和行構成的。列是以 A 開始的字母表示;而行是以 1 開始的數字表示的。由特定行和列所指定的方格稱為單元格。每個單元格都可以包含一個數字或文字。這些單元格就構成了這張表。

2 安裝 openpyxl

通過 pip 就可以安裝最新版的 openpyxl。

pip install openpyxl
複製程式碼

3 讀取 Excel

假設有這樣一份世界人口統計 Excel 檔案,內容如下:

3.1 載入 Excel

wb = openpyxl.load_workbook('population.xlsx')
print('wb 型別 :')
print(type(wb),'\n')
複製程式碼

執行結果:

wb 型別 : <class 'openpyxl.workbook.workbook.Workbook'>

匯入 openpyxl 模組之後,就可以使用 openpyxl.load_workbook() 函式來載入 Excel 檔案咯。這個 Excel 檔案表示為 Workbook 物件。

注意: load_workbook() 函式中的檔案,必須在當前工作目錄。可以匯入 os 模組,利用 os.getcwd() 來獲悉當前工作目錄。os 還提供了 chdir() 方法,可以改變當前工作目錄。

import os
print('當前工作目錄 :')
print(os.getcwd(),'\n')
複製程式碼

執行結果:

3.2 讀取 Excel 工作表(sheet)

...
print('取得所有工作表的表名 :')
print(wb.sheetnames,'\n')

print('取得某張工作表 :')
sheet = wb['Sheet3']
print(type
(sheet)) print('表名 - ' + sheet.title,'\n') print('取得活動工作表 :') active_sheet = wb.active print('表名 - ' + active_sheet.title,'\n') 複製程式碼

執行結果:

取得所有工作表的表名 : ['Sheet1','Sheet2','Sheet3']

取得某張工作表 : <class 'openpyxl.worksheet.worksheet.Worksheet'> 表名 - Sheet3

取得活動工作表 : 表名 - Sheet1

  • Workbook 物件的 sheetnames 屬性可以獲取所有 sheet 表的表名列表。
  • Workbook 物件的 active 屬性,會獲取當前活動表,即開啟 Excel 時出現的工作表。
  • 獲取 Worksheet 物件後,我們就可以通過 title 屬性得到 sheet 的名稱。

3.3 讀取單元格 (Cell)

...
print('取得 A1 單元格 :')
cell = active_sheet['A1']
print(cell)
print(cell.value,'\n')

print('取得 B1 單元格 :')
cell = active_sheet['B1']
print(cell)
print(cell.value,'\n')

print('行號為 ' + str(cell.row) + ',列號為 ' + str(cell.column) + ' 的單元格,其值為 ' + cell.value,'\n')
print('單元格 ' + cell.coordinate + ' 其值為 ' + cell.value,'\n')

print('取得 C1 單元格的值 :')
print(active_sheet['C1'].value,'\n')

print('通過指定行與列,來獲取單元格:')
print(active_sheet.cell(row=1,column=2))
print(active_sheet.cell(row=1,column=2).value)

print('迭代行與列,來獲取單元格的值:')
for i in range(1,8,2):
    print(i,active_sheet.cell(row=i,column=2).value)
print('\n')
複製程式碼

執行結果:

取得 A1 單元格 : <Cell 'Sheet1'.A1> 排名

取得 B1 單元格 : <Cell 'Sheet1'.B1> 國家

行號為 1,列號為 2 的單元格,其值為 國家

單元格 B1 其值為 國家

取得 C1 單元格的值 : 人口

通過指定行與列,來獲取單元格: <Cell 'Sheet1'.B1> 國家 迭代行與列,來獲取單元格的值: 1 國家 3 印度 5 印度尼西亞 7 巴基斯坦

  • 可以通過單元格的名字(比如:A1)來獲取 Cell 物件。
  • Cell 物件的 value 屬性,存放的是該單元格中所儲存的值。
  • Cell 物件的 row、 column 和 coordinate 屬性,存放的是該單元格的位置資訊。
  • 用字母來指定列比較奇怪,因此我們也可以通過 sheet 的 cell 方法直接指定行(row)與列(column),來獲取單元格 Cell 物件。

3.4 獲取工作表大小

print('獲取工作表的大小:')
print('總行數 -> ' + str(active_sheet.max_row))
print('總列數 -> ' + str(active_sheet.max_column))
複製程式碼

執行結果:

獲取工作表的大小: 總行數 -> 11 總列數 -> 4

Worksheet 物件的 max_row 與 max_column,可以獲取工作表的總行數與總列數,即工作表的大小。

3.5 列轉換函式

openpyxl 提供了兩個函式,用於轉換列號:

  • openpyxl.utils.get_column_letter -> 會把數字轉化為字母。
  • openpyxl.utils.column_index_from_string -> 會把字母轉化為數字。
import openpyxl
from openpyxl.utils import get_column_letter,column_index_from_string
...
print('列轉換函式:')
print('[數字轉換為字母]')
print('第 1 列 -> ' + get_column_letter(1))
print('第 2 列 -> ' + get_column_letter(2))
print('第 37 列 -> ' + get_column_letter(37))
print('第 818 列 -> ' + get_column_letter(818))
print('[字母轉換為數字]')
print('第 A 列 -> ' + str(column_index_from_string('A')))
print('第 CC 列 -> ' + str(column_index_from_string('CC')))
複製程式碼

執行結果:

[數字轉換為字母] 第 1 列 -> A 第 2 列 -> B 第 37 列 -> AK 第 818 列 -> AEL [字母轉換為數字] 第 A 列 -> 1 第 CC 列 -> 81

3.6 切片

我們可以對 Worksheet 物件切片,取得表格中的一個矩形區域,迭代遍歷這個區域中的所有 Cell 物件。

print(tuple(active_sheet['A2':'D4']))
for row_objects in active_sheet['A2':'D4']:
    for cell_object in row_objects:
        print(cell_object.coordinate,cell_object.value)
    print('-- 當前行獲取結束 --')
複製程式碼

執行結果:

((<Cell 'Sheet1'.A2>,<Cell 'Sheet1'.B2>,<Cell 'Sheet1'.C2>,<Cell 'Sheet1'.D2>),(<Cell 'Sheet1'.A3>,<Cell 'Sheet1'.B3>,<Cell 'Sheet1'.C3>,<Cell 'Sheet1'.D3>),(<Cell 'Sheet1'.A4>,<Cell 'Sheet1'.B4>,<Cell 'Sheet1'.C4>,<Cell 'Sheet1'.D4>)) A2 1 B2 中國 C2 13.83億人(2016) D2 9634057 -- 當前行獲取結束 -- A3 2 B3 印度 C3 1339180127 D3 2973190 -- 當前行獲取結束 -- A4 3 B4 美國 C4 324459463 D4 9147420 -- 當前行獲取結束 --

  • 這裡首先通過 tuple() 方法,展示出了切片後的所有 Cell 物件。
  • 然後使用了兩個 for 迴圈,外層 for 迴圈會遍歷這個切片中的每一行;而內層 for 迴圈會遍歷該行中的每個單元格。

3.7 獲取指定行或指定列

我們可以使用 Worksheet 物件的 rows 和 columns 屬性,來獲取指定行或者列:

print('獲取特定行:')
print(list(active_sheet.rows)[2])
for cell_object in list(active_sheet.rows)[2]:
    print(cell_object.value)

print('獲取特定列:')
print(list(active_sheet.columns)[2])
for cell_object in list(active_sheet.columns)[2]:
    print(cell_object.value)
複製程式碼

執行結果:

獲取特定行: (<Cell 'Sheet1'.A3>,<Cell 'Sheet1'.D3>) 2 印度 1339180127 2973190 獲取特定列: (<Cell 'Sheet1'.C1>,<Cell 'Sheet1'.C5>,<Cell 'Sheet1'.C6>,<Cell 'Sheet1'.C7>,<Cell 'Sheet1'.C8>,<Cell 'Sheet1'.C9>,<Cell 'Sheet1'.C10>,<Cell 'Sheet1'.C11>) 人口 13.83億人(2016) 1339180127 324459463 263991379 209288278 197015955 190886311 164669751 143989754 129163276

  • Worksheet 物件的 rows 或者 columns 屬性,都會返回一個由 “行元組” 構成的元組。每個行元組都擁有該行中的所有 Cell 物件。
  • 可以通過行元組的下標,來訪問具體的 Cell 物件。

讀取 Excel 步驟,總結如下:

  1. 匯入 openpyxl 模組。
  2. 呼叫 openpyxl.load_workbook() 函式,載入 excel 檔案,獲取 Workbook 物件。
  3. 呼叫 workbook#active 或 workbook[${sheet_name}],獲取 sheet 工作簿。
  4. 傳入 row 和 column 關鍵字引數並呼叫索引或工作表的 cell() 方法,獲取 Cell 物件。
  5. 有了 Cell 物件,就可以執行具體的業務邏輯咯。是不是很簡單呀 O(∩_∩)O哈哈~