添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

讀取 EXCEL 內容

這篇文章會介紹使用 Python 的 openpyxl 第三方函式庫,讀取並顯示 Office Excel 活頁簿內容以及基本資訊 ( 工作表名稱、最大列數和行數...等 ),最後會利用簡單的函式,將讀取到的所有內容轉換成串列格式。

快速導覽:

  • 安裝 openpyxl
  • 讀取 Excel 活頁簿資訊
  • 讀取儲存格內容
  • 轉換儲存格座標與名稱
  • 本篇使用的 Python 版本為 3.7.12, 所有範例可使用 Google Colab 實作 ,不用安裝任何軟體 ( 參考: 使用 Google Colab )

    安裝 openpyxl

    輸入下列指令,就能安裝 openpyxl 函式庫,依據個人的作業環境使用 pip 或 pip3 ( Google Colab 和 Anaconda Jupyter 已經內建安裝 openpyxl )。

    !pip install openpyxl
    

    範例使用的 Excel

    下圖為範例所使用的 Ecxel 活頁簿 ( 範例檔案下載 ),工作表 1 的 E1、E2、F1 和 F2 為簡單的公式所計算的數值。

    讀取 Excel 活頁簿資訊

    載入 openpyxl 函式庫後,使用 load_workbook 方法開啟 Excel 活頁簿,就能讀取所有工作表的名稱以及各個工作表的內容 ( 垂直方向為 row 列,水平方向為 columne 行 )。

    import os
    os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用
    import openpyxl
    wb = openpyxl.load_workbook('oxxostudio.xlsx')     # 開啟 Excel 檔案
    names = wb.sheetnames    # 讀取 Excel 裡所有工作表名稱
    s1 = wb['工作表1']        # 取得工作表名稱為「工作表1」的內容
    s2 = wb.active           # 取得開啟試算表後立刻顯示的工作表 ( 範例為工作表 2 )
    print(names)
    # 印出 title ( 工作表名稱 )、max_row 最大列數、max_column 最大行數
    print(s1.title, s1.max_row, s1.max_column)
    print(s2.title, s2.max_row, s2.max_column)
    

    讀取儲存格內容

    已經能讀取 Excel 之後,就能用兩種方法讀取儲存格的內容, 第一種方法直接使用字典的方式,讀取特定名稱的儲存格並取出內容,第二種方法使用 cell(row, column) 的方式,讀取特定行列的儲存格內容 ,下方的程式碼執行後,會讀取工作表 1 的 A1 儲存格,以及工作表 2 的 B2 儲存格。

    注意!在 load_workbook 中,使用了 data_only=True 的參數設定, 設定 True 表示讀取「儲存格顯示的結果」,也就是若儲存格為「公式」,則會回傳計算後的結果 ,如果 設定 False ( 預設 ) 表示讀取「儲存格內容」,若儲存格為「公式」,就會回傳公式內容而非計算後的結果

    import os
    os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用
    import openpyxl
    wb = openpyxl.load_workbook('test.xlsx', data_only=True)  # 設定 data_only=True 只讀取計算後的數值
    s1 = wb['工作表1']
    s2 = wb['工作表2']
    print(s1['A1'].value)        # 取出 A1 的內容
    print(s1.cell(1, 1).value)   # 等同取出 A1 的內容
    print(s2['B2'].value)        # 取出 B2 的內容
    print(s2.cell(2, 2).value)   # 等同取出 B2 的內容
    

    如果要一次顯示工作表所有的內容,可以 定義一個函式,將讀取到的資料轉換成二維串列的形式 ( 讀取到的資料為二維的 tuple 格式 )。

    其他參考: 函式 function 重複迴圈 ( for、while )

    import os
    os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用
    import openpyxl
    wb = openpyxl.load_workbook('test.xlsx', data_only=True)  # 設定 data_only=True 只讀取計算後的數值
    s1 = wb['工作表1']
    s2 = wb['工作表2']
    def get_values(sheet):
        arr = []                      # 第一層串列
        for row in sheet:
            arr2 = []                 # 第二層串列
            for column in row:
                arr2.append(column.value)  # 寫入內容
            arr.append(arr2)
        return arr
    print(get_values(s1))       # 印出工作表 1 所有內容
    print(get_values(s2))       # 印出工作表 2 所有內容
    [[12, 34, 56, 78, 180, 180], [11, 22, 33, 44, 110, 110]]
    [['a1', 'b1', 'c1'], ['a2', 'b2', 'c2'], ['a3', 'b3', 'c3'], ['a4', 'b4', 'c4'], ['a5', 'b5', 'c5']]
    

    如果只想取出某個範圍的資料,可以透過 iter_rows 方法,輸入起始 row、columne 以及結束的 row、 column,就能取出範圍中的內容。

    import os
    os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用
    import openpyxl
    wb = openpyxl.load_workbook('test.xlsx', data_only=True)
    s1 = wb['工作表1']
    v = s1.iter_rows(min_row=1, min_col=1, max_col=2, max_row=2)  # 取出四格內容
    print(v)
    for i in v:
        for j in i:
            print(j.value)
    

    轉換儲存格座標與名稱

    載入 openpyxl.utils 的 get_column_letter 和 column_index_from_string 模組,就可以將 column 的英文代號轉換成數字,或將數字轉換成英文代號

    import openpyxl
    from openpyxl.utils import get_column_letter, column_index_from_string
    print(column_index_from_string('A'))    # 1
    print(column_index_from_string('AA'))   # 27
    print(get_column_letter(5))             # E
    print(get_column_letter(100))           # CV
              

    如果有任何建議或問題,可傳送「意見表單」給我,謝謝~