将一个工作簿中的所有工作表拆分为单独文件的Python脚本解析与应用指南
引言
在数据处理、财务分析以及其他领域中,经常需要对大型Excel文件进行管理。一个常见的需求是将包含多个工作表(或称工作簿)的Excel文件拆分成独立的Excel文件,以便于后续操作和管理。本文将介绍如何使用Python编写一个脚本,实现这一功能,并详细解释代码的功能、应用场景以及如何对其进行扩展。
代码解析
-
导入必要的库
from tkinter import filedialog, messagebox
这里导入了
tkinter
库中的filedialog
和messagebox
模块,用于创建用户界面组件(如文件选择框)和显示提示信息。 -
定义打开文件的函数
open_file()
def open_file(): root = tk.Tk() root.withdraw() f_path = filedialog.askopenfilename() return f_path
该函数使用
tkinter
中的askopenfilename()
方法创建一个文件选择框,用户可以选择任意Excel文件。调用root.withdraw()
后隐藏主窗口,返回用户的选中路径。 -
定义处理工作表并拆分的函数
sheet2excel()
-
获取保存路径:通过再次使用
tkinter
中的组件创建一个对话框,允许用户指定保存的目标目录。def save_directory(): root = tk.Tk() root.withdraw() f_path = filedialog.askdirectory() return f_path
-
读取原Excel文件
origin_excel = load_workbook(filename=file_path) origin_sheet_names = origin_excel.sheetnames
使用
load_workbook()
方法读取Excel文件,并获取所有工作表(sheet)的名称。 -
显示提示信息:使用
messagebox.showinfo()
提示用户当前处理的情况。messagebox.showinfo('提示', f'一共有{len(origin_sheet_names)}个sheet,名称分别为:{origin_sheet_names}\n拆分开始')
-
处理每个工作表并保存为单独文件:
if len(origin_sheet_names) > 1: for j in range(len(origin_sheet_names)): wb = load_workbook(filename=file_path) sheet = wb[origin_sheet_names[j]] wb.copy_worksheet(sheet) new_filename = origin_sheet_names[j] + '.xlsx' # 删除多余的工作表 for i in range(len(origin_sheet_names)): sheet1 = wb[origin_sheet_names[i]] wb.remove(sheet1) new_path = save_path + "/" + new_filename messagebox.showinfo('提示', f"{new_filename} 已保存到{save_path}") wb.save(filename=new_path) # 调整工作表名称字段 new = load_workbook(filename=new_path) news = new.active news.title = origin_sheet_names[j] new.save(filename=new_path) messagebox.showinfo('提示', '拆分完成!') else: raise Exception('提示', f"你的文件只有一个sheet,难道还要拆分吗?你的文件名{file_path}")
这部分代码的主要逻辑包括:
- 遍历每个工作表
- 复制工作表并将其命名为当前工作表的名称
- 删除多余的工作表
- 保存到指定目录,并调整工作表名称字段以确保文件名正确
-
应用场景
该脚本适用于以下情况:
- 大型Excel文件处理:当需要将包含多个工作表的大文件拆分成独立的小文件以便管理或导入其他系统。
- 自动化数据迁移:在自动化工作中,经常需要将处理后的数据保存到特定目录中。此脚本可以作为基础,结合自动化流程使用。
- 数据清洗与分析:对多个工作表分别进行清洗和分析后,可能需要将结果分开存储以便后续操作。
扩展与改写
-
增加更多功能:
- 添加错误处理模块,以捕捉在复制或保存过程中可能出现的错误。
- 支持其他格式文件(如CSV、TXT等)的转换。
- 提供批量处理选项,例如按名称或扩展名分类工作表。
-
优化性能:
- 使用
xlrd
库或其他高效的Excel解析库来提高读取速度。 - 添加日志记录功能,以追踪处理过程中的每一步操作,便于调试和监控。
- 使用
-
界面改进:
- 将现有代码整合到一个完整的GUI应用程序中,增加更多的用户交互选项(如可以选择保存格式、颜色调整等)。
- 提供多语言支持或国际化字符串。
总结
该Python脚本通过简单的循环和文件操作实现了将Excel工作簿中的所有工作表拆分成独立文件的功能。尽管代码较为基础,但对于处理需要独立工作表的场景来说已经足够。通过增加更多的功能和优化性能,可以进一步提升脚本的应用价值。
完整代码
# -*- coding: utf-8 -*-
# @Time : 2023-02-11 10:25
# @Author : Kyln.Wu
# @Email : kylnwu@qq.com
# @FileName : 把一个工作簿里的所有sheet拆分为单独文件.py
# @IDE : PyCharm
from openpyxl import load_workbook
from tkinter import filedialog
import tkinter as tk
from tkinter import messagebox
def open_file():
root = tk.Tk()
root.withdraw()
f_path = filedialog.askopenfilename()
return f_path
def sheet2excel(file_path):
# 先读取一次文件,获取sheet表的名称
messagebox.showinfo("第二步", "请选择保存的文件夹:")
def save_directory():
root = tk.Tk()
root.withdraw()
f_path = filedialog.askdirectory()
return f_path
save_path = save_directory()
origin_excel = load_workbook(filename=file_path) # 读取原excel文件
origin_sheet_names = origin_excel.sheetnames # 获取sheet的名称
messagebox.showinfo('提示', f'一共有{len(origin_sheet_names)}个sheet,名称分别为:{origin_sheet_names}\n拆分开始')
if len(origin_sheet_names) > 1: # 如果sheetnames小于1,报错:该文件不需要拆分
for j in range(len(origin_sheet_names)):
wb = load_workbook(filename=file_path) # 再读取一次文件,由于每次删除后需要保存一次,所以不能与上一次一样
sheet = wb[origin_sheet_names[j]]
wb.copy_worksheet(sheet)
new_filename = origin_sheet_names[j] + '.xlsx' # 新建一个sheet命名的excel文件
for i in range(len(origin_sheet_names)):
sheet1 = wb[origin_sheet_names[i]]
wb.remove(sheet1)
new_path = save_path + "/" + new_filename
messagebox.showinfo('提示', f"{new_filename} 已保存到{save_path}")
wb.save(filename=new_path)
# 由于使用copy_worksheet后,sheet表名有copy字段,这里做个调整
new = load_workbook(filename=new_path)
news = new.active
news.title = origin_sheet_names[j]
new.save(filename=new_path)
messagebox.showinfo('提示', '拆分完成!')
else:
raise Exception('提示', f"你的文件只有一个sheet,难道还要拆分吗?你的文件名{file_path}")
if __name__ == '__main__':
messagebox.showinfo("第一步", "选择要拆解的excel文件:")
path = open_file()
sheet2excel(path)