|
大家好,又到了Python辦公自動化系列。 今天我們來講解一個比較簡單的案例,使用openpyxl從Excel中提取指定的數(shù)據(jù)并生成新的文件,之后進(jìn)一步批量自動化實現(xiàn)這個功能,通過本例可以學(xué)到的知識點: 數(shù)據(jù)源:阿里云天池的電商嬰兒數(shù)據(jù)(可自行搜索并下載,如果要完成進(jìn)階難度可直接將該數(shù)據(jù)Excel拷貝999次即可,當(dāng)然這個拷貝可以交給代碼來實現(xiàn)) 初級難度:提取電商嬰兒數(shù)據(jù).xlsx中購買數(shù)buy_mount超過50的記錄建立新的Excel表

最后形成如下的表格: 
進(jìn)階難度:同一個文件夾下有1000份電商嬰兒數(shù)據(jù)的Excel表格(命名為電商嬰兒數(shù)據(jù)1.xlsx,電商嬰兒數(shù)據(jù)2.xlsx至電商嬰兒數(shù)據(jù)1000.xlsx),需要提取所有表格中購買數(shù)buy_mount超過50的記錄并匯總至一個新的Excel表 讓我們先完成初級難度的需求挑戰(zhàn),首先導(dǎo)入所需模塊并打開數(shù)據(jù)表,注意 打開已經(jīng)存在的Excel用load_workbook,創(chuàng)建新的Excel用Workbook from openpyxl import load_workbook, Workbook
# 數(shù)據(jù)所在的文件夾目錄 path = 'C:/Users/xxxxxx'
# 打開電商嬰兒數(shù)據(jù)工作簿 workbook = load_workbook(path + '/' + '電商嬰兒數(shù)據(jù).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)
這一步本質(zhì)上就是對購買數(shù)的各個單元格進(jìn)行判斷,如果數(shù)值超過50就將其行號放入一個空列表中,間接完成了篩出符合條件的行。注意這一列有可能有的單元格cell的值value不是數(shù)值類型,因此需要用isinstance()進(jìn)行判斷,當(dāng)然也可以將單元格的值先用int()轉(zhuǎn)為整型再判斷。 篩選出符合條件的行號就可以提取行并且放入新的Excel中了,因此需要先創(chuàng)建新的工作簿,現(xiàn)在創(chuàng)建新的工作簿寫入符合條件的行,思路是根據(jù)行號獲取到指定行后,遍歷所有單元格的值組裝成一個列表,用sheet.append()寫入新表 new_workbook = Workbook() new_sheet = new_workbook.active
# 創(chuàng)建和 電商嬰兒數(shù)據(jù) 一樣的表頭(第一行) header = sheet[1] header_lst = [] for cell in header: header_lst.append(cell.value) new_sheet.append(header_lst)
# 從舊表中根據(jù)行號提取符合條件的行,并遍歷單元格獲取值,以列表形式寫入新表 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')
初級難度的需求已經(jīng)成功完成,至此我們已經(jīng)學(xué)會從單個表中提取需要的行并且放到新的表格里。有的人可能會說了:一個表格的篩選可以直接用Excel中的 篩選 來完成,不需要用代碼寫這么復(fù)雜,還難以理解。因此就有了進(jìn)階需求?,F(xiàn)在需要完成的工作變成,獲取1000個表格中所有符合條件的行并匯總成一個新表。如果是手動操作的行,需要打開每個表格,然后一通篩選操作后,將所有滿足條件的行都復(fù)制到新表,并且執(zhí)行上述操作1000次! 這顯然不現(xiàn)實,而如果你已經(jīng)理解初級需求的思路,那么只需要加上幾行代碼,就可以完成進(jìn)階需求。所需要的模塊是glob。批處理的大概代碼框架如下: import glob
# 1000份數(shù)據(jù)所在的文件夾目錄 path = 'C:/Users/xxxxxx'
for file in glob.glob(path + '/*'): pass
如果需要遍歷特定類型的文件可以限定后綴,以xlsx后綴的Excel文件為例
for file in glob.glob(path + '/*.xlsx'): pass
最后只需要將上面寫好的針對單個文件的代碼放到循環(huán)體內(nèi)部,且load_workbook的路徑變成循環(huán)出的每一個xlsx文件的絕對路徑。當(dāng)然,還需要想清楚有些代碼不能在循環(huán)體里重復(fù)被執(zhí)行,如創(chuàng)建新表和給新表添加表頭,創(chuàng)建新表放在循環(huán)體外就可以,添加表頭可以用一個單獨的變量來判斷這個操作是否已經(jīng)被執(zhí)行。完整代碼如下: from openpyxl import load_workbook, Workbook import glob
path = 'C:/Users/xxxxxx' new_workbook = Workbook() new_sheet = new_workbook.active
# 用flag變量明確新表是否已經(jīng)添加了表頭,只要添加過一次就無須重復(fù)再添加 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實現(xiàn)批量從Excel中提取指定數(shù)據(jù)的全部過程和代碼,如果你也有相關(guān)需求,稍作修改即可使用。其實如果你仔細(xì)思考會發(fā)現(xiàn)這個需求使用pandas會以更簡潔的代碼實現(xiàn),但是由于我們之后的Python辦公自動化案例中會頻繁使用openpyxl,并且在操作Excel時有更多的功能,因此在之后我們將主要講解如何使用這個openpyxl實現(xiàn)。最后還是希望大家能夠理解Python辦公自動化的一個核心就是批量操作-解放雙手,讓復(fù)雜的工作自動化!
|