合并多个Excel文件到一个文件,并保留格式
合并多个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()