✅ 使用说明
import openpyxl
from openpyxl.utils import get_column_letter
import os
import collections
from copy import copy
class splitExcel(object):
def __init__(self, sourceFile, titleLine=None, splitColumn=None):
self.sourceFile = sourceFile
self.sourceWorkbook = openpyxl.load_workbook(sourceFile)
self.targetWorkbook = openpyxl.Workbook()
self.targetWorkbook.remove(self.targetWorkbook.active)
# 源工作表(object对象)
self.sourceWorksheet = None
# 最大行数
self.sourceWorkbookMaxRow = None
# 最大列数
self.sourceWorkbookMaxColumn = None
# 源工作表索引号
self.sourceWorksheetIndex = None
# 标题所在行号,用户输入时索引从1开始,内部处理时请留意索引数
self.titleLine = titleLine
# 根据哪个列进行拆分,用户输入时索引从1开始,内部处理时请留意索引数
self.splitColumn = splitColumn
# 表头文字
self.header = []
# 各表数据
self.data = collections.OrderedDict()
# 样式信息
self.formats = {}
def readData(self):
ws = self.sourceWorkbook.worksheets[self.sourceWorksheetIndex]
for row in ws.iter_rows():
values = [cell.value for cell in row]
if row[0].row
附带的GUI程序
请把上面的py文件保存为 splitExcel.py 这个名字,或者自己修改下面的代码
import tkinter as tk
from tkinter import filedialog, messagebox, simpledialog
from splitExcel import splitExcel, saveWorksheetToWorkbook # 假设你的原脚本名为 splitExcel.py
class ExcelSplitterGUI:
def __init__(self, root):
self.root = root
self.root.title("Excel 拆分工具")
self.root.geometry("500x400")
self.root.resizable(False, False)
# 初始化变量
self.file_path = tk.StringVar()
self.title_line = tk.IntVar(value=2)
self.split_column = tk.IntVar(value=2)
self.create_widgets()
def create_widgets(self):
# 文件选择框
tk.Label(self.root, text="Excel 文件路径:").pack(pady=5)
tk.Entry(self.root, textvariable=self.file_path, width=50).pack(pady=5)
tk.Button(self.root, text="浏览", command=self.select_file).pack(pady=5)
# 标题行输入
tk.Label(self.root, text="标题行号(从1开始):").pack(pady=5)
tk.Entry(self.root, textvariable=self.title_line, width=10).pack(pady=5)
# 拆分列输入
tk.Label(self.root, text="拆分列号(从1开始):").pack(pady=5)
tk.Entry(self.root, textvariable=self.split_column, width=10).pack(pady=5)
# 开始按钮
tk.Button(self.root, text="开始拆分", command=self.run_split).pack(pady=20)
# 日志输出区域
self.log_text = tk.Text(self.root, height=10, width=60, state='disabled')
self.log_text.pack(pady=10)
def select_file(self):
file_path = filedialog.askopenfilename(
filetypes=[("Excel files", "*.xlsx *.xls")]
)
if file_path:
self.file_path.set(file_path)
def log(self, message):
self.log_text.config(state='normal')
self.log_text.insert(tk.END, message + "\n")
self.log_text.config(state='disabled')
self.log_text.see(tk.END)
self.root.update_idletasks()
def run_split(self):
file_path = self.file_path.get()
if not file_path:
messagebox.showwarning("警告", "请选择一个 Excel 文件!")
return
title_line = self.title_line.get()
split_column = self.split_column.get()
try:
self.log("开始初始化...")
splitter = splitExcel(file_path, title_line, split_column)
self.log("选择工作表...")
splitter.selectSplitSheet() # 可以根据需要优化为自动选第一个表
self.log("读取数据...")
splitter.readData()
self.log("读取格式...")
splitter.readCellsStyle()
self.log("写入数据...")
splitter.writeDataToNewWorkbook()
self.log("写入格式...")
splitter.writeFormatToNewWorkbook()
self.log("保存文件...")
output_file = splitter.save()
self.log(f"拆分汇总文件已保存至:{output_file}")
self.log("正在保存每个子表为独立文件...")
saver = saveWorksheetToWorkbook(output_file)
folder = saver.saveTo(savePath=None)
self.log(f"拆分表保存文件夹:{folder}")
messagebox.showinfo("完成", "拆分已完成!")
except Exception as e:
messagebox.showerror("错误", str(e))
self.log(f"发生错误:{str(e)}")
if __name__ == "__main__":
root = tk.Tk()
app = ExcelSplitterGUI(root)
root.mainloop()