excel拆分工具分享

查看 11|回复 0
作者:pymoji   
工作中偶尔用到的工具分享
✅ 使用说明
  • 支持 .xlsx 文件格式
  • 可以按指定列拆分 Excel 表格
  • 保留原始表格的格式(字体、填充、边框、对齐方式等)
  • 修复所有与 None 相关的样式错误(如 Fill, Font, Style)使用copy完成深度复制
  • 附带简单GUI(TK实现)放置于同文件夹下

    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()

    行号, 工作

  • 您需要登录后才可以回帖 登录 | 立即注册

    返回顶部