最近工作中需要統計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技術小館“,如果文章對您有幫助,歡迎關注我的公眾號。