Python openpyxl庫處理Excel文檔

使用Python處理Excel文檔

openpyxl是一個讀寫Excel2010(xlsx/xlsm)文檔的Python庫,能夠同時讀取和修改Excel文檔。一個Excel文檔稱爲一個工作薄,在Office2010下,典型工作薄的文件擴展名爲xlsx。一個工作薄可以包含多個表格。Excel通過行和列表示一個單元格,行的座標使用數字表示,列的座標使用字母表示。例如表格左上角的單元格,其座標爲"A1"。

openpyxl是一個開源項目,在使用之前需要先進行安裝:

pip install openpyxl

openpyxl有三個不同層次的類,分別是Workbook、Worksheet和Cell。
Workbook是對Excel工作薄的抽象,Worksheet是對錶格的抽象,Cell是對單元格的抽象。

Workbook

在操作一個Excel之前,應該先創建一個Workbook對象。對於創建一個新的Excel文檔,直接進行Workbook類調用即可。對於讀取一個已經有的Excel文檔,可以使用openpyxl模塊的load_workbook函數。該函數接受多個參數,但只有filename參數爲必傳參數。

import openpyxl
wb = openpyxl.load_workbook("example.xlsx")

workbook對象有多種屬性和方法:

  1. active:獲取活躍的Worksheet
  2. read_only:是否以read_only模式打開Excel文檔
  3. encoding:文檔的字符集編碼
  4. properties:文檔的元素及,如標題、創建者、創建日期等
  5. worksheets:以列表的形式返回所有的Worksheet
import openpyxl
wb = openpyxl.load_workbook(r"D:/tmp/test.xlsx")
wb.active
#<Worksheet "Sheet1">
wb.read_only
#False
wb.encoding
#utf-8
wb.worksheets
#[<Worksheet "Sheet1">]

Workbook對象的方法大都與Worksheet相關。常用的方法如下:

  1. sheetnames:獲取所有表格的名稱
  2. wb[表名]:通過表格名稱獲取Worksheet對象
  3. get_active_sheet:獲取活躍的表格
  4. remove_sheet:刪除一個表格
  5. create_sheet:創建一個空的表格
  6. copy_worksheet:在Workbook內拷貝表格
wb.sheetnames
#['學生信息']
wb["學生信息"]
#<Worksheet "學生信息">

Worksheet

通過Worksheet對象獲取表格屬性,得到單元格中的數據,修改表格中的內容。

  1. title:表格的標題
  2. dimension:表格的大小
  3. max_row:表格的最大行
  4. min_row:表格的最小行
  5. max_column:表格的最大列
  6. min_column:表格的最小列
  7. rows按行獲取單元格(cell對象)
  8. columns按列獲取單元格(cell對象)
  9. freeze_panes凍結窗格,主要用於在表格較大時凍結頂部的行或左邊的列。對於凍結的行或列,就算用戶滾動電子表格,也是始終可見的
  10. values按行獲取表格的內容(數據)
ws = wb["學生信息"]
#學生信息
ws.title
#A1:H5
ws.dimensions
#8
ws.max_column
#1
ws.min_column
#<generator object Worksheet._cells_by_col at 0x000002314A4E6930>
ws.columns
#<generator object Worksheet._cells_by_row at 0x000002314A4E6930>
ws.rows
#<generator object Worksheet.values at 0x000002314A4E6930>
ws.values

這段代碼中,通過Workbook[表名]獲取Worksheet對象。通過不同的屬性名獲取student這張表的屬性。其中,columns、rows和values這幾個屬性都是通過生成器的方式返回數據。

Worksheet常用的一些方法:

  1. iter_rows:按行獲取所有單元格(Cell對象)
  2. iter_columns:案列獲取所有的單元格
  3. append:在表格末尾添加數據
  4. merged_cells:合併多個單元格
  5. unmerge_cells:移除合併的單元格
    其中,iter_rows方法和iter_columns方法在參數取默認值時,與rows屬性和columns屬性的作用相同。區別在於,iter_rows方法和iter_columns方法可以通過函數參數限定訪問表格的範圍。
list(ws.iter_rows(min_row=2,max_row=4,min_col=1,max_col=3))
 [(<Cell '學生信息'.A2>, <Cell '學生信息'.B2>, <Cell '學生信息'.C2>), (<Cell '學生信息'.A3>, <Cell '學生信息'.B3>, <Cell '學生信息'.C3>), (<Cell '學生信息'.A4>, <Cell '學生信息'.B4>, <Cell '學生信息'.C4>)]

從Worksheet的屬性和方法的使用中可以看到,很多屬性和方法返回的是一個Cell對象。一個Cell對象就代表一個單元格,可以直接使用Excel座標的方式獲取Cell對象,也可以使用Worksheet的cell方法獲取cell對象。

ws['A2']
ws.cell(row=1,column=2)
#<Cell '學生信息'.A2>
#<Cell '學生信息'.B1>

Cell

