python快速拆分excel文件中的所有sheet表的實(shí)用腳本
引言
在數(shù)據(jù)處理、財(cái)務(wù)分析以及其他領(lǐng)域中,經(jīng)常需要對(duì)大型Excel文件進(jìn)行管理。一個(gè)常見的需求是將包含多個(gè)工作表(或稱工作簿)的Excel文件拆分成獨(dú)立的Excel文件,以便于后續(xù)操作和管理。本文將介紹如何使用Python編寫一個(gè)腳本,實(shí)現(xiàn)這一功能,并詳細(xì)解釋代碼的功能、應(yīng)用場(chǎng)景以及如何對(duì)其進(jìn)行擴(kuò)展。
代碼解析
1.導(dǎo)入必要的庫(kù)
from tkinter import filedialog, messagebox
這里導(dǎo)入了tkinter庫(kù)中的filedialog和messagebox模塊,用于創(chuàng)建用戶界面組件(如文件選擇框)和顯示提示信息。
2.定義打開文件的函數(shù) open_file()
def open_file():
root = tk.Tk()
root.withdraw()
f_path = filedialog.askopenfilename()
return f_path
該函數(shù)使用tkinter中的askopenfilename()方法創(chuàng)建一個(gè)文件選擇框,用戶可以選擇任意Excel文件。調(diào)用root.withdraw()后隱藏主窗口,返回用戶的選中路徑。
3.定義處理工作表并拆分的函數(shù) sheet2excel()
獲取保存路徑:通過再次使用tkinter中的組件創(chuàng)建一個(gè)對(duì)話框,允許用戶指定保存的目標(biāo)目錄。
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()提示用戶當(dāng)前處理的情況。
messagebox.showinfo('提示', f'一共有{len(origin_sheet_names)}個(gè)sheet,名稱分別為:{origin_sheet_names}\n拆分開始')
處理每個(gè)工作表并保存為單獨(dú)文件:
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)
# 調(diào)整工作表名稱字段
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"你的文件只有一個(gè)sheet,難道還要拆分嗎?你的文件名{file_path}")
這部分代碼的主要邏輯包括:
- 遍歷每個(gè)工作表
- 復(fù)制工作表并將其命名為當(dāng)前工作表的名稱
- 刪除多余的工作表
- 保存到指定目錄,并調(diào)整工作表名稱字段以確保文件名正確
應(yīng)用場(chǎng)景
該腳本適用于以下情況:
- 大型Excel文件處理:當(dāng)需要將包含多個(gè)工作表的大文件拆分成獨(dú)立的小文件以便管理或?qū)肫渌到y(tǒng)。
- 自動(dòng)化數(shù)據(jù)遷移:在自動(dòng)化工作中,經(jīng)常需要將處理后的數(shù)據(jù)保存到特定目錄中。此腳本可以作為基礎(chǔ),結(jié)合自動(dòng)化流程使用。
- 數(shù)據(jù)清洗與分析:對(duì)多個(gè)工作表分別進(jìn)行清洗和分析后,可能需要將結(jié)果分開存儲(chǔ)以便后續(xù)操作。
擴(kuò)展與改寫
1.增加更多功能:
- 添加錯(cuò)誤處理模塊,以捕捉在復(fù)制或保存過程中可能出現(xiàn)的錯(cuò)誤。
- 支持其他格式文件(如CSV、TXT等)的轉(zhuǎn)換。
- 提供批量處理選項(xiàng),例如按名稱或擴(kuò)展名分類工作表。
2.優(yōu)化性能:
- 使用
xlrd庫(kù)或其他高效的Excel解析庫(kù)來(lái)提高讀取速度。 - 添加日志記錄功能,以追蹤處理過程中的每一步操作,便于調(diào)試和監(jiān)控。
3.界面改進(jìn):
- 將現(xiàn)有代碼整合到一個(gè)完整的GUI應(yīng)用程序中,增加更多的用戶交互選項(xiàng)(如可以選擇保存格式、顏色調(diào)整等)。
- 提供多語(yǔ)言支持或國(guó)際化字符串。
完整代碼
# -*- coding: utf-8 -*-
# @Time : 2023-02-11 10:25
# @Author : Kyln.Wu
# @Email : kylnwu@qq.com
# @FileName : 把一個(gè)工作簿里的所有sheet拆分為單獨(dú)文件.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("第二步", "請(qǐng)選擇保存的文件夾:")
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)}個(gè)sheet,名稱分別為:{origin_sheet_names}\n拆分開始')
if len(origin_sheet_names) > 1: # 如果sheetnames小于1,報(bào)錯(cuò):該文件不需要拆分
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' # 新建一個(gè)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字段,這里做個(gè)調(diào)整
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"你的文件只有一個(gè)sheet,難道還要拆分嗎?你的文件名{file_path}")
if __name__ == '__main__':
messagebox.showinfo("第一步", "選擇要拆解的excel文件:")
path = open_file()
sheet2excel(path)
總結(jié)
該P(yáng)ython腳本通過簡(jiǎn)單的循環(huán)和文件操作實(shí)現(xiàn)了將Excel工作簿中的所有工作表拆分成獨(dú)立文件的功能。盡管代碼較為基礎(chǔ),但對(duì)于處理需要獨(dú)立工作表的場(chǎng)景來(lái)說(shuō)已經(jīng)足夠。通過增加更多的功能和優(yōu)化性能,可以進(jìn)一步提升腳本的應(yīng)用價(jià)值。
到此這篇關(guān)于python快速拆分excel文件中的所有sheet表的實(shí)用腳本的文章就介紹到這了,更多相關(guān)python拆分excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中的Joblib庫(kù)使用學(xué)習(xí)總結(jié)
這篇文章主要介紹了Python中的Joblib庫(kù)使用學(xué)習(xí)總結(jié),Joblib是一組在Python中提供輕量級(jí)流水線的工具,Joblib已被優(yōu)化得很快速,很健壯了,特別是在大數(shù)據(jù)上,并對(duì)numpy數(shù)組進(jìn)行了特定的優(yōu)化,需要的朋友可以參考下2023-08-08
Python通過OpenCV的findContours獲取輪廓并切割實(shí)例
這篇文章主要介紹了Python通過OpenCV的findContours獲取輪廓并切割實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Python Opencv任意形狀目標(biāo)檢測(cè)并繪制框圖
這篇文章主要為大家詳細(xì)介紹了Python Opencv任意形狀目標(biāo)檢測(cè),并繪制框圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
Python使用Yagmail庫(kù)實(shí)現(xiàn)自動(dòng)化郵件營(yíng)銷
在數(shù)字營(yíng)銷領(lǐng)域,自動(dòng)化郵件營(yíng)銷是一種高效、低成本的方式,能夠幫助企業(yè)與客戶保持溝通,提升品牌忠誠(chéng)度,而Yagmail是一個(gè)簡(jiǎn)潔且功能強(qiáng)大的Python庫(kù),可以大大簡(jiǎn)化郵件發(fā)送的過程,本文將詳細(xì)介紹如何使用Yagmail庫(kù)來(lái)實(shí)現(xiàn)自動(dòng)化郵件營(yíng)銷,需要的朋友可以參考下2024-12-12
Python正則表達(dá)式中的量詞符號(hào)與組問題小結(jié)
這篇文章主要介紹了Python正則表達(dá)式中的量詞符號(hào)與組問題小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
快速解決jupyter notebook啟動(dòng)需要密碼的問題
這篇文章主要介紹了快速解決jupyter notebook啟動(dòng)需要密碼的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-04-04

