多个Excel文件合并到一个文件的不同工作表中的Python实现

多个Excel文件合并到一个文件的不同工作表中的Python实现

在数据处理中,我们经常需要将多个Excel文件整合到同一个文件中以便后续分析或展示。本文将向大家介绍如何通过Python代码实现这一目标,并逐步解释代码的实现过程。


一、代码功能概述

该脚本的主要功能包括:

  1. 引导用户选择多个Excel文件。
  2. 将每个选择的Excel文件的内容分别写入到一个新的Excel文件的不同工作表中。
  3. 提供保存新文件的基本信息(如文件名)。

通过以上步骤,最终将所有选中的Excel文件内容整合到一个新文件中,每个原始文件对应一个独立的工作表。


二、代码实现过程

第一步:导入必要的库

from openpyxl import load_workbook, Workbook
import tkinter as tk
from tkinter import messagebox
  • openpyxl用于读写Excel文件。
  • tkinter用于创建用户界面进行文件选择。

第二步:定义函数 - 读取Excel文件路径

def read_excel_files_path() -> list:
    root = tk.Tk()
    root.withdraw()  # 隐藏主窗口
    f_path = list(filedialog.askopenfilenames())  # 引导用户选择多个Excel文件
    return f_path
  • 使用tkinterfile dialog组件引导用户选择Excel文件。
  • 返回选中的文件路径列表。

第三步:定义函数 - 处理每个Excel文件

def read_excel_sheet(path_list):
    # 保存新文件名
    save_path = save_file_name()
    
    new_excel = Workbook()  # 创建新的工作簿
    for index, file_path in enumerate(path_list):
        print(f"处理第{index + 1}个文件:{file_path}")
        
        # 获取工作簿和工作表名称
        origin_excel = load_workbook(filename=file_path)
        origin_sheet_name = origin_excel.sheetnames
        
        if index == 0:
            new_sheet = new_excel.active  # 第一个工作表的名字为'新工作表'
            new_sheet.title = origin_sheet_name[0]  # 设置第一个工作表的名称
        else:
            new_sheet = new_excel.create_sheet(new_sheet_name=origin_sheet_name[1])  # 新增工作表
            
        # 写入数据到新工作表
        for row in origin_excel[origin_sheet_name[0]].iter_rows():
            row_list = []
            for cell in row:
                row_list.append(cell.value)
            new_sheet.append(row_list)
            
    new_excel.save(save_path)  # 保存新的Excel文件
    messagebox.showinfo('提示', '合并完成!')  # 显示提示信息
  • 遍历每个选中的Excel文件。
  • 创建一个新的工作簿,并根据第一个文件的工作表名称设置第一个工作表的名称。
  • 对于后续的文件,逐个创建新的工作表,并将数据写入对应的表格中。

第四步:定义函数 - 设置保存文件名

def save_file_name():
    root = tk.Tk()
    root.withdraw()
    save_path = filedialog.asksaveasfilename()  # 引导用户选择文件夹和文件名
    return save_path
  • 使用tkinterfile dialog组件引导用户设置保存路径。
  • 返回用户指定的保存路径。

三、代码运行示例

  1. 启动Python脚本。
  2. 运行以下代码:
    path_list = read_excel_files_path()
    if not path_list:
        print("请至少选择一个Excel文件")
        return
    read_excel_sheet(path_list)
    
  3. 用户依次选择多个Excel文件,系统会将这些文件的内容分别写入到一个新的Excel文件的不同工作表中。

四、代码扩展功能

1. 批处理处理所有工作表

在实际应用中,我们可能需要保持每个原始Excel文件的工作表名称和顺序不变。以下是实现这一功能的思路:

