介紹如何在 Python 中使用 openpyxl
模組讀取與寫入 Excel 的 *.xlsx
檔案。
Python 的 openpyxl 模組可用來讀取或寫入 Office Open XML 格式的 Excel 檔案,支援的檔案類型有
xlsx
、xlsm
、xltx
、xltm
,以下將示範如何使用 openpyxl
模組來讀取並修改 Excel 檔案。
讀取、寫入 Excel 檔案
若要讀取 Excel 檔案,可以利用 openpyxl
中的 load_workbook
函數:
from openpyxl import load_workbook # 讀取 Excel 檔案 wb = load_workbook('test.xlsx')
load_workbook
載入 Excel 檔案之後,會得到一個活頁簿(workbook)的物件。
若要將活頁簿物件儲存至 Excel 檔案中,則可使用活頁簿的 save
函數:
# 將活頁簿儲存至 Excel 檔案 wb.save('output.xlsx')
建立新活頁簿
除了從 Excel 檔案讀取活頁簿之外,也可以直接在 Python 建立新的活頁簿:
# 建立新活頁簿
wb2 = Workbook()
工作表操作
一本活頁簿中會包含一張或多張工作表(worksheet),我們可以透過活頁簿的 sheetnames
來取的所有工作表的名稱:
# 顯示工作表名稱 print(wb.sheetnames)
['工作表1', '工作表2']
或是透過 for
迴圈逐一處理每一張工作表:
# 以 for 迴圈逐一處理每張工作表 for sheet in wb: print(sheet.title)
工作表1 工作表2
我們可以透過活頁簿的 active
屬性取得目前作用中的工作表:
# 取得目前作用中的工作表 actSheet = wb.active print(actSheet.title)
工作表1
我們可以透過工作表的名稱,直接取得指定的工作表:
# 透過名稱取得工作表 sheet = wb['工作表1']
工作表的名稱與顏色也都可以任意修改:
# 更改工作表名稱 sheet.title = "我的工作表" # 更改工作表標籤顏色 sheet.sheet_properties.tabColor = "1072BA"
若要新增工作表,可以使用活頁簿的 create_sheet
函數:
# 新增工作表(放在最後方) ws1 = wb.create_sheet("新增工作表1") # 新增工作表(放在最前方) ws2 = wb.create_sheet("新增工作表2", 0)
若要複製工作表,可以使用活頁簿的 copy_worksheet
函數:
# 複製工作表
source = wb.active
target = wb.copy_worksheet(source)
單一儲存格操作
假設我們的 Excel 內容如下:
若要讀取表格中的內容,可以先載入這張工作表之後,以儲存格位置來存取資料:
# 讀取 Excel 檔案 wb = load_workbook('test.xlsx') sheet = wb['工作表1'] # 根據位置取得儲存格 c = sheet['A4'] # 得取儲存格資料 print(c.value)
2018-10-12 00:00:00
取得儲存格之後,也可以修改其中的資料:
# 修改儲存格資料 c.value = "2020-06-23 00:00:00"
另外也可以直接使用工作表搭配位置索引來修改儲存格的資料:
# 修改儲存格資料 sheet['A4'] = "2020-06-23 00:00:00"
除了以文字的 Excel 儲存格位置之外,也可以使用行號與列號來指定儲存格:
# 讀取 Excel 檔案 wb = load_workbook('test.xlsx') sheet = wb['工作表1'] # 以行號、列號指定儲存格 c = sheet.cell(row=4, column=1) print(c.value)
2018-10-12 00:00:00
# 修改儲存格內容 sheet.cell(row=4, column=1, value="2020-06-23 00:00:00")
多儲存格操作
若要一次對指定範圍內的所有儲存格進行操作,可以使用以下幾種方式來指定範圍,取得儲存格物件:
# 透過名稱取得工作表 mywb = load_workbook('test.xlsx') sheet = mywb['工作表1'] # 取得指定範圍內儲存格物件 cellRange = sheet['B2':'C3'] # 以 for 迴圈逐一處理每個儲存格 for row in cellRange: for c in row: print(c.value)
3 32 4 34
以下是其他各種指定範圍的方式:
# 整個 C 欄 colC = sheet['C'] # C 欄與 D 欄 cols = sheet['C:D'] # 第 10 列 row10 = sheet[10] # 第 5 列到第 10 列 rows = sheet[5:10]
另外也可以使用工作表的 iter_rows
或 iter_cols
來處理:
# 以列(row)方向逐一疊代處理 for row in sheet.iter_rows(min_row=1, max_col=3, max_row=2): for cell in row: print(cell)
<Cell '工作表1'.A1> <Cell '工作表1'.B1> <Cell '工作表1'.C1> <Cell '工作表1'.A2> <Cell '工作表1'.B2> <Cell '工作表1'.C2>
# 以行(column)方向逐一疊代處理 for col in sheet.iter_cols(min_row=1, max_col=3, max_row=2): for cell in col: print(cell)
<Cell '工作表1'.A1> <Cell '工作表1'.A2> <Cell '工作表1'.B1> <Cell '工作表1'.B2> <Cell '工作表1'.C1> <Cell '工作表1'.C2>
只取得資料
若只需要讀取儲存格中的資料,可以透過工作表的 values
來直接取得資料:
# 只取得儲存格資料 for row in sheet.values: for value in row: print(value)
工作表的 iter_rows
或 iter_cols
也可以只取用資料:
# 只取得儲存格資料 for row in sheet.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True): for value in row: print(value)
除了 openpyxl
之外,常見的 Excel 檔案相關的模組還有 xlwt
(寫入 xls
檔案)、xlrd
(讀取 xls
、xlsx
檔案) 與 xlsxwriter
(寫入 xlsx
檔案) 有需要的人可以上網搜尋相關的資料。
參考資料:程式前沿、GeeksForGeeks、StackOverflow、python-excel.org、Real Python
程式小白 表示:
我們可以透過工作表的名稱,直接取得指定的工作表:
sheet = wb[‘工作表2’]
應該為:
actsheet = wb[‘工作表2’]