1. 程式人生 > 其它 >利用python對excel工作簿合併與拆分

利用python對excel工作簿合併與拆分

一、對含有多個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
結果