def read_excel_sheet(path_list):
    # 获取第一个文件的信息
    first_file_path = path_list[0]
    first_origin_excel = load_workbook(filename=first_file_path)
    first_origin_sheet_name = first_origin_excel.sheetnames
    
    new_excel = Workbook()
    
    for index, file_path in enumerate(path_list):
        print(f"处理第{index + 1}个文件:{file_path}")
        
        if index == 0:
            # 使用第一个文件的工作表信息
            new_sheet = new_excel.create_sheet(new_sheet_name=first_origin_sheet_name[index])
            new_sheet.title = first_origin_sheet_name[0]  # 设置第一个工作表的名称
        else:
            new_sheet = new_excel.create_sheet(new_sheet_name=(first_origin_sheet_name[1:] if len(first_origin_sheet_name) > 1 else ""))  # 其他文件使用默认名称
        
        # 写入数据到新工作表
        for row in load_workbook(filename=file_path)[first_origin_sheet_name[index]].iter_rows():
            row_list = []
            for cell in row:
                row_list.append(cell.value)
            new_sheet.append(row_list)
            
    save_path = save_file_name()
    new_excel.save(save_path)
    messagebox.showinfo('提示', '合并完成!')

2. 进行数据清洗

在读取文件后,我们可以对数据进行一些基本的清洗操作:

def read_excel_sheet(path_list):
    # 初始化新的工作簿
    new_excel = Workbook()
    
    for index, file_path in enumerate(path_list):
        print(f"处理第{index + 1}个文件:{file_path}")
        
        origin_excel = load_workbook(filename=file_path)
        origin_sheet_name = origin_excel.sheetnames
        
        # 创建新的工作表
        if index == 0:
            new_sheet = new_excel.active
            new_sheet.title = origin_sheet_name[0]
        else:
            new_sheet = new_excel.create_sheet(new_sheet_name=origin_sheet_name[index])
        
        # 清洗数据:去除重复行
        df = pd.read_excel(file_path, index_col=0)
        unique_df = df.drop_duplicates()
        
        # 写入清洗后的数据到工作表
        for row in unique_df.to_dict('records'):
            new_sheet.append(list(row.values()))
            
    save_path = save_file_name()
    new_excel.save(save_path)
    messagebox.showinfo('提示', '处理完成!')

通过以上扩展功能,我们可以将简单的Excel合并提升到更复杂的数据分析场景。希望这篇文章能够帮助大家更好地理解和应用Python在数据处理中的作用。

完整代码:

# -*- coding:   utf-8 -*-
# @Time     :   2023-02-11 11:45   
# @Author   :   Kyln.Wu
# @WeChat   :   laonong-000
# @FileName :   多个excel合并到一个文件的不同sheet.py
# @IDE      :   PyCharm
from openpyxl import load_workbook
from openpyxl import Workbook
from tkinter import filedialog
import tkinter as tk
from tkinter import messagebox


# 遍历读取excel文件名
def read_excel_files_path() -> list:
    root = tk.Tk()
    root.withdraw()
    f_path = list(filedialog.askopenfilenames())
    # print(f_path)
    return f_path


# 循环读取每一个excel里的sheet,并写入目标文件
def read_excel_sheet(path_list):
    save_path = save_file_name()
    new_excel = Workbook()
    for index, file_path in enumerate(path_list):
        new_sheet_name = file_path.rsplit('/', 1)[1].split('.')[0]
        print(new_sheet_name)
        origin_excel = load_workbook(filename=file_path)  # 读取原excel文件
        origin_sheet_name = origin_excel.sheetnames  # 获取sheet的名称
        # print(origin_sheet_name[0])
        origin_sheet = origin_excel[origin_sheet_name[0]]
        if index == 0:
            new_sheet = new_excel.active
            new_sheet.title = new_sheet_name
        else:
            new_sheet = new_excel.create_sheet(new_sheet_name)
        for row in origin_sheet.iter_rows():
            row_list = []
            for cell in row:
                row_list.append(cell.value)
            new_sheet.append(row_list)
        new_excel.save(f'{save_path}')
        messagebox.showinfo('提示', '合并完成!')


def save_file_name():
    messagebox.showinfo("第二步", "请选择要保存的文件名:")
    root = tk.Tk()
    root.withdraw()
    save_path = filedialog.asksaveasfilename()

    return save_path


if __name__ == '__main__':
    messagebox.showinfo("第一步", "选择要合并的所有excel文件:")
    path_list = read_excel_files_path()
    read_excel_sheet(path_list)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值