python比较excel表格内容并提取_利用python提取多张excel表数据并汇总到同一张新表中...
接上篇文章《如何用python實(shí)現(xiàn)excel中的vlookup功能?》,上篇說(shuō)到,最近我在做一個(gè)小項(xiàng)目,也是用python操作excel解決財(cái)務(wù)審計(jì)工作上的一些問(wèn)題,以便提高工作效率及其準(zhǔn)確性。
最終目的,刀哥是想做應(yīng)收賬款賬齡分析,不知最終能否實(shí)現(xiàn),請(qǐng)大家持續(xù)關(guān)注。
這篇文章要做的事情,如標(biāo)題所述,就是提取多張excel表上的數(shù)據(jù)或信息,合并匯總到一張新表上,這是我們工作中經(jīng)常會(huì)遇到的事情。
比如將每月銷(xiāo)售情況匯總到一張表上進(jìn)行銷(xiāo)售情況分析,比如將各月發(fā)票信息匯總到一張表上進(jìn)行統(tǒng)計(jì)分析,還比如將每月工資表上的某些信息匯總到一張表上進(jìn)行工資成本分析等等。
這次,刀哥是要將2017年1-12月、2018年1-12月、2019年1-12月及2020年1-6月各期科目余額表中,所有應(yīng)收賬款的信息,包括科目編碼、科目名稱(chēng)、期初余額、借貸方發(fā)生額及期末余額,全部提取出來(lái)匯總到同一張新表上,并以科目編碼升序排列,客戶(hù)名稱(chēng)及金額與科目編碼做到一一對(duì)應(yīng)。
具體看表即為:
各期科目余額表截圖
最后得到的新表為:
要實(shí)現(xiàn)上述目標(biāo),可以分如下四步進(jìn)行。
1.
獲取各科目余額表文件路徑
將2017年1-12月、2018年1-12月、2019年1-12月及2020年1-6月各期科目余額表放在同一文件夾下,要讀取多少個(gè)文件,就把多少個(gè)文件全部放在同一個(gè)文件夾下,如下圖。
然后讀取所有文件的路徑,代碼如下。
1dir_xls = []
2def get_file(folder_path): #獲取同一文件夾下所有科目余額表各自的文件路徑
3 dir_file = os.listdir(folder_path)
4 #print(dir_file)
5 for path in dir_file:
6 if path[-4:] == 'xlsx' or path[-3:] == 'xls':
7 whole_path = r'd:/F:學(xué)習(xí)/python/賬齡分析/科目余額表/{}'.format(path)
8 dir_xls.append(whole_path)
9 return dir_xls
2.
獲取各科目余額表中應(yīng)收賬款一級(jí)科目編碼所在的行列
比如在2017年科目余額表中,應(yīng)收賬款一級(jí)科目編碼為“1122”,其所在的單元格為C12,也即為第12行第3列,這里的行號(hào)12、列號(hào)3,即為其定位。
其余科目余額表同理,均為獲取一級(jí)科目編碼“1122”的行號(hào)和列號(hào),獲取代碼如下。
1dict_row_col = {}
2def get_row_col(dir_xls): #獲取每一張表中應(yīng)收賬款一級(jí)科目編碼所在的行號(hào)和列號(hào)
3 for i in dir_xls:
4 #print(i)
5 account_balance_sheet_data = pd.DataFrame(pd.read_excel(i))
6 for a in account_balance_sheet_data.index:
7 for b in range(len(account_balance_sheet_data.loc[a].values)):
8 if account_balance_sheet_data.loc[a].values[b] == '1122':
9 row = a+1
10 col = b+1
11 dict_row_col[i] = [row,col]
12 return dict_row_col
3.
獲取各科目余額表中應(yīng)收賬款所有二級(jí)科目編碼
根據(jù)獲取到的應(yīng)收賬款一級(jí)科目編碼行號(hào)和列號(hào),即根據(jù)其定位,再獲取每一張表中應(yīng)收賬款所有二級(jí)科目編碼,并將其不重復(fù)且升序排列添加到一張新表中,代碼如下。
1def get_ar_code(dict_row_col):
2 i = 0
3 ar_list1 = []
4 ar_list2 = []
5 for key in dict_row_col.keys():
6 workbook = xlrd.open_workbook(key)
7 balance_sheet = workbook.sheet_by_index(0)
8 row = dict_row_col[key][0]
9 col = dict_row_col[key][1]
10 while True:
11 if '1122' in balance_sheet.cell_value(row+1,col-1):
12 ar_code = balance_sheet.cell_value(row+1,col-1)
13 if ar_code not in ar_list1:
14 ar_list1.append(ar_code)
15 else:
16 pass
17 row = row+1
18 else:
19 break
20 ar_list1.append('科目編碼')
21 ar_list1.sort(reverse=False) #科目編碼列表升序排列
22 #將“科目編碼”從最后一個(gè)元素整體移動(dòng)到第一個(gè)元素
23 ar_list2.append(ar_list1[len(ar_list1)-1])
24 for i in range(1,len(ar_list1)):
25 ar_list2.append(ar_list1[i-1])
26 #將所有元素寫(xiě)入到excel表中
27 for i in range(len(ar_list2)):
28 ar_sheet.write(i,0,ar_list2[i])
得到的新表內(nèi)容如下。
由上可看出,2017年至2020年1-6月,四張科目余額表,應(yīng)收賬款共有617個(gè)二級(jí)科目,對(duì)應(yīng)著617個(gè)不同的客戶(hù)。
4.
根據(jù)二級(jí)科目索引獲取全部所需信息
此步的操作過(guò)程,即上一篇《如何用python實(shí)現(xiàn)excel中的vlookup功能?》所分享的過(guò)程,這里就不再詳述了,代碼如下。
1def get_ar_info(dict_row_col):
2 #讀取導(dǎo)入目標(biāo)表
3 file_target = r'd:\F:學(xué)習(xí)\python\賬齡分析\AR.xls'
4 list_ar_code = []
5 workbook = xlrd.open_workbook(file_target)
6 balance_sheet = workbook.sheet_by_index(0)
7 rows = balance_sheet.nrows
8 for i in range(1,rows):
9 list_ar_code.append(balance_sheet.cell_value(i,0))
10 #print(list_ar_code)
11 data = {'科目編碼':list_ar_code}
12 df_target = pd.DataFrame(data)
13
14 for key in dict_row_col.keys():
15 #讀取原始數(shù)據(jù)來(lái)源表
16 file_source = key
17 df_source = pd.read_excel(file_source)
18 #將原始數(shù)據(jù)來(lái)源表及導(dǎo)入目標(biāo)表信息合并到同一表上
19 dfneed = df_source[['科目編碼','科目名稱(chēng)','期初借方','期初貸方','本期發(fā)生借方','本期發(fā)生貸方','期末借方','期末貸方']]
20 df_target = pd.merge(df_target,dfneed,how='left',on='科目編碼')
21 df_target.to_excel(file_target,index=False)
5.
最終目標(biāo)實(shí)現(xiàn)
前四步即為封裝的四個(gè)函數(shù),每個(gè)函數(shù)為其中一個(gè)步驟,最終匯總可以實(shí)現(xiàn)此文總體目標(biāo),調(diào)用代碼及運(yùn)行代碼如下。
1import os
2import pandas as pd
3import xlrd,xlwt
4
5folder_path = r'd:\F:學(xué)習(xí)\python\賬齡分析\科目余額表'
6f = xlwt.Workbook()
7ar_sheet = f.add_sheet(u'ar_sheet',cell_overwrite_ok=True)
8dir_xls = get_file(folder_path)
9dict_row_col = get_row_col(dir_xls)
10get_ar_code(dict_row_col)
11f.save(r'd:\F:學(xué)習(xí)\python\賬齡分析\AR.xls')
12get_ar_info(dict_row_col)
運(yùn)行后生成的表格如下。
再經(jīng)過(guò)簡(jiǎn)單整理后,便可得出上文最終表格,至此實(shí)現(xiàn)了從多張excel表中提取所需數(shù)據(jù)或信息并匯總到同一張新表上的目的。
寫(xiě)的很匆忙,不知道表述清楚沒(méi)有,如有疑問(wèn),請(qǐng)找刀哥交流。
如何實(shí)現(xiàn)賬齡分析目標(biāo),那就是刀哥下次要分享的內(nèi)容了,敬請(qǐng)期待,記得點(diǎn)個(gè)贊同和收藏哦。
學(xué)習(xí)python,刀哥正在路上,你要一起來(lái)嗎?歡迎加入刀哥python學(xué)習(xí)交流群,來(lái)一起擼代碼吧。
總結(jié)
以上是生活随笔為你收集整理的python比较excel表格内容并提取_利用python提取多张excel表数据并汇总到同一张新表中...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 乱码 设置界面_和平精英:压轴更新后BU
- 下一篇: 关于月的网名143个