Python可以有這種操作!
今天突然接到了媳婦兒的緊急求助電話,讓我幫她弄一個表格。原來中秋節要到了,媳婦兒單位準備給員工發福利,福利分4個檔次,不同的福利包含的東西不盡相同,每個部門的員工都有不同檔次的福利,現在已經有了兩個Excel表格,一個表格是每個員工發放哪個檔次的福利,另一個表格是每個檔次的福利包含什麼東西,單位領導讓我媳婦兒她們部門統計一下每個部門分別要買多少東西,彙總到一個表格上面,然後去採購。
現有的表格長這樣:

最後一欄的備註中的數字就是該員工應得的福利的檔次。

這張表格說明了每個檔次的福利所包含的東西,1檔福利是500元標準,2檔福利是300元標準……以此類推。 最後單位領導想要的表格就是下面這樣的,這是我最後做出的成果的截圖,顯示了每個部門分別要買多少東西:

那麼我是如何做到的呢? 聽媳婦描述完情況之後,我第一反應就是可以用Python來做這件事。事實證明,Python並沒有讓我失望。在這個過程中,我用到了兩個Python的模組,一個是用來讀Excel檔案的xlrd,另一個是用來向Excel檔案中寫入資料的xlsxwriter。
import xlrd import xlsxwriter
首先獲取兩個Excel檔案物件:
workbook1 = xlrd.open_workbook(r'details.xlsx') #這是第一張表 workbook2 = xlrd.open_workbook(r'plan.xlsx') #這是第二張表 sheet3 = workbook1.sheet_by_name('Sheet3') #第一張表的sheet sheet1 = workbook2.sheet_by_name('Sheet1') #第二張表的sheet
然後讀入第一個表中的部門和備註資訊,每一條員工的所屬部門和備註組成一個元組。
cols_bumen = sheet3.col_values(2) cols_beizhu = sheet3.col_values(7) res = list(zip(cols_bumen, cols_beizhu)) res = res[2:len(res)] #前兩行是表頭,我們所需資訊從第三行開始
讀入第二個表中的禮品資訊。
lipin = [[], ["喜盛隆月餅","胡姬花花生油","黃河口大閘蟹","大米","後腿老臘肉","五花老臘肉","醬醋精裝組合"], ["怡青源月餅8*100g","大米","醬醋精裝組合","胡姬花花生油","後腿老臘肉","茶葉","五花老臘肉"], ["怡青源月餅8*100g","大米","獼猴桃","龍大花生油","麵粉"], ["怡青源月餅8*100g","大米","後腿老臘肉"]] lipin_list = ['五花老臘肉', '龍大花生油', '醬醋精裝組合', '大米', '獼猴桃', '怡青源月餅8*100g', '喜盛隆月餅', '後腿老臘肉', '黃河口大閘蟹', '茶葉', '胡姬花花生油', '麵粉']
建立一個字典huizong,key是部門名,值是一個列表,列表中包含該部門所需的全部商品,假設需要兩袋大米,那麼列表中就會有兩個“大米”。 最終字典的內容應該類似這樣:
{'高層管理':['大米', '大米', '喜盛隆月餅'], '文化產業部':['茶葉', '茶葉', '五花老臘肉', '五花老臘肉']}
要做到這一點,我們需要遍歷res
for i in res: bumen = i[0] #獲取部門名 lipin_level = int(i[1]) #獲取該員工的福利檔次 if huizong.get(bumen) == None: #如果字典中不存在這個鍵值對,就建立一個 huizong[bumen] = [] huizong[bumen].extend(lipin[lipin_level]) #在列表中新增對應的禮品名
最後遍歷這個字典,把每個部門中的不同的商品數量通過list的count方法計算出來,將資料寫到Excel表中,就大功告成了。
完整程式碼如下:
import xlrd import xlwt import xlsxwriter workbook1 = xlrd.open_workbook(r'details.xlsx') workbook2 = xlrd.open_workbook(r'plan.xlsx') sheet3 = workbook1.sheet_by_name('Sheet3') sheet1 = workbook2.sheet_by_name('Sheet1') linpin = sheet1.col_values(1) lipin = [[], ["喜盛隆月餅","胡姬花花生油","黃河口大閘蟹","大米","後腿老臘肉","五花老臘肉","醬醋精裝組合"], ["怡青源月餅8*100g","大米","醬醋精裝組合","胡姬花花生油","後腿老臘肉","茶葉","五花老臘肉"], ["怡青源月餅8*100g","大米","獼猴桃","龍大花生油","麵粉"], ["怡青源月餅8*100g","大米","後腿老臘肉"]] lipin_list = ['五花老臘肉', '龍大花生油', '醬醋精裝組合', '大米', '獼猴桃', '怡青源月餅8*100g', '喜盛隆月餅', '後腿老臘肉', '黃河口大閘蟹', '茶葉', '胡姬花花生油', '麵粉'] cols_bumen = sheet3.col_values(2) cols_beizhu = sheet3.col_values(7) res = list(zip(cols_bumen, cols_beizhu)) res = res[2:len(res)] huizong = {'高層管理':[]} for i in res: bumen = i[0] lipin_level = int(i[1]) if huizong.get(bumen) == None: huizong[bumen] = [] huizong[bumen].extend(lipin[lipin_level]) result = xlsxwriter.Workbook('result.xlsx') worksheet = result.add_worksheet() for i in range(0, len(lipin_list)): worksheet.write(chr(66 + i) + '1', str(lipin_list[i])) bumen = [] for i in res: if bumen.count(i[0]) == 0: bumen.append(i[0]) for i in range(0, len(bumen)): worksheet.write('A{0}'.format(2+i), str(bumen[i])) alphaBet = 66 number = 2 j = 0 for key in huizong: count = 0 for i in range(0, len(lipin_list)): count = huizong[key].count(lipin_list[i]) worksheet.write('{0}{1}'.format(chr(alphaBet+i), number+j), count) j += 1 result.close()
原文釋出時間為:2018-09-24
本文作者:王浩
本文來自雲棲社群合作伙伴“ 360fff3f69d8c42ca3838c8&scene=0#rd" target="_blank" rel="nofollow,noindex">Python愛好者社群 ”,瞭解相關資訊可以關注“ Python愛好者社群 ”。