合并多个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()
相关推荐
C++ 老炮儿的技术栈16 分钟前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法
怣5026 分钟前
MySQL子查询零基础入门教程:从小白到上手(零基础入门版)
数据库·mysql
yuuki23323326 分钟前
【C++】继承
开发语言·c++·windows
码界调试侠29 分钟前
MongoDB 常用查询语法
数据库·mongodb
静听山水30 分钟前
StarRocks导入数据【Stream Load】
数据库
藦卡机器人31 分钟前
国产机械臂做的比较好的品牌有哪些?
大数据·数据库·人工智能
非凡ghost1 小时前
PowerDirector安卓版(威力导演安卓版)
android·windows·学习·软件需求
jiunian_cn1 小时前
【Redis】数据库管理操作
数据库·redis·缓存
_Johnny_1 小时前
ETCD 配额/空间告警模拟方案
网络·数据库·etcd
猫头虎2 小时前
基于信创openEuler系统安装部署OpenTeleDB开源数据库的实战教程
数据库·redis·sql·mysql·开源·nosql·database