一文詳解Python3處理Excel檔案
最近工作中需要統計APP線上終端使用者 手機品牌
、手機型號
與對應型號的使用者量
,並生成Excel表格彙報專案組。因線上手機品牌、型號數量過於龐大,手動操作過於消耗時間,所以搞了一個 python3 的指令碼來生成所需要的表格。
用 python3 操作Excel,第一件事是找可使用的依賴庫,之前在網上找了一個 python3 依賴庫的優劣對比圖:
我選擇的依賴庫是openpyxl
,因為我的需求是:
- 可以讀寫
xlsx
新版本的Excel檔案; - 面對大檔案的讀寫:速度夠快;
- 除讀寫
xlsx
外,具備以下功能:
設定行高、列寬、文字大小、表格邊框、合併單元格等
因為之前也嘗試過 xlrd
等其他依賴庫,所以這篇文章我會將openpyxl
xlrd
的API使用方式均進行介紹,算是做一個學習筆記:
- python3使用
openpyxl
操作xlsx
表格; - python3使用
xlrd
操作xls
表格;
一、openpyxl
這裡對 python3
使用 openpyxl
操作xlsx
的相關程式碼片段做如下總結:
- 使用
openpyxl
讀取xlsx
檔案; - 使用
openpyxl
寫xlsx
檔案;
1.1 讀 xlsx 檔案
- 開啟
Excel
的xlsx
檔案,並讀取sheet
頁:
import openpyxl # 匯入模組openpyxl # 開啟Excel表格 excel = openpyxl.load_workbook('refer/品牌型號對映表.xlsx') # 獲取指定Sheet表單頁 sheet = refer_excel['品牌型號對應關係']
- 讀取
單元格cell
內容:讀取第一行第一列的單元格內容;
import openpyxl # 匯入模組openpyxl
# 讀取第一行第一列的單元格內容
cell_value = (sheet.cell(row=1, column=1)).value
讀取Excel 可執行程式碼舉例:
使用 openpyxl
讀取Excel
的xlsx
檔案,舉例程式碼如下:
這裡要讀取的舉例Excel表格如下:
程式碼舉例如下:
import openpyxl # 匯入模組openpyxl def get_brand_model_dict_from_refer(): """ 讀取xlsx檔案,獲取xlsx檔案中"品牌"、"型號"對映字典 """ # 開啟Excel表格 refer_excel = openpyxl.load_workbook('refer/品牌型號對映表.xlsx') # 獲取指定Sheet表單頁 refer_sheet = refer_excel['品牌型號對應關係'] # 建立字典:建立一個以型號為key,以品牌為value的字典 brand_model_dict = {} # 行迴圈:從第二行開始迴圈,到最後一行截止 for row in range(2, refer_sheet.max_row + 1): # 讀取cell單元格中的資料 brand = (refer_sheet.cell(row=row, column=1)).value # 品牌 model = (refer_sheet.cell(row=row, column=2)).value # 型號 # 以型號為key 以品牌為value brand_model_dict[model] = brand print("return brand_model_dict: ", brand_model_dict) return brand_model_dict # ~~~~~~~~~~~~~~~~main~~~~~~~~~~~~~~~~~~ # 讀取對應關係表格: get_brand_model_dict_from_refer()
1.2 寫 xlsx 檔案
-
新建Excel
並建立Sheet
頁:
# 建立輸出表格Excel:建立工作表
excel = openpyxl.Workbook()
# 建立sheet頁:以demo為名字建立一個sheet頁
sheet = excel.create_sheet('demo_sheet', 0)
- 設定Excel中表格的
行高
:
# 第一行的行高
sheet.row_dimensions[1].height = 22
- 設定Excel中表格的
列寬
:
# 設定A列的列寬
sheet.column_dimensions['A'].width = 25
- 為
單元格賦值
:
# 第一行第一列的單元格
cell11 = sheet.cell(row=1, column=1)
# 單元格賦值
cell11.value = "demo table title"
- 單元格內容
居中對齊
:
# 居中對齊
cell11.alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center')
-
合併單元格
:
# 合併單元格:合併第一行,1~3列的單元格
sheet.merge_cells(start_row=1, start_column=1, end_row=1, end_column=3)
-
儲存Excel
到指定目錄:
# 儲存excel檔案
excel.save('output/demo_excel.xlsx')
完整的程式碼實現舉例:
import os # 檔案相關判斷會用到
import openpyxl # 匯入模組openpyxl
#
# ~~~~~~~~寫~~~~~~~~
# 建立輸出表格Excel:建立工作表
output_excel = openpyxl.Workbook()
# 建立sheet頁:以demo為名字建立一個sheet頁
output_sheet = output_excel.create_sheet('demo_sheet', 0)
#
# 行高:第一行行高 22
output_sheet.row_dimensions[1].height = 22
# 列寬:列寬 25 (A、B、C) 三列寬度為 25
column_width_list = ['A', 'B', 'C']
for columnKey in column_width_list:
output_sheet.column_dimensions[columnKey].width = 25
#
# 設定第一行顯示內容:第一行為表格的標題,需合併單元格
cell11 = output_sheet.cell(row=1, column=1) # 第一行第一列的單元格
cell11.value = "demo table title" # 單元格賦值
cell11.alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center') # 居中對齊
# 合併單元格
output_sheet.merge_cells(start_row=1, start_column=1, end_row=1, end_column=3)
#
# 設定第二行顯示內容:第二行為 品牌、型號、數量
md_cell21 = output_sheet.cell(row=2, column=1) # 單元格
md_cell21.value = '品牌' # 賦值
md_cell21.alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center') # 居中
md_cell21 = output_sheet.cell(row=2, column=2) # 單元格
md_cell21.value = '型號' # 賦值
md_cell21.alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center') # 居中
md_cell21 = output_sheet.cell(row=2, column=3) # 單元格
md_cell21.value = '數量' # 賦值
md_cell21.alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center') # 居中
# 儲存表格
# 如果存在已有的輸出檔案:則刪除檔案
if os.path.exists('output/demo_excel.xlsx'):
os.remove('output/demo_excel.xlsx')
# 儲存輸出檔案
output_excel.save('output/demo_excel.xlsx')
生成的Excel檔案如圖所示:
二、xlrd
這裡對 python3
使用 xlrd
操作xls
的相關程式碼片段做如下總結:
- 使用
xlrd
讀取xls
檔案; - 使用
xlutils.copy
寫xls
檔案;
2.1 讀 xls 檔案
- 開啟
Excel
的xls
檔案,並讀取sheet
頁:
import xlrd # 讀取excel
# 開啟Excel表格
excel = xlrd.open_workbook('input/品牌型號對映表.xls')
# 獲取指定Sheet表單頁
sheet = excel.sheet_by_index(0)
- 讀取
單元格cell
內容:讀取第一行第一列的單元格內容;
import xlrd # 讀取excel
# 讀取第一行第一列的單元格內容
value = sheet.cell_value(0, 0) # 品牌
讀取 Excel 可執行程式碼舉例:
使用 xlrd
讀取Excel
的xls
檔案,舉例程式碼如下:
這裡要讀取的舉例Excel表格如下:
程式碼舉例如下:
import xlrd # 讀取excel
def get_brand_model_dict_from_refer():
""" 讀取xlsx檔案,獲取xlsx檔案中"品牌"、"型號"對映字典
"""
# 開啟Excel表格
excel = xlrd.open_workbook('input/品牌型號對映表.xls')
# 獲取指定Sheet表單頁
sheet = excel.sheet_by_index(0)
# 建立字典:建立一個以型號為key,以品牌為value的字典
brand_model_dict = {}
# 行迴圈:從第二行開始迴圈,到最後一行截止
for row in range(1, sheet.nrows):
# 讀取cell單元格中的資料
brand = sheet.cell_value(row, 0) # 品牌
model = sheet.cell_value(row, 1) # 型號
# 以型號為key 以品牌為value
brand_model_dict[model] = brand
print("return brand_model_dict: ", brand_model_dict)
return brand_model_dict
# ~~~~~~~~~~~~~~~~main~~~~~~~~~~~~~~~~~~
# 讀取對應關係表格:
get_brand_model_dict_from_refer()
2.2 使用 xlutils.copy 寫 xls 檔案
因 xlrd 無更改Excel的功能,這裡使用 xlutils.copy 建立一個新的Excel。
-
建立Excel
:
# 因 xlrd 無更改Excel的功能,這裡使用 xlutils.copy 建立一個新的Excel
excel = copy(input_excel)
sheet = output_excel.get_sheet(0)
- 為
單元格賦值
:
# 為單元格賦值
sheet.write(row, column, cell_value)
使用 xlutils.copy 寫 Excel 可執行程式碼舉例:
import xlrd # 讀取excel
# 匯入copy模組
from xlutils.copy import copy
#
# ~~~~~~~~讀~~~~~~~~
# 開啟Excel表格
input_excel = xlrd.open_workbook('input/品牌型號對映表.xls')
# 獲取指定Sheet表單頁
input_sheet = input_excel.sheet_by_index(0)
#
# ~~~~~~~~寫~~~~~~~~
# 因 xlrd 無更改Excel的功能,這裡使用 xlutils.copy 建立一個新的Excel
output_excel = copy(input_excel)
output_sheet = output_excel.get_sheet(0)
# 行迴圈(參考檔案)
for row in range(input_sheet.nrows):
# 忽略第0行
if row == 0:
output_sheet.write(row, 2, '行號')
else:
# 修改:第row行 第2列的內容
output_sheet.write(row, 2, row)
# 儲存更改後的檔案
output_excel.save('output/demo_excel.xls')
三、原始碼下載
給出原始碼之前,先說一下我的編譯器環境:
- 環境:
python 3.8
- 編譯器:
PyCharm
原始碼下載:
Python3使用openpyxl、xlrd依賴庫操作Excel案例原始碼:
https://download.csdn.net/download/aiwusheng/85140982
Python3使用xlrd修改Excel資料對映關係:
https://download.csdn.net/download/aiwusheng/85066595
參考:
Python開發 之 Python3讀寫Excel檔案:
https://blog.csdn.net/u014597198/article/details/83104653
= THE END =
文章首發於公眾號”CODING技術小館“,如果文章對您有幫助,歡迎關注我的公眾號。