合并多個Excel文件到一個文件,并保留格式
- 需求介紹
- 第一步:創建目標文件
- 第二步:創建任務列表
- 第三步:合并文件
- 第四步:處理合并后的文件之調用程序打開并保存一次之前生成的Excel文件
- 第五步:處理合并后的文件之刪除合并后文件的無用表單
- 完整代碼
需求介紹
假設目前存在多個Excel文件,文件名如:A01.xlsx
,A02.xlsx
,A03.xlsx
,A04.xlsx
,
現在需要將A01.xlsx
中的表單Sheet1
,合并到合并后文件.xlsx
中的A1
表單中,
將A02.xlsx
中的表單Sheet1
,合并到合并后文件.xlsx
中的A2
表單中,以此類推。
第一步:創建目標文件
def creat_new_excel(file_path):# 創建一個新的Excel文件content_list = []df = pd.DataFrame(content_list)df.to_excel(file_path, sheet_name="測試") # 設置統一的表單名稱,便于后期統一刪除returntarget_file = r"D:\任務\pythonProject\匯總后文件.xlsx" creat_new_excel(target_file) # 創建目標文件
第二步:創建任務列表
def source_file():# 文件路徑,文件名稱及后綴source_file_list = [[r"D:\任務\pythonProject\A\A01.xlsx", "A01.xlsx"], [r"D:\任務\pythonProject\A\A02.xlsx", "A02.xlsx"],[r"D:\任務\pythonProject\A\A03.xlsx", "A03.xlsx"],]return source_file_list
第三步:合并文件
def target(target_file):destWorkbook = Workbook()destWorkbook.LoadFromFile(target_file)return destWorkbookdef get_source_sheet(destWorkbook,source_file_path,source_file_name):sourceWorkbook = Workbook()sourceWorkbook.LoadFromFile(source_file_path)# 復制之后的sheet名sourceSheet = sourceWorkbook.Worksheets[0] # 子文件中的第一個Sheet,可以根據需求進行調整sheetName = source_file_name[:-5]destSheet = destWorkbook.Worksheets.Add(sheetName)# 復制destSheet.CopyFrom(sourceSheet)destWorkbook.CopyTheme(sourceWorkbook)sourceWorkbook.Dispose()return destWorkbookfor source in source_file():destWorkbook = get_source_sheet(target(target_file),source[0],source[1])# 保存,根據Excel版本不同destWorkbook.SaveToFile(target_file, ExcelVersion.Version2016)# 釋放destWorkbook.Dispose()
第四步:處理合并后的文件之調用程序打開并保存一次之前生成的Excel文件
這一步的原因是,openpyxl不能直接讀取通過Python生成的xlsx文件
解決方式有兩種:
- 一是手動打開文件并保存
- 二是通過程序進行打開并保存
def just_open(filename):xlApp = Dispatch("Excel.Application")xlApp.Visible = FalsexlBook = xlApp.Workbooks.Open(filename)xlBook.Save()xlBook.Close()xlApp.Quit()del xlApp
第五步:處理合并后的文件之刪除合并后文件的無用表單
def deal_file(filename):# import openpyxl# 加載Excel文件wb = load_workbook(filename=filename, read_only=False)# print(wb.sheetnames)wb.remove(wb["測試"]) # 移除,新建Excel文件的時候,生成的表單wb.remove(wb["Evaluation Warning"]) # 移除,使用spire.xls模塊生成的表單wb.save(filename)
完整代碼
from spire.xls import Workbook, ExcelVersion # pip install spire.xls
from win32com.client import Dispatch
from openpyxl import load_workbook # pip install openpyxl
import pandas as pd
import osdef creat_new_excel(file_path):# 創建一個新的Excel文件content_list = []df = pd.DataFrame(content_list)df.to_excel(file_path, sheet_name="測試") # 設置統一的表單名稱,便于后期統一刪除returndef source_file():source_file_list = [[r"D:\任務\pythonProject\A\A01.xlsx", "A01.xlsx"], # 文件路徑,文件名稱及后綴[r"D:\任務\pythonProject\A\A02.xlsx", "A02.xlsx"],[r"D:\任務\pythonProject\A\A03.xlsx", "A03.xlsx"],]return source_file_listdef deal_file(filename):# import openpyxl# 加載Excel文件wb = load_workbook(filename=filename, read_only=False)# print(wb.sheetnames)wb.remove(wb["測試"]) # 移除,新建Excel文件的時候,生成的表單wb.remove(wb["Evaluation Warning"]) # 移除,使用spire.xls模塊生成的表單wb.save(filename)def target(target_file):destWorkbook = Workbook()destWorkbook.LoadFromFile(target_file)return destWorkbookdef get_source_sheet(destWorkbook,source_file_path,source_file_name):sourceWorkbook = Workbook()sourceWorkbook.LoadFromFile(source_file_path)# 復制之后的sheet名sourceSheet = sourceWorkbook.Worksheets[0] # 子文件中的第一個Sheet,可以根據需求進行調整sheetName = source_file_name[:-5]destSheet = destWorkbook.Worksheets.Add(sheetName)# 復制destSheet.CopyFrom(sourceSheet)destWorkbook.CopyTheme(sourceWorkbook)sourceWorkbook.Dispose()return destWorkbookdef just_open(filename):xlApp = Dispatch("Excel.Application")xlApp.Visible = FalsexlBook = xlApp.Workbooks.Open(filename)xlBook.Save()xlBook.Close()xlApp.Quit()del xlAppdef run():target_file = r"D:\任務\pythonProject\匯總后文件.xlsx" creat_new_excel(target_file) # 創建目標文件for source in source_file():destWorkbook = get_source_sheet(target(target_file),source[0],source[1])# 保存,根據Excel版本不同destWorkbook.SaveToFile(target_file, ExcelVersion.Version2016)# 釋放# sourceWorkbook.Dispose()destWorkbook.Dispose()# 刪除表just_open(target_file) deal_file(target_file)print(target_file)if __name__ == '__main__':run()