大家好,又到了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辦公自動化的一個核心就是批量操作-解放雙手,讓復雜的工作自動化