Python辦公自動化|批量提取Excel數據


大家好,又到了Python辦公自動化系列。

 

今天我們來講解一個比較簡單的案例,使用openpyxl從Excel中提取指定的數據並生成新的文件,之后進一步批量自動化實現這個功能,通過本例可以學到的知識點:

  • openpyxl模塊的運用

  • glob模塊建立批處理

數據源:阿里雲天池的電商嬰兒數據(可自行搜索並下載,如果要完成進階難度可直接將該數據Excel拷貝999次即可,當然這個拷貝可以交給代碼來實現)

 

需求說明

 

初級難度:提取電商嬰兒數據.xlsx中購買數buy_mount超過50的記錄建立新的Excel表

最后形成如下的表格:

 

進階難度:同一個文件夾下有1000份電商嬰兒數據的Excel表格(命名為電商嬰兒數據1.xlsx,電商嬰兒數據2.xlsx至電商嬰兒數據1000.xlsx),需要提取所有表格中購買數buy_mount超過50的記錄並匯總至一個新的Excel表

Python實現

 

讓我們先完成初級難度的需求挑戰,首先導入所需模塊並打開數據表,注意

打開已經存在的Excel用load_workbook,創建新的Excel用Workbook
from openpyxl import load_workbook, Workbook

# 數據所在的文件夾目錄
path = 'C:/Users/xxxxxx'

# 打開電商嬰兒數據工作簿
workbook = load_workbook(path + '/' + '電商嬰兒數據.xlsx')
# 打開工作表
sheet = workbook.active

接下來篩選符合條件的行

buy_mount = sheet['F']
row_lst = []
for cell in buy_mount:
    if isinstance(cell.value, int) and cell.value > 50:
        print(cell.row)
        row_lst.append(cell.row)

這一步本質上就是對購買數的各個單元格進行判斷,如果數值超過50就將其行號放入一個空列表中,間接完成了篩出符合條件的行。注意這一列有可能有的單元格cell的值value不是數值類型,因此需要用isinstance()進行判斷,當然也可以將單元格的值先用int()轉為整型再判斷。

 

篩選出符合條件的行號就可以提取行並且放入新的Excel中了,因此需要先創建新的工作簿,現在創建新的工作簿寫入符合條件的行,思路是根據行號獲取到指定行后,遍歷所有單元格的值組裝成一個列表,用sheet.append()寫入新表

new_workbook = Workbook()
new_sheet = new_workbook.active

# 創建和 電商嬰兒數據 一樣的表頭(第一行)
header = sheet[1]
header_lst = []
for cell in header:
    header_lst.append(cell.value)
new_sheet.append(header_lst)

# 從舊表中根據行號提取符合條件的行,並遍歷單元格獲取值,以列表形式寫入新表
for row in row_lst:
    data_lst = []
    for cell in sheet[row]:
        data_lst.append(cell.value)
    new_sheet.append(data_lst)

# 最后切記保存
new_workbook.save(path + '/' + '符合篩選條件的新表.xlsx')

初級難度的需求已經成功完成,至此我們已經學會從單個表中提取需要的行並且放到新的表格里。有的人可能會說了:一個表格的篩選可以直接用Excel中的 篩選 來完成,不需要用代碼寫這么復雜,還難以理解。因此就有了進階需求。現在需要完成的工作變成,獲取1000個表格中所有符合條件的行並匯總成一個新表。如果是手動操作的行,需要打開每個表格,然后一通篩選操作后,將所有滿足條件的行都復制到新表,並且執行上述操作1000次!

 

這顯然不現實,而如果你已經理解初級需求的思路,那么只需要加上幾行代碼,就可以完成進階需求。所需要的模塊是glob。批處理的大概代碼框架如下:

import glob

# 1000份數據所在的文件夾目錄
path = 'C:/Users/xxxxxx'

for file in glob.glob(path + '/*'):
    pass

如果需要遍歷特定類型的文件可以限定后綴,以xlsx后綴的Excel文件為例

for file in glob.glob(path + '/*.xlsx'):
    pass

最后只需要將上面寫好的針對單個文件的代碼放到循環體內部,且load_workbook的路徑變成循環出的每一個xlsx文件的絕對路徑。當然,還需要想清楚有些代碼不能在循環體里重復被執行,如創建新表和給新表添加表頭,創建新表放在循環體外就可以,添加表頭可以用一個單獨的變量來判斷這個操作是否已經被執行。完整代碼如下:

from openpyxl import load_workbook, Workbook
import glob

path = 'C:/Users/xxxxxx'
new_workbook = Workbook()
new_sheet = new_workbook.active

# 用flag變量明確新表是否已經添加了表頭,只要添加過一次就無須重復再添加
flag = 0

for file in glob.glob(path + '/*.xlsx'):
    workbook = load_workbook(file)
    sheet = workbook.active
    
    buy_mount = sheet['F']
    row_lst = []
    for cell in buy_mount:
        if isinstance(cell.value, int) and cell.value > 50:
            print(cell.row)
            row_lst.append(cell.row)
    
    if not flag:
        header = sheet[1]
        header_lst = []
        for cell in header:
            header_lst.append(cell.value)
        new_sheet.append(header_lst)
        flag = 1
    
    for row in row_lst:
        data_lst = []
        for cell in sheet[row]:
            data_lst.append(cell.value)
        new_sheet.append(data_lst)

new_workbook.save(path + '/' + '符合篩選條件的新表.xlsx')

 

小結

 

以上就是使用Python實現批量從Excel中提取指定數據的全部過程和代碼,如果你也有相關需求,稍作修改即可使用。其實如果你仔細思考會發現這個需求使用pandas會以更簡潔的代碼實現,但是由於我們之后的Python辦公自動化案例中會頻繁使用openpyxl,並且在操作Excel時有更多的功能,因此在之后我們將主要講解如何使用這個openpyxl實現。最后還是希望大家能夠理解Python辦公自動化的一個核心就是批量操作-解放雙手,讓復雜的工作自動化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM