Python辦公自動(dòng)化,批量提取Excel數(shù)據(jù)
點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫(kù)開(kāi)發(fā)”,
設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨
大家好,又到了Python辦公自動(dòng)化系列。
今天我們來(lái)講解一個(gè)比較簡(jiǎn)單的案例,使用openpyxl從Excel中提取指定的數(shù)據(jù)并生成新的文件,之后進(jìn)一步批量自動(dòng)化實(shí)現(xiàn)這個(gè)功能,通過(guò)本例可以學(xué)到的知識(shí)點(diǎn):
openpyxl模塊的運(yùn)用glob模塊建立批處理
數(shù)據(jù)源:阿里云天池的電商嬰兒數(shù)據(jù)(可自行搜索并下載,如果要完成進(jìn)階難度可直接將該數(shù)據(jù)Excel拷貝999次即可,當(dāng)然這個(gè)拷貝可以交給代碼來(lái)實(shí)現(xiàn))
需求說(shuō)明
初級(jí)難度:提取電商嬰兒數(shù)據(jù).xlsx中購(gòu)買數(shù)buy_mount超過(guò)50的記錄建立新的Excel表

最后形成如下的表格:

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