Cell對象常用屬性如下;

  1. row:單元格所在的行
  2. column:單元格所在的列
  3. value:單元格的取值
  4. cordinate:單元格的座標

用四種方法打印student表中的內容:

#"第一種方法:"
for row in ws.rows:
    print(*row)
#"第二種方法:"
for row in ws.rows:
    print(*[cell.value for cell in row])
#"第三種方法:"
for row in ws.iter_rows():
    print(*[cell.value for cell in row])
#"第四種方法:"
for i in range(ws.min_row,ws.max_row + 1):
    for j in range(ws.min_column,ws.max_column + 1):
        print(ws.cell(row=i,column=j).value,end='')
    print()

使用openpyxl修改Excel文檔

openpyxl可以讀取Excel文檔,而且還可以修改Excel文檔,包括修改單元格的數據、合併單元格、修改單元格的字體、在Excel文檔中畫圖等。
新建一個工作薄就是創建一個Workbook對象,創建完Workbook對象以後,默認會有一個名爲”sheet1“的表格,通過表格的名稱來獲取這個表格。獲取表格以後,通過給表格的title屬性賦值的方式來修改表格的名稱。

import openpyxl
import datetime

#創建一個Workbook對象
wb = openpyxl.Workbook()
#['Sheet']
#獲取Worksheet對象
ws = wb['Sheet']
ws.title = "學生信息"

#創建一個worksheet對象
wb.create_sheet(index=0,title="new sheet")
#['new sheet', '學生信息']
print(wb.sheetnames)

#刪除一個worksheet對象
wb.remove_sheet(wb['new sheet'])
#['學生信息']
print(wb.sheetnames)

#填充單元格的數據
ws['A1'] = 'Hello world'
ws['A2'] = datetime.datetime.now()

#調用Workbook的save方法將數據保存到磁盤之中
wb.save(r"D:\tmp\openpyxl.xlsx")

案例:統計平均分和總分
在這裏插入圖片描述

import openpyxl


def process_worksheet(sheet):
    avg_column = sheet.max_column + 1
    sum_column = sheet.max_column + 2

    for row in sheet.iter_rows(min_row=2,min_col=6):
        scores = [cell.value for cell in row]
        sum_score = sum(scores)
        avg_score = sum_score / len(scores)

        # 計算平均分總和,並且保存到最後兩列
        sheet.cell(row=row[0].row,column=avg_column).value = avg_score
        sheet.cell(row=row[0].row,column=sum_column).value = sum_score

    sheet.cell(row=1,column=avg_column).value = '平均分'
    sheet.cell(row=1,column=sum_column).value = '總分'


def main():
    wb = openpyxl.load_workbook(r"D:/tmp/test.xlsx")
    ws = wb["學生信息"]
    process_worksheet(ws)
    wb.save(r"D:/tmp/學生成績統計.xlsx")

if __name__ == '__main__':
    main()

在這裏插入圖片描述

案例:合併多個Excel文檔到一個Excel文檔
將多個Excel文檔合併到到單個文件
在這裏插入圖片描述
合併excel的思路是:1)獲取第一個文檔中的表格2)依次遍歷其他文件中的報名表,並通過iter_rows函數忽略報名表中的首行內容3)通過列表推導獲取報名表中的數據,然後調用Worksheet的append函數將數據添加到彙總表的末尾。

import os
#glob模塊的主要方法就是glob,該方法返回所有匹配的文件路徑列表(list)
#該方法需要一個參數用來指定匹配的路徑字符串(字符串可以爲絕對路徑也可以爲相對路徑)
#其返回的文件名只包括當前目錄裏的文件名,不包括子文件夾裏的文件
import glob
import openpyxl

def merge_xlsx_files(xlsx_files):
    wb = openpyxl.load_workbook(xlsx_files[0])
    ws = wb.active
    ws.title = "merged result"

    for filename in xlsx_files[1:]:
        workbook = openpyxl.load_workbook(filename)
        sheet = workbook.active
        for row in sheet.iter_rows(min_row=2):
            values = [cell.value for cell in row]
            ws.append(values)

    return wb


def get_all_xlsx_files(path):
    xlsx_files = glob.glob(os.path.join(path,'*.xlsx'))
    sorted(xlsx_files,key=str.lower)
    return xlsx_files

def main():
    xlsx_files = get_all_xlsx_files(r"D:\tmp\test")
    wb = merge_xlsx_files(xlsx_files)
    wb.save(r"D:\tmp\test\merged_form.xlsx")

if __name__ == '__main__':
    main()

glob補充

glob是python自帶的文件操作相關模塊,用於查找符合條件的文件,支持通配符操作。
glob方法:
glob模塊的主要方法就是glob,該方法返回所有匹配的文件路徑列表。
該方法需要一個參數用來指定匹配的路徑字符串(字符串可以爲絕對路徑也可以爲相對路徑),其返回的文件名只包括當前目錄裏的文件名,不包括子文件夾裏的文件。

xlsx_files = glob.glob(os.path.join(path,'*.xlsx'))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章