1. 程式人生 > 其它 >一文詳解Python3處理Excel檔案

一文詳解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 檔案;
  • 使用 openpyxlxlsx 檔案;

1.1 讀 xlsx 檔案

  • 開啟Excelxlsx檔案,並讀取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 讀取Excelxlsx檔案,舉例程式碼如下:

這裡要讀取的舉例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.copyxls 檔案;

2.1 讀 xls 檔案

  • 開啟Excelxls檔案,並讀取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 讀取Excelxls檔案,舉例程式碼如下:

這裡要讀取的舉例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技術小館“,如果文章對您有幫助,歡迎關注我的公眾號。