python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python拆分excel

python快速拆分excel文件中的所有sheet表的实用脚本

作者:Kyln.Wu

在数据处理、财务分析以及其他领域中,经常需要对大型Excel文件进行管理,本文将介绍如何使用Python编写一个脚本,可以将一个excel文件中的所有sheet表拆成单独的文件并保持表格的格式,需要的小伙伴可以了解下

引言

在数据处理、财务分析以及其他领域中,经常需要对大型Excel文件进行管理。一个常见的需求是将包含多个工作表(或称工作簿)的Excel文件拆分成独立的Excel文件,以便于后续操作和管理。本文将介绍如何使用Python编写一个脚本,实现这一功能,并详细解释代码的功能、应用场景以及如何对其进行扩展。

代码解析

1.导入必要的库

from tkinter import filedialog, messagebox

这里导入了tkinter库中的filedialogmessagebox模块,用于创建用户界面组件(如文件选择框)和显示提示信息。

2.定义打开文件的函数 open_file()

def open_file():
    root = tk.Tk()
    root.withdraw()
    f_path = filedialog.askopenfilename()
    return f_path

该函数使用tkinter中的askopenfilename()方法创建一个文件选择框,用户可以选择任意Excel文件。调用root.withdraw()后隐藏主窗口,返回用户的选中路径。

3.定义处理工作表并拆分的函数 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}")

这部分代码的主要逻辑包括:

应用场景

该脚本适用于以下情况:

扩展与改写

1.增加更多功能

2.优化性能

3.界面改进

完整代码

# -*- 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)

总结

该Python脚本通过简单的循环和文件操作实现了将Excel工作簿中的所有工作表拆分成独立文件的功能。尽管代码较为基础,但对于处理需要独立工作表的场景来说已经足够。通过增加更多的功能和优化性能,可以进一步提升脚本的应用价值。

到此这篇关于python快速拆分excel文件中的所有sheet表的实用脚本的文章就介绍到这了,更多相关python拆分excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文