一、前言
大家好,前兩天給大家分享了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))
最新評論