一、對含有多個excel工作簿的多個文件夾進行合並
有A、B、C三個文件夾,每個文件夾都有多個 excel 工作簿(每個工作簿有且僅有一個工作表),當然A、B、C三個文件夾中的文件數量可以不一樣,文件名稱有交集即可,目的是將三個文件夾中的 excel 工作簿匯總到一個文件夾,並且將三個文件夾中名稱相同的工作簿中的數據合並,有點類似於數學中的並集運算,求A、B、C三個集合的並集。
思路
- 獲取數據文件夾名稱,存儲為列表 file_list;
- 遍歷 file_list ,獲取所有 excel 工作簿名稱,存儲為列表 excel_file_list;
- 遍歷 excel_file_list,將重復在多個數據文件夾中的工作簿合並.
缺點:只適用於含有唯一工作表的 excel 工作簿!
代碼
import pandas as pd
import os
def main():
file_path = './data'
file_list = os.listdir(file_path)
excel_file_list = []
for file in file_list:
excel_file_list += os.listdir(file_path + '/' + file)
excel_file_list = list(set(excel_file_list))
for excel in excel_file_list:
df_list = []
for file_name in file_list:
if excel in os.listdir(file_path + '/' + file_name):
df_list.append(pd.read_excel(file_path + '/' + file_name + '/' + excel))
res = pd.DataFrame()
for df in df_list:
res = pd.concat([res, df])
res = res.drop_duplicates()
res.to_excel('./result/' + excel, index=False)
if __name__ == "__main__":
main()
文件目錄
│ ExcelSortUtils.py
│
├─data
│ ├─A組
│ │ MJ_20210131-am.xlsx
│ │ SM-省-0000-市-明細-0000.xlsx
│ │ ZDQY_20210118.xlsx
│ │ 名單_20210127.xlsx
│ │
│ ├─B組
│ │ 20210125-620000-明細.xlsx
│ │ MJ_20210131-am.xlsx
│ │ SM-省-0000-市-明細-0000.xlsx
│ │ 名單_20210127.xlsx
│ │
│ └─C組
│ 20210125-620000-明細.xlsx
│ MJ_20210131-am.xlsx
│ SM-省-0000-市-明細-0000.xlsx
│ ZDQY_20210118.xlsx
│ 名單_20210127.xlsx
│
└─result
20210125-620000-明細.xlsx
MJ_20210131-am.xlsx
SM-省-0000-市-明細-0000.xlsx
ZDQY_20210118.xlsx
名單_20210127.xlsx
二、對含有多個sheet的 excel 工作簿進行合並
有多個excel工作簿,每個工作簿都有多個工作表,工作薄中的工作表名稱有沒有交集都可以,目的是將所有工作簿中的數據匯總到一個工作簿,名稱相同的工作表中的數據進行匯總。
思路
- 獲取所有 excel 工作簿中的工作表,以字典形式保存到列表; df_list(df_list=[dict1, dict2, dict3, dict4, dict5]),即每個工作簿對應一個字典,工作簿中的表就是字典的元素,同時將所有工作表的名稱保存為列表 sheet_list;
- 遍歷 sheet_list,將在列表 df_list 中重復出現的工作表合並.
代碼
import pandas as pd
from openpyxl import load_workbook
import os
def main():
fileList=os.listdir("./data")
df_list=[]
sheet_list=[]
for workbook in fileList:
wb = load_workbook(filename=file_path+"\\"+workbook)
sheetnames = wb.sheetnames
sheet_list += sheetnames
df_dict=dict()
for sheet in sheetnames:
df = pd.read_excel(file_path+"\\"+workbook, sheet_name=sheet, sep='\t', encoding='GBK')
df_dict[sheet] = df
df_list.append(df_dict)
sheet_list = list(set(sheet_list)) # 所有工作表名稱
data_list = []
for sheet in sheet_list:
df = pd.DataFrame()
for sheet_dic in df_list:
try:
df = df.append(sheet_dic[sheet])
except:
continue
df = df.drop_duplicates()
'''
此處根據情況添加數據處理過程······
'''
data_list.append(df)
# 將數據匯總到excel
res_path = os.path.abspath('')+"\\result\匯總.xlsx"
with pd.ExcelWriter(res_path) as writer:
i = 0
for df in data_list:
df.to_excel(writer, sheet_name = sheet_list[i], index=False)
i += 1
if __name__ == "__main__":
main()
文件目錄
│ excelconcat.py
│
├─data
│ 2月工單-1.xlsx
│ 2月工單-2.xlsx
│ 2月工單-3.xlsx
│ 2月工單-4.xlsx
│ 2月工單-5.xlsx
│
└─result
匯總.xlsx
三、對excel工作表中的數據進行拆分
現有一張匯總好的工作表,需要將這張表按單位分成不同的excel工作薄下發到各單位,並且保證每張工作表的格式和公式與原來的表一致。
代碼
import pandas as pd
from openpyxl import load_workbook
import os
def paste(sheet, begin, end, df):
for i, tup in enumerate(sheet[begin:end]):
for j, obj in enumerate(tup):
try:
obj.value = df.iloc[i, j]
except:
obj.value = ''
def main():
file_name = os.path.abspath('.') + '\\data\\' + os.listdir('./data')[0]
df_dic = pd.read_excel(file_name, sheet_name=["Sheet1"],
skiprows=1, sep='\t', header=None, encoding='GBK')
# 各單位代碼
company_name = ['53731', '48624', '52964', '45234', '46763', '50911', '52983',
'54236', '47326', '47852', '47327', '53442', '54208', '50669']
company_dic = dict()
for name in company_name:
data_list = list()
for i, key in enumerate(df_dic):
value = pd.DataFrame(df_dic[key].values).iloc[:, 0:37]
value[0] = value[0].apply(lambda x: str(x).rstrip())
value = value[value[0] == name]
data_list.append(value)
company_dic[name] = data_list
wb = load_workbook(filename=file_name)
'''
刪除不需要的sheet
sheetnames = wb.sheetnames
sheetlist = []
for sheet in sheetnames:
sheetlist.append(wb[sheet])
for sheet in sheetlist:
if sheet == wb['Sheet1']:
continue
else:
wb.remove(wb[sheet])
'''
for name in company_name:
paste(wb["Sheet1"], 'A2', 'AK1000', company_dic[name][0])
wb.save(os.path.abspath('.') + '\\result\\' + '/%s.xlsx' % (name))
if __name__=='__main__':
main()
文件目錄
│ excelsplit.py
│
├─data
│ 測試數據.xlsx
│
└─result
45234.xlsx
46763.xlsx
47326.xlsx
47327.xlsx
47852.xlsx
48624.xlsx
50669.xlsx
50911.xlsx
52964.xlsx
52983.xlsx
53442.xlsx
53731.xlsx
54208.xlsx
54236.xlsx