多个Excel文件合并到一个文件的不同工作表中的Python实现
在数据处理中,我们经常需要将多个Excel文件整合到同一个文件中以便后续分析或展示。本文将向大家介绍如何通过Python代码实现这一目标,并逐步解释代码的实现过程。
一、代码功能概述
该脚本的主要功能包括:
- 引导用户选择多个Excel文件。
- 将每个选择的Excel文件的内容分别写入到一个新的Excel文件的不同工作表中。
- 提供保存新文件的基本信息(如文件名)。
通过以上步骤,最终将所有选中的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
- 使用
tkinter
的file 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
- 使用
tkinter
的file dialog
组件引导用户设置保存路径。 - 返回用户指定的保存路径。
三、代码运行示例
- 启动Python脚本。
- 运行以下代码:
path_list = read_excel_files_path() if not path_list: print("请至少选择一个Excel文件") return read_excel_sheet(path_list)
- 用户依次选择多个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)