利用PyQT制作一款word文件生成器

478 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

有时候需要请假,很多时候请假的模板是真的需要花费时间来制作,于是呢一款自动生成word格式的申请单就显得非常重要了。

使用PyQT设计的界面非常简单,布局如下,只需要在界面中填写自己的基本信息,然后点击提交即可一键生成需要的模板,而且模板的格式还可以在代码中进行微调。

image.png 界面代码如下

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(423, 517)
        self.formLayoutWidget = QtWidgets.QWidget(Form)
        self.formLayoutWidget.setGeometry(QtCore.QRect(30, 70, 351, 411))
        self.formLayoutWidget.setObjectName("formLayoutWidget")
        self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
        self.formLayout.setContentsMargins(0, 0, 0, 0)
        self.formLayout.setObjectName("formLayout")
        self.label = QtWidgets.QLabel(self.formLayoutWidget)
        self.label.setObjectName("label")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
        self.lineEdit = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit.setObjectName("lineEdit")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit)
        self.label_2 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_2.setObjectName("label_2")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_2)
        self.label_3 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_3.setObjectName("label_3")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_3)
        self.lineEdit_3 = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.lineEdit_3)
        self.label_4 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_4.setObjectName("label_4")
        self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_4)
        self.lineEdit_4 = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.lineEdit_4)
        self.label_5 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_5.setObjectName("label_5")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_5)
        self.lineEdit_5 = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit_5.setObjectName("lineEdit_5")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.lineEdit_5)
        self.label_6 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_6.setObjectName("label_6")
        self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_6)
        self.lineEdit_6 = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit_6.setObjectName("lineEdit_6")
        self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.lineEdit_6)
        self.label_7 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_7.setObjectName("label_7")
        self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.label_7)
        self.lineEdit_7 = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit_7.setObjectName("lineEdit_7")
        self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.lineEdit_7)
        self.label_8 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_8.setObjectName("label_8")
        self.formLayout.setWidget(7, QtWidgets.QFormLayout.LabelRole, self.label_8)
        self.lineEdit_8 = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit_8.setObjectName("lineEdit_8")
        self.formLayout.setWidget(7, QtWidgets.QFormLayout.FieldRole, self.lineEdit_8)
        self.label_9 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_9.setObjectName("label_9")
        self.formLayout.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.label_9)
        self.lineEdit_9 = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit_9.setObjectName("lineEdit_9")
        self.formLayout.setWidget(8, QtWidgets.QFormLayout.FieldRole, self.lineEdit_9)
        self.label_10 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_10.setObjectName("label_10")
        self.formLayout.setWidget(9, QtWidgets.QFormLayout.LabelRole, self.label_10)
        self.lineEdit_10 = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit_10.setObjectName("lineEdit_10")
        self.formLayout.setWidget(9, QtWidgets.QFormLayout.FieldRole, self.lineEdit_10)
        self.label_11 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_11.setObjectName("label_11")
        self.formLayout.setWidget(10, QtWidgets.QFormLayout.LabelRole, self.label_11)
        self.lineEdit_11 = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit_11.setObjectName("lineEdit_11")
        self.formLayout.setWidget(10, QtWidgets.QFormLayout.FieldRole, self.lineEdit_11)
        self.label_12 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_12.setObjectName("label_12")
        self.formLayout.setWidget(11, QtWidgets.QFormLayout.LabelRole, self.label_12)
        self.lineEdit_12 = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit_12.setObjectName("lineEdit_12")
        self.formLayout.setWidget(11, QtWidgets.QFormLayout.FieldRole, self.lineEdit_12)
        self.label_13 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_13.setObjectName("label_13")
        self.formLayout.setWidget(12, QtWidgets.QFormLayout.LabelRole, self.label_13)
        self.lineEdit_13 = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.lineEdit_13.setObjectName("lineEdit_13")
        self.formLayout.setWidget(12, QtWidgets.QFormLayout.FieldRole, self.lineEdit_13)
        self.label_14 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_14.setObjectName("label_14")
        self.formLayout.setWidget(13, QtWidgets.QFormLayout.LabelRole, self.label_14)
        self.textEdit = QtWidgets.QTextEdit(self.formLayoutWidget)
        self.textEdit.setObjectName("textEdit")
        self.formLayout.setWidget(13, QtWidgets.QFormLayout.FieldRole, self.textEdit)
        self.label_15 = QtWidgets.QLabel(Form)
        self.label_15.setGeometry(QtCore.QRect(40, 10, 351, 51))
        font = QtGui.QFont()
        font.setPointSize(16)
        self.label_15.setFont(font)
        self.label_15.setAlignment(QtCore.Qt.AlignCenter)
        self.label_15.setObjectName("label_15")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(170, 490, 75, 23))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Form)
        self.pushButton.clicked.connect(Form.submit)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "姓名:"))
        self.label_2.setText(_translate("Form", "院系:"))
        self.label_3.setText(_translate("Form", "专业:"))
        self.label_4.setText(_translate("Form", "事项:"))
        self.label_5.setText(_translate("Form", "性别:"))
        self.label_6.setText(_translate("Form", "学号:"))
        self.label_7.setText(_translate("Form", "在校起始年:"))
        self.label_8.setText(_translate("Form", "在校起始月:"))
        self.label_9.setText(_translate("Form", "在校截至年:"))
        self.label_10.setText(_translate("Form", "在校截至月:"))
        self.label_11.setText(_translate("Form", "家庭通讯地址:"))
        self.label_12.setText(_translate("Form", "个人联系方式:"))
        self.label_13.setText(_translate("Form", "家庭联系方式:"))
        self.label_14.setText(_translate("Form", "本人申请理由:"))
        self.label_15.setText(_translate("Form", "word模板生成器"))
        self.pushButton.setText(_translate("Form", "提交"))

