2025年4月14日 星期一 批量生成劳动合同PY代码

一颗大白菜2个月前我的技能85

第一步:

建立劳动合同文档模板。

image.png

第二步:

整理表格数据。

image.png

第三步:

image.png

第四步:

查看文件

image.png

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


免责声明
如果您对本文有异议,请先阅读本站《免责声明》,如仍保持您个人观点可与本人联系。

相关文章

2025年 新政策医保补缴计算器

7178.5为目前的基数 长春目前统账结合646单建统筹358 新政策还按7178.5为例 长春统账结合为7178...

吉林省企业职工退休养老金智能核算与服务系统平台 授权企业名单

吉林省企业职工退休养老金智能核算与服务系统平台 授权企业名单

尊敬的用户:为了帮助企业员工更精准地规划退休生活,合理安排养老资金,我们正式推出新版养老金测算系统 2.0 版本(吉林省企业职工退休养老金智能核算与服务系统平台)。该系统经过精心研发与测试,在功能和算...

AI 优秀经办人 小程序上线。

AI 优秀经办人 小程序上线。

感谢大家的支持与信任。...

延迟退休计算器 法定退休年龄计算器 (无出生年月限制,可计算00后、10后数据)

说明:改革后法定退休年龄:男性高于63岁,按照63岁计算。女职工(工人):原50,现在上限55周岁,(管理)原58,现在上线58周岁。当年最低缴费年限:20年 按目前政策 高于20年,按20年计算。...

保险经办工作流.xmind

保险经办工作流.xmind

该思维导图围绕五险一金经办工作展开,内容全面、条理清晰,对于新人学习极具价值。它从基础概念切入,逐步深入到各项保险的具体经办流程、操作要点及政策依据,为新人搭建了系统的知识框架。...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

服务热线

18686626826

微信客服

微信客服

2025年度企业稳岗补贴公式查询系统
吉林省企业职工退休养老金智能核算与服务系统
×