python比较excel表格内容并提取_利用python提取多张excel表数据并汇总到同一张新表中...
接上篇文章《如何用python實現excel中的vlookup功能?》,上篇說到,最近我在做一個小項目,也是用python操作excel解決財務審計工作上的一些問題,以便提高工作效率及其準確性。
最終目的,刀哥是想做應收賬款賬齡分析,不知最終能否實現,請大家持續關注。
這篇文章要做的事情,如標題所述,就是提取多張excel表上的數據或信息,合并匯總到一張新表上,這是我們工作中經常會遇到的事情。
比如將每月銷售情況匯總到一張表上進行銷售情況分析,比如將各月發票信息匯總到一張表上進行統計分析,還比如將每月工資表上的某些信息匯總到一張表上進行工資成本分析等等。
這次,刀哥是要將2017年1-12月、2018年1-12月、2019年1-12月及2020年1-6月各期科目余額表中,所有應收賬款的信息,包括科目編碼、科目名稱、期初余額、借貸方發生額及期末余額,全部提取出來匯總到同一張新表上,并以科目編碼升序排列,客戶名稱及金額與科目編碼做到一一對應。
具體看表即為:
各期科目余額表截圖
最后得到的新表為:
要實現上述目標,可以分如下四步進行。
1.
獲取各科目余額表文件路徑
將2017年1-12月、2018年1-12月、2019年1-12月及2020年1-6月各期科目余額表放在同一文件夾下,要讀取多少個文件,就把多少個文件全部放在同一個文件夾下,如下圖。
然后讀取所有文件的路徑,代碼如下。
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:學習/python/賬齡分析/科目余額表/{}'.format(path)
8 dir_xls.append(whole_path)
9 return dir_xls
2.
獲取各科目余額表中應收賬款一級科目編碼所在的行列
比如在2017年科目余額表中,應收賬款一級科目編碼為“1122”,其所在的單元格為C12,也即為第12行第3列,這里的行號12、列號3,即為其定位。
其余科目余額表同理,均為獲取一級科目編碼“1122”的行號和列號,獲取代碼如下。
1dict_row_col = {}
2def get_row_col(dir_xls): #獲取每一張表中應收賬款一級科目編碼所在的行號和列號
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.
獲取各科目余額表中應收賬款所有二級科目編碼
根據獲取到的應收賬款一級科目編碼行號和列號,即根據其定位,再獲取每一張表中應收賬款所有二級科目編碼,并將其不重復且升序排列添加到一張新表中,代碼如下。
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 #將“科目編碼”從最后一個元素整體移動到第一個元素
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 #將所有元素寫入到excel表中
27 for i in range(len(ar_list2)):
28 ar_sheet.write(i,0,ar_list2[i])
得到的新表內容如下。
由上可看出,2017年至2020年1-6月,四張科目余額表,應收賬款共有617個二級科目,對應著617個不同的客戶。
4.
根據二級科目索引獲取全部所需信息
此步的操作過程,即上一篇《如何用python實現excel中的vlookup功能?》所分享的過程,這里就不再詳述了,代碼如下。
1def get_ar_info(dict_row_col):
2 #讀取導入目標表
3 file_target = r'd:\F:學習\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 #讀取原始數據來源表
16 file_source = key
17 df_source = pd.read_excel(file_source)
18 #將原始數據來源表及導入目標表信息合并到同一表上
19 dfneed = df_source[['科目編碼','科目名稱','期初借方','期初貸方','本期發生借方','本期發生貸方','期末借方','期末貸方']]
20 df_target = pd.merge(df_target,dfneed,how='left',on='科目編碼')
21 df_target.to_excel(file_target,index=False)
5.
最終目標實現
前四步即為封裝的四個函數,每個函數為其中一個步驟,最終匯總可以實現此文總體目標,調用代碼及運行代碼如下。
1import os
2import pandas as pd
3import xlrd,xlwt
4
5folder_path = r'd:\F:學習\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:學習\python\賬齡分析\AR.xls')
12get_ar_info(dict_row_col)
運行后生成的表格如下。
再經過簡單整理后,便可得出上文最終表格,至此實現了從多張excel表中提取所需數據或信息并匯總到同一張新表上的目的。
寫的很匆忙,不知道表述清楚沒有,如有疑問,請找刀哥交流。
如何實現賬齡分析目標,那就是刀哥下次要分享的內容了,敬請期待,記得點個贊同和收藏哦。
學習python,刀哥正在路上,你要一起來嗎?歡迎加入刀哥python學習交流群,來一起擼代碼吧。
總結
以上是生活随笔為你收集整理的python比较excel表格内容并提取_利用python提取多张excel表数据并汇总到同一张新表中...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乱码 设置界面_和平精英:压轴更新后BU
- 下一篇: python if语句能否判断中文_Py