合并多个Excel文件到一个文件,并保留格式
- 需求介绍
- 第一步:创建目标文件
- 第二步:创建任务列表
- 第三步:合并文件
- 第四步:处理合并后的文件之调用程序打开并保存一次之前生成的Excel文件
- 第五步:处理合并后的文件之删除合并后文件的无用表单
- 完整代码
需求介绍
假设目前存在多个Excel文件,文件名如:A01.xlsx
,A02.xlsx
,A03.xlsx
,A04.xlsx
,
现在需要将A01.xlsx
中的表单Sheet1
,合并到合并后文件.xlsx
中的A1
表单中,
将A02.xlsx
中的表单Sheet1
,合并到合并后文件.xlsx
中的A2
表单中,以此类推。
第一步:创建目标文件
python
def creat_new_excel(file_path):
# 创建一个新的Excel文件
content_list = []
df = pd.DataFrame(content_list)
df.to_excel(file_path, sheet_name="测试") # 设置统一的表单名称,便于后期统一删除
return
target_file = r"D:\任务\pythonProject\汇总后文件.xlsx"
creat_new_excel(target_file) # 创建目标文件
第二步:创建任务列表
python
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
第三步:合并文件
python
def target(target_file):
destWorkbook = Workbook()
destWorkbook.LoadFromFile(target_file)
return destWorkbook
def 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 destWorkbook
for 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文件
解决方式有两种:
- 一是手动打开文件并保存
- 二是通过程序进行打开并保存
python
def just_open(filename):
xlApp = Dispatch("Excel.Application")
xlApp.Visible = False
xlBook = xlApp.Workbooks.Open(filename)
xlBook.Save()
xlBook.Close()
xlApp.Quit()
del xlApp
第五步:处理合并后的文件之删除合并后文件的无用表单
python
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)
完整代码
python
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 os
def creat_new_excel(file_path):
# 创建一个新的Excel文件
content_list = []
df = pd.DataFrame(content_list)
df.to_excel(file_path, sheet_name="测试") # 设置统一的表单名称,便于后期统一删除
return
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 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 destWorkbook
def 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 destWorkbook
def just_open(filename):
xlApp = Dispatch("Excel.Application")
xlApp.Visible = False
xlBook = xlApp.Workbooks.Open(filename)
xlBook.Save()
xlBook.Close()
xlApp.Quit()
del xlApp
def 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()