2025年4月14日 星期一 批量生成劳动合同PY代码
第一步:
建立劳动合同文档模板。
第二步:
整理表格数据。
第三步:
第四步:
查看文件
import tkinter as tk from tkinter import filedialog, messagebox from openpyxl import load_workbook import os import threading from docx import Document class WordDocumentGenerator: def __init__(self, root): self.root = root self.root.geometry("800x800") self.excel_file = None self.word_template = None self.output_dir = None self.stop_flag = False self.create_folders = tk.BooleanVar() self.prefix = tk.StringVar() self.suffix = tk.StringVar() self.selected_fields = [] font_style = ("微软雅黑", 12) # 创建 GUI 组件 tk.Label(root, text="选择 Excel 文件", font=font_style).pack(pady=10) self.excel_path_label = tk.Entry(root, width=50, state="readonly", font=font_style) self.excel_path_label.pack(pady=5) tk.Button(root, text="浏览", command=self.select_excel_file, font=font_style).pack(pady=5) tk.Label(root, text="选择 Word 模板", font=font_style).pack(pady=10) self.word_path_label = tk.Entry(root, width=50, state="readonly", font=font_style) self.word_path_label.pack(pady=5) tk.Button(root, text="浏览", command=self.select_word_template, font=font_style).pack(pady=5) tk.Label(root, text="选择输出目录", font=font_style).pack(pady=10) self.output_dir_label = tk.Entry(root, width=50, state="readonly", font=font_style) self.output_dir_label.pack(pady=5) tk.Button(root, text="浏览", command=self.select_output_directory, font=font_style).pack(pady=5) tk.Checkbutton(root, text="创建文件夹", variable=self.create_folders, font=font_style).pack(pady=10) tk.Label(root, text="前缀:", font=font_style).pack(pady=5) tk.Entry(root, textvariable=self.prefix, font=font_style).pack(pady=5) tk.Label(root, text="后缀:", font=font_style).pack(pady=5) tk.Entry(root, textvariable=self.suffix, font=font_style).pack(pady=5) tk.Button(root, text="生成 Word 文档", command=self.generate_word_docs, font=font_style).pack(pady=20) tk.Button(root, text="停止生成", command=self.stop_generating, font=font_style).pack(pady=10) def select_excel_file(self): self.excel_file = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx;*.xls")]) if self.excel_file: self.excel_path_label.config(state="normal") self.excel_path_label.delete(0, tk.END) self.excel_path_label.insert(0, self.excel_file) self.excel_path_label.config(state="readonly") def select_word_template(self): self.word_template = filedialog.askopenfilename(filetypes=[("Word files", "*.docx")]) if self.word_template: self.word_path_label.config(state="normal") self.word_path_label.delete(0, tk.END) self.word_path_label.insert(0, self.word_template) self.word_path_label.config(state="readonly") def select_output_directory(self): self.output_dir = filedialog.askdirectory() if self.output_dir: self.output_dir_label.config(state="normal") self.output_dir_label.delete(0, tk.END) self.output_dir_label.insert(0, self.output_dir) self.output_dir_label.config(state="readonly") def load_excel_fields(self, excel_file): workbook = load_workbook(excel_file) sheet = workbook.active headers = [cell.value for cell in sheet[1]] return headers def generate_word_docs(self): if not self.excel_file or not self.word_template or not self.output_dir: messagebox.showerror("错误", "请选择 Excel 文件、Word 模板和输出目录") return self.stop_flag = False threading.Thread(target=self.fill_word_from_excel, args=( self.excel_file, self.word_template, self.output_dir, self.create_folders.get(), self.prefix.get(), self.suffix.get(), self.load_excel_fields(self.excel_file))).start() def stop_generating(self): self.stop_flag = True def fill_word_from_excel(self, excel_file, word_template, output_dir, create_folders, prefix, suffix, selected_fields): workbook = load_workbook(excel_file) sheet = workbook.active template = Document(word_template) for row in sheet.iter_rows(min_row=2, values_only=True): if self.stop_flag: break data = dict(zip(selected_fields, row)) new_doc = Document(word_template) for paragraph in new_doc.paragraphs: for key, value in data.items(): if key in paragraph.text: for run in paragraph.runs: run.text = run.text.replace(key, str(value)) if create_folders: folder_name = os.path.join(output_dir, f"{prefix}{data.get(selected_fields[0], '')}{suffix}") os.makedirs(folder_name, exist_ok=True) output_path = os.path.join(folder_name, f"{prefix}{data.get(selected_fields[0], '')}{suffix}.docx") else: output_path = os.path.join(output_dir, f"{prefix}{data.get(selected_fields[0], '')}{suffix}.docx") new_doc.save(output_path) if __name__ == "__main__": root = tk.Tk() app = WordDocumentGenerator(root) root.mainloop()