主处理代码如下

from untitled import Ui_Form
from docx import Document
from docx.shared import Inches, Pt
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH
import time,datetime
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys


class MainWindow(QMainWindow, Ui_Form):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent=parent)
        self.setupUi(self)

    def submit(self):
        name = self.lineEdit.text()
        departments = self.lineEdit_2.text()
        specialty = self.lineEdit_3.text()
        class_name = self.lineEdit_4.text()
        gender = self.lineEdit_5.text()
        school_num = self.lineEdit_6.text()
        school_time_year = self.lineEdit_7.text()
        school_time_month = self.lineEdit_8.text()
        school_time_year1 = self.lineEdit_9.text()
        school_time_month1 = self.lineEdit_10.text()
        home_address = self.lineEdit_11.text()
        personal_tel = self.lineEdit_12.text()
        home_num = self.lineEdit_13.text()
        reason = self.textEdit.toPlainText()

        nt = datetime.datetime.now()
        document = Document()
        document.styles['Normal'].font.name = u'宋体'
        document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
        p = document.add_paragraph()
        p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
        r = p.add_run(departments + '\r' + class_name + "申请表")
        r.font.size = Pt(16)
        r.bold = True

        table = document.add_table(rows=37, cols=13, style='Table Grid')
        table.autofit = False
        table.columns[0].width = Inches(0.49)
        table.cell(0, 0).merge(table.cell(2, 2))
        table.cell(0, 3).merge(table.cell(2, 6))
        table.cell(0, 7).merge(table.cell(2, 9))
        table.cell(0, 10).merge(table.cell(2, 12))
        table.cell(3, 0).merge(table.cell(5, 2))
        table.cell(3, 3).merge(table.cell(5, 5))
        table.cell(3, 6).merge(table.cell(5, 6))
        table.cell(3, 7).merge(table.cell(5, 9))
        table.cell(3, 10).merge(table.cell(5, 10))
        table.cell(3, 11).merge(table.cell(5, 12))
        table.cell(6, 0).merge(table.cell(8, 2))
        table.cell(6, 3).merge(table.cell(8, 12))
        table.cell(9, 0).merge(table.cell(14, 2))
        table.cell(9, 3).merge(table.cell(14, 6))
        table.cell(9, 7).merge(table.cell(11, 9))
        table.cell(12, 7).merge(table.cell(14, 9))
        table.cell(9, 10).merge(table.cell(11, 12))
        table.cell(12, 10).merge(table.cell(14, 12))
        table.cell(15, 0).merge(table.cell(20, 2))
        table.cell(15, 3).merge(table.cell(20, 12))
        table.cell(21, 0).merge(table.cell(26, 2))
        table.cell(21, 3).merge(table.cell(26, 12))
        table.cell(27, 0).merge(table.cell(31, 2))
        table.cell(27, 3).merge(table.cell(31, 12))
        table.cell(32, 0).merge(table.cell(36, 2))
        table.cell(32, 3).merge(table.cell(36, 12))
        hdr_cells0 = table.rows[0].cells
        hdr_cells3 = table.rows[3].cells
        hdr_cells6 = table.rows[6].cells
        hdr_cells9 = table.rows[9].cells
        hdr_cells12 = table.rows[12].cells
        hdr_cells15 = table.rows[15].cells
        hdr_cells21 = table.rows[21].cells
        hdr_cells27 = table.rows[27].cells
        hdr_cells32 = table.rows[32].cells

        hdr_cells0[0].add_paragraph('院(系)\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells0[3].add_paragraph(departments + '院').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells0[7].add_paragraph('专业班级').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells0[10].add_paragraph(specialty).alignment = WD_ALIGN_PARAGRAPH.CENTER

        hdr_cells3[0].add_paragraph('姓名\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells3[3].add_paragraph(name).alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells3[6].add_paragraph('性别').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells3[7].add_paragraph(gender).alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells3[10].add_paragraph('学号').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells3[11].add_paragraph(school_num).alignment = WD_ALIGN_PARAGRAPH.CENTER

        hdr_cells6[0].add_paragraph('在校时间\n').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells6[3].add_paragraph(
            school_time_year + '年' + school_time_month + '月——' + school_time_year1 + '年' + school_time_month1 + '月').alignment = WD_ALIGN_PARAGRAPH.CENTER

        hdr_cells9[0].add_paragraph('家庭通讯地址').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells9[3].add_paragraph(home_address).alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells9[7].add_paragraph('家庭联系方式').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells12[7].add_paragraph('个人联系方式').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells9[10].add_paragraph(home_num).alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells12[10].add_paragraph(personal_tel).alignment = WD_ALIGN_PARAGRAPH.CENTER

        hdr_cells15[0].add_paragraph('\n\n本人申请理由').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells15[3].add_paragraph(reason + '\n\n学生本人签名:' + '\n\n\t\t年\t月\t日').alignment = WD_ALIGN_PARAGRAPH.CENTER

        hdr_cells21[0].add_paragraph('\n\n院系领导意见').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells21[3].add_paragraph('\n\n领导签字:' + '\n\n\t\t年\t月\t日').alignment = WD_ALIGN_PARAGRAPH.CENTER

        hdr_cells27[0].add_paragraph('\n\n学生处意见').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells27[3].add_paragraph('\n\n领导签字:' + '\n\n\t\t年\t月\t日').alignment = WD_ALIGN_PARAGRAPH.CENTER

        hdr_cells32[0].add_paragraph('\n\n主管校领导审批').alignment = WD_ALIGN_PARAGRAPH.CENTER
        hdr_cells32[3].add_paragraph('\n\n领导签字:' + '\n\n\t\t年\t月\t日').alignment = WD_ALIGN_PARAGRAPH.CENTER
        document.save(name + '申请表.docx')


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

运行代码,在编辑框中依次输入下面的信息。 image.png

点击提交后可以得到下面的word文档,直接生成了完整的格式,避免我们在word中反复调整。

image.png