首頁>科技>

一、前言

大家好,前兩天給大家分享了Python自動化文章:手把手教你利用Python輕鬆拆分Excel為多個CSV檔案,而後在Python進階交流群裡邊有讀者遇到一個問題,他有很多個Excel表格,他需要對這些Excel檔案進行合併。

誠然,一個一個打開復制貼上固然可行,但是該方法費時費力,還容易出錯,幾個檔案還可以手動處理,要是幾十個甚至上百個,你就抓瞎了,不過這問題對Python來說,so easy,一起來看看吧!

二、專案目標

用Python實現多Excel、多Sheet的合併處理。

三、專案準備

軟體:PyCharm

需要的庫:pandas, xlrd,os

四、專案分析1)如何選擇要合併的Excel檔案?

利用os,獲取所有要合併的Excel檔案。

2)如何選擇要合併的Sheet?

利用xlrd庫進行Excel讀取,獲取要合併的Sheet名。

3)如何合併?

利用pandas庫,對所有Sheet名逐一迴圈開啟,透過concat()進行資料追加合併即可。

4)如何儲存檔案?

利用to_excel儲存資料,得到最終合併後的目標檔案。

五、專案實現

1、第一步匯入需要的庫

import pandas as pdimport xlrdimport os

2、第二步選擇要合併的Excel檔案

 #要合併檔案路徑    path="D:/b/"    #獲取資料夾下所有EXCEL名    xlsx_names = [x for x in os.listdir(path) if x.endswith(".xlsx")]

3、第三步選擇要合併的Sheet

   # 獲取第一個EXCEL名    xlsx_names1 = xlsx_names[0]    aa = path + xlsx_names1    #開啟第一個EXCEL    first_file_fh=xlrd.open_workbook(aa)    # 獲取SHEET名    first_file_sheet=first_file_fh.sheets()

4、第四步對Sheet內容進行迴圈合併

   #按SHEET名迴圈    for sheet_name in sheet_names:        df = None        # 按EXCEL名迴圈        for xlsx_name in xlsx_names:            sheet_na = pd.ExcelFile(path + xlsx_name).sheet_names            if sheet_name in sheet_na:                #print(sheet_name)                _df = pd.read_excel(path + xlsx_name, sheet_name=sheet_name,header=None)                if df is None:                    df = _df                else:                    df = pd.concat([df, _df], ignore_index=True)            else:continue

5、第五步儲存合併後的檔案

 
      df.to_excel(excel_writer=writer, sheet_name=sheet_name, encoding="utf-8", index=False)        print(sheet_name + "  儲存成功!共%d個,第%d個。" % (len(sheet_names),num))        num += 1    writer.save()    writer.close()
六、效果展示

1、處理前Excel資料:

2、執行進度提示:

3、合併後的結果:

來自群友Jayson的程式碼:

# -*- coding: utf-8 -*-# @Author: hebe# @Date:   2020-04-18 18:31:03# @Last Modified by:   hebe# @Last Modified time: 2020-04-18 19:40:48import os import globimport openpyxldef merge_xlsx_files(xlsx_files):    wb = openpyxl.load_workbook(xlsx_files[0])    ws = wb.active    ws.title = "merged result"    for  filename in xlsx_files[1:]:        workbook = openpyxl.load_workbook(filename)        sheet = workbook.active        for row in sheet.iter_rows(min_row=1):            values = [cell.value for cell in row]            ws.append(values)    return wb#path is very important here , must true.def get_all_xlsx_files(path):    xlsx_files = glob.glob(os.path.join(r'C:\\Users\\pdcfi\\Desktop\\', '*.xlsx'))    sorted(xlsx_files, key=str.lower)    return xlsx_filesdef main():    xlsx_files = get_all_xlsx_files(os.path.expanduser('~lmx'))    wb = merge_xlsx_files(xlsx_files)    wb.save('merged_form.xlsx')if __name__ == '__main__':    main()    print("all excel append OK!")

來自好友劉早起的程式碼:

# -*- coding: utf-8 -*-from openpyxl import load_workbook, Workbookimport globpath = "C:\\Users\\pdcfi\\Desktop\\excel\\"new_workbook = Workbook()new_sheet = new_workbook.active# 用flag變數明確新表是否已經添加了表頭,只要新增過一次就無須重複再新增flag = 0for file in glob.glob(path + '/*.xlsx'):    workbook = load_workbook(file)    sheet = workbook.active    coloum_A = sheet['A']    row_lst = []    for cell in coloum_A:        if cell:            print(cell.row)            row_lst.append(cell.row)    if not flag:        header = sheet[1]        header_lst = []        for cell in header:            header_lst.append(cell.value)        new_sheet.append(header_lst)        flag = 1    for row in row_lst:        data_lst = []        for cell in sheet[row]:            data_lst.append(cell.value)        new_sheet.append(data_lst)new_workbook.save(path + '/' + '符合篩選條件的新表.xlsx')

來自群友Engineer的程式碼:

import tkinter as tkfrom tkinter import filedialogimport osimport pandas as pdimport globroot = tk.Tk()root.withdraw()# 選擇資料夾位置filelocation = os.path.normpath(filedialog.askdirectory(initialdir=os.getcwd()))lst = []# 讀取資料夾下所有檔案(xls和xlsx都讀取)for i in glob.glob(filelocation + "\\\\" + "*.*"):    if os.path.splitext(i)[1] in [".xls", ".xlsx"]:        lst.append(pd.read_excel(i))# 儲存合併後的excel檔案writer = pd.ExcelWriter(filedialog.asksaveasfilename(title="儲存", initialdir=filelocation, defaultextension="xlsx",                                                     filetypes=[("Excel 工作簿", "*.xlsx"),                                                                ("Excel 97-2003 工作簿", "*.xls")]))pd.concat(lst).to_excel(writer, 'all', index=False)writer.save()print('\n%d個檔案已經合併成功!' % len(lst))
8
最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 海外倉一件代發流程及時效介紹