

Python速成心法
敲代码,查资料,问Ai
练习,探索,总结,优化

★★★★★博文创作不易,源码代码的过程中,如有疑问的地方,欢迎大家指正留言交流。喜欢的老铁可以多多点赞+收藏分享+置顶,小红牛在此表示感谢。★★★★★
office办公python代码:reportlab模块参数的用法及示例
office办公python代码:PDF书籍封面生成器1.0(tk+reportlab)
office办公python代码:批量对所有.pdf文件生成水印(pypdf+reportlab)

↓ 完整源码如下 ↓
# -*- coding: utf-8 -*-# @Author : 小红牛# 微信公众号:wdPythonimport osimport tkinter as tkfrom tkinter import ttk, messagebox, filedialogimport pandas as pdclass ExcelMergerApp:def __init__(self, root):self.root = rootself.root.title("Excel 文件合并工具")self.root.geometry("900x600")# 存储合并后的 DataFrameself.df = None# ---------- 顶部控制区域 ----------control_frame = tk.Frame(root)control_frame.pack(pady=10, fill=tk.X)# 文件夹选择self.folder_path = tk.StringVar()self.folder_entry = tk.Entry(control_frame, textvariable=self.folder_path, width=30)self.folder_entry.pack(side=tk.LEFT, padx=5)self.browse_btn = tk.Button(control_frame, text="浏览ex文件夹", command=self.browse_folder)self.browse_btn.pack(side=tk.LEFT, padx=5)# 保存文件名(不带后缀)tk.Label(control_frame, text="保存文件名:").pack(side=tk.LEFT, padx=5)self.filename_entry = tk.Entry(control_frame, width=20)self.filename_entry.pack(side=tk.LEFT, padx=5)self.filename_entry.insert(0, "合并结果") # 默认名称,不含扩展名# 读取+合并保存按钮self.merge_save_btn = tk.Button(control_frame, text="excel合并+保存", command=self.merge_and_save)self.merge_save_btn.pack(side=tk.LEFT, padx=10)# ---------- Treeview 及滚动条 ----------tree_frame = tk.Frame(root)tree_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)# 树形区域先写滚动条,再写组件绑定v_scrollbar = ttk.Scrollbar(tree_frame, orient=tk.VERTICAL)v_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)self.tree = ttk.Treeview(tree_frame, show='tree', yscrollcommand=v_scrollbar.set)self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)v_scrollbar.config(command=self.tree.yview)# ---------- 状态栏 ----------self.status = tk.Label(root, text="就绪", bd=1, relief=tk.SUNKEN, anchor=tk.W)self.status.pack(side=tk.BOTTOM, fill=tk.X)def browse_folder(self):"""弹出文件夹选择对话框,将路径填入输入框"""folder_selected = filedialog.askdirectory()if folder_selected:self.folder_path.set(folder_selected)def merge_and_save(self):"""读取选定文件夹下所有 Excel,按文本格式合并,并立即保存"""folder = self.folder_path.get().strip()if not folder:messagebox.showerror("错误", "请先选择文件夹!")self.status.config(text="错误:未选择文件夹")returnif not os.path.exists(folder):messagebox.showerror("错误", f"文件夹 '{folder}' 不存在!")self.status.config(text="错误:文件夹不存在")return# 查找所有 Excel 文件(排除临时文件)excel_files = []for f in os.listdir(folder):if f.lower().endswith(('.xlsx', '.xls')):full_path = os.path.join(folder, f)if not os.path.basename(full_path).startswith("~$"):excel_files.append(full_path)if not excel_files:messagebox.showwarning("警告", f"文件夹 '{folder}' 中没有找到 Excel 文件!")self.status.config(text="警告:没有 Excel 文件")returntry:dfs = []for file in excel_files:# 使用 dtype=str 强制所有列按文本读取,保留前导零if file.endswith('.xlsx'):df = pd.read_excel(file, engine='openpyxl', dtype=str)else:df = pd.read_excel(file, engine='xlrd', dtype=str)dfs.append(df)# 纵向合并(按行拼接)self.df = pd.concat(dfs, ignore_index=True, sort=False)# 更新 Treeview 显示self.update_treeview()# 保存文件(自动添加 .xlsx 后缀)filename = self.filename_entry.get().strip()if not filename:filename = "合并结果"if not filename.lower().endswith('.xlsx'):filename += '.xlsx'self.df.to_excel(filename, index=False, engine='openpyxl')messagebox.showinfo("成功",f"合并并保存成功!共 {len(self.df)} 行,来自 {len(excel_files)} 个文件\n保存至:{filename}")self.status.config(text=f"合并保存成功:{filename}")except Exception as e:messagebox.showerror("错误", f"合并或保存失败:{str(e)}")self.status.config(text="操作失败")def update_treeview(self):"""根据 self.df 更新 Treeview 表格"""if self.df is None or self.df.empty:self.tree.delete(*self.tree.get_children())return# 清空旧数据self.tree.delete(*self.tree.get_children())# 设置列columns = list(self.df.columns)self.tree["columns"] = columnsself.tree["show"] = "headings"# 设置列标题和自适应宽度for col in columns:self.tree.heading(col, text=col)# 简单计算列宽:标题长度和内容最大长度取较大值max_len = max(len(str(col)), self.df[col].astype(str).map(len).max())self.tree.column(col, width=min(max_len * 10, 300), anchor="w")# 插入数据行for idx, row in self.df.iterrows():values = [row[col] for col in columns]self.tree.insert("", tk.END, values=values)if __name__ == "__main__":root = tk.Tk()app = ExcelMergerApp(root)root.mainloop()
完毕!!感谢您的收看
------★★历史博文集合★★------

夜雨聆风