• python生成docx文件


    方法1

    使用python自动生成一张想要的docx文件
    在这其中有指纹和盖章

    from PIL import Image
    from docx import Document
    from docx.oxml.ns import qn
    from docx.shared import Pt, Inches, Cm
    from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
    from xlsxtpl.writerx import BookWriter
    
    def work_experience_word_file(user_info, zip_file_path, middle_name=""):
        """
        创建word文档
        @param user_info: 用户的基本信息
        @param zip_file_path: 压缩包地址信息
        @param middle_name: 为了满足成员附件导出的文件名
        """
        # 创建代表Word文档的Doc对象
        doc = Document()
        # 保存文档的地址
        doc.styles['Normal'].font.name = u'仿宋'
        doc.styles['Normal'].font.size = Pt(16)
        doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋')
    
        # 标题
        title_name = '个人从业经历承诺书'
        title_paragraph = doc.add_paragraph()
        title_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中对齐
        title_run = title_paragraph.add_run(title_name)
        title_run.bold = True  # 加粗
        title_run.font.size = Pt(22)
    
        # 换行
        wrap_str = ''
        doc.add_paragraph(wrap_str)
    
        # 身份信息的填充
        info_one = '本人'
        info_one_paragraph = doc.add_paragraph(info_one)
        user_name = info_one_paragraph.add_run(f' {user_info["name"]} ')
        user_name.underline = True  # 下划线
    
        info_one_paragraph.add_run('于')
    
        p_format = info_one_paragraph.paragraph_format
        p_format.first_line_indent = Inches(0.4)  # 首行缩进
        p_format.line_spacing = 1.5  # 设置行间距为 1.5
    
        work_start_time = user_info.get("work_start_time").split('-') if user_info.get("work_start_time") else ['', '']
        work_start_year = info_one_paragraph.add_run(f' {work_start_time[0]} ')
        work_start_year.underline = True  # 下划线
    
        info_two = '年'
        info_one_paragraph.add_run(info_two)
    
        work_start_month = info_one_paragraph.add_run(f' {work_start_time[1]} ')
        work_start_month.underline = True  # 下划线
    
        info_three = '月工作至今,现已从事'
        info_one_paragraph.add_run(info_three)
    
        work_place = info_one_paragraph.add_run(
            f' {user_info.get("operitem_str") if user_info.get("operitem_str", "") else user_info.get("job_class_str", "")} ')
        work_place.underline = True  # 下划线
    
        info_one_paragraph.add_run('相关工作')
    
        work_year = info_one_paragraph.add_run(f' {user_info.get("work_year", "")} ')
        work_year.underline = True  # 下划线
    
        info_one_paragraph.add_run('年。')
    
        # 换行
        wrap_str = ''
        doc.add_paragraph(wrap_str)
        # 换行
        wrap_str = ''
        doc.add_paragraph(wrap_str)
    
        # 培训单位公章
        info_five = doc.add_paragraph("承诺人:   ( 签名并盖手印 )")
        info_five_format = info_five.paragraph_format
        info_five_format.first_line_indent = Inches(0.8)  # 首行缩进
        p_format.line_spacing = 1.5  # 设置行间距为 1.5
        info_five.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
    
        # 签名和指纹的地址
        zw_seal_url = zip_file_path + '/' + user_info['name'] + '指纹文件'
        zw_path = zw_seal_url + '.png'
        if os.path.exists(zw_path):
            add_float_picture(info_five, zw_path, width=Cm(2.0), pos_x=Cm(15.1), pos_y=Cm(9.6))
        else:
            zw_path = zw_seal_url + '.jpg'
            if os.path.exists(zw_path):
                add_float_picture(info_five, zw_path, width=Cm(2.0), pos_x=Cm(15.1), pos_y=Cm(9.6))
    
        qm_seal_url = zip_file_path + '/' + user_info['name'] + '签名文件'
        qm_path = qm_seal_url + '.png'
        if os.path.exists(qm_path):
            add_float_picture(info_five, qm_path, width=Cm(3.0), pos_x=Cm(14.6), pos_y=Cm(9.6))
        else:
            qm_path = qm_seal_url + '.jpg'
            if os.path.exists(zw_path):
                add_float_picture(info_five, qm_path, width=Cm(3.0), pos_x=Cm(14.6), pos_y=Cm(9.6))
    
        # 换行
        wrap_str = ''
        doc.add_paragraph(wrap_str)
    
        # 盖章日期
        create_time_list = user_info['createTime'].split('-') if user_info['createTime'] else "   "
        create_time = f'{create_time_list[0]}{create_time_list[1]}{create_time_list[2]}日'
        doc.add_paragraph(create_time).alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT  # 右对齐
    
        word_file_path = zip_file_path + f'/{middle_name}{user_info["id_card"]}.docx'
    
    
    user_info = {"createTime": "", ...........}
    zip_file_path = 'E:/'
    work_experience_word_file(user_info, zip_file_path, middle_name="")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117

    方法2

    python 生成docx文件第二种方法

    from docx import Document
    
    def safe_produce_word(user_info, zip_file_path):
        """
        创建安全生产知识和管理能力考核申请表word文档
        @param user_info: 用户的基本信息
        @param zip_file_path: 压缩包地址信息
        """
        # 创建代表Word文档的Doc对象
        doc = Document()
        # 保存文档的地址
        doc.styles['Normal'].font.name = u'等线'
        doc.styles['Normal'].font.size = Pt(10)
        doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'等线')
    
        title_name = '安全生产知识和管理能力考核申请表'
        title_paragraph = doc.add_paragraph()
        title_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中对齐
        title_run = title_paragraph.add_run(title_name)
        title_run.bold = True  # 加粗
        title_run.font.size = Pt(21)
    
        # 生成学习表格
        table = doc.add_table(11, 8, style="Table Grid")
    
        # 设置行高
        table.rows[0].height = Cm(0.9)
        table.rows[1].height = Cm(0.9)
        table.rows[2].height = Cm(0.9)
        table.rows[3].height = Cm(0.7)
        table.rows[4].height = Cm(0.7)
        table.rows[5].height = Cm(0.7)
        table.rows[6].height = Cm(0.7)
        table.rows[7].height = Cm(0.7)
        table.rows[8].height = Cm(0.7)
    
        a = table.cell(0, 7)
        b = table.cell(2, 7)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(1, 1)
        b = table.cell(1, 6)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(0, 1)
        b = table.cell(0, 3)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(2, 1)
        b = table.cell(2, 3)
        # 合并a与b构成的长方形区域
        a.merge(b)
        a = table.cell(3, 1)
        b = table.cell(3, 3)
        # 合并a与b构成的长方形区域
        a.merge(b)
        a = table.cell(4, 1)
        b = table.cell(4, 3)
        # 合并a与b构成的长方形区域
        a.merge(b)
        a = table.cell(5, 1)
        b = table.cell(5, 3)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(0, 5)
        b = table.cell(0, 6)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(2, 5)
        b = table.cell(2, 6)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(3, 5)
        b = table.cell(3, 7)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(4, 5)
        b = table.cell(4, 7)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(5, 5)
        b = table.cell(5, 7)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(6, 1)
        b = table.cell(6, 7)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(7, 1)
        b = table.cell(7, 7)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(8, 1)
        b = table.cell(8, 7)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(9, 1)
        b = table.cell(9, 7)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        a = table.cell(10, 1)
        b = table.cell(10, 7)
        # 合并a与b构成的长方形区域
        a.merge(b)
    
        cell2 = table.cell(0, 0)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中设置
        paragraph.add_run('姓名')
        paragraph.paragraph_format.line_spacing = Pt(19)  # 设置行间距
    
        cell2 = table.cell(0, 1)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run(user_info['user_name'])
        paragraph.paragraph_format.line_spacing = Pt(19)  # 设置行间距
    
        cell2 = table.cell(0, 4)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中设置
        paragraph.add_run('性别')
        paragraph.paragraph_format.line_spacing = Pt(19)  # 设置行间距
    
        cell2 = table.cell(0, 5)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中设置
        paragraph.add_run(SEX_DICT.get(user_info['sex'], str(user_info['sex'])))
        paragraph.paragraph_format.line_spacing = Pt(19)  # 设置行间距
    
        cell2 = table.cell(1, 0)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中设置
        paragraph.add_run('家庭住址')
        paragraph.paragraph_format.line_spacing = Pt(19)  # 设置行间距
    
        cell2 = table.cell(1, 1)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run(user_info['address'])
        paragraph.paragraph_format.line_spacing = Pt(19)  # 设置行间距
    
        cell2 = table.cell(2, 0)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中设置
        paragraph.add_run('工作单位')
        paragraph.paragraph_format.line_spacing = Pt(19)  # 设置行间距
    
        cell2 = table.cell(2, 1)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run(user_info['company'])
        paragraph.paragraph_format.line_spacing = Pt(19)  # 设置行间距
    
        cell2 = table.cell(2, 4)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中设置
        paragraph.add_run('职务')
        paragraph.paragraph_format.line_spacing = Pt(19)  # 设置行间距
    
        cell2 = table.cell(2, 1)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run(user_info['duty'])
        paragraph.paragraph_format.line_spacing = Pt(19)  # 设置行间距
    
        cell2 = table.cell(3, 0)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中设置
        paragraph.add_run('身份证件类型')
        paragraph.paragraph_format.line_spacing = Pt(13)  # 设置行间距
    
        cell2 = table.cell(3, 1)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('\x20\x20\x20\x20\x20\x20身份证\x20\x20\x20\x20\x20\x20\x20\x20军官证\n\x20\x20\x20\x20\x20\x20护照\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20其他')
        paragraph.paragraph_format.line_spacing = Pt(13)  # 设置行间距
    
        cell2 = table.cell(3, 4)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('证件号码')
        paragraph.paragraph_format.line_spacing = Pt(21)  # 设置行间距
    
        cell2 = table.cell(3, 5)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run(user_info['id_card'])
        paragraph.paragraph_format.line_spacing = Pt(21)  # 设置行间距
    
        cell2 = table.cell(4, 0)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中设置
        paragraph.add_run('任现职时间')
        paragraph.paragraph_format.line_spacing = Pt(13)  # 设置行间距
    
        cell2 = table.cell(4, 1)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run(user_info['work_start_time'])
        paragraph.paragraph_format.line_spacing = Pt(21)  # 设置行间距
    
        cell2 = table.cell(4, 4)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('联系电话')
        paragraph.paragraph_format.line_spacing = Pt(21)  # 设置行间距
    
        cell2 = table.cell(4, 5)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run(user_info['mobile2'] if user_info['mobile2'] else user_info['mobile'])
        paragraph.paragraph_format.line_spacing = Pt(21)  # 设置行间距
    
        cell2 = table.cell(5, 0)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('申请类型')
        paragraph.paragraph_format.line_spacing = Pt(21)  # 设置行间距
    
        cell2 = table.cell(5, 1)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('\x20\x20\x20\x20\x20\x20初次申领\x20\x20\x20\x20\x20\x20\x20复审\n\x20\x20\x20\x20\x20\x20延期复审')
        paragraph.paragraph_format.line_spacing = Pt(13)  # 设置行间距
    
        cell2 = table.cell(5, 4)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('培训类型')
        paragraph.paragraph_format.line_spacing = Pt(21)  # 设置行间距
    
        cell2 = table.cell(5, 5)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('\x20\x20\x20\x20\x20\x20自主培训\x20\x20\x20\x20\x20\x20\x20\x20委托培训')
        paragraph.paragraph_format.line_spacing = Pt(21)  # 设置行间距
    
        cell2 = table.cell(6, 0)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('最高学历')
        paragraph.paragraph_format.line_spacing = Pt(21)  # 设置行间距
    
        cell2 = table.cell(6, 1)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('\x20\x20\x20\x20\x20\x20初中\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20中专或同等学历\x20\x20\x20\x20\x20\x20\x20\x20\x20专科或同等学历\n\x20\x20\x20\x20\x20\x20本科或同等学历\x20\x20\x20\x20\x20\x20\x20\x20\x20高中或同等学历\x20\x20\x20\x20\x20\x20\x20\x20\x20研究生及以上')
        paragraph.paragraph_format.line_spacing = Pt(13)  # 设置行间距
    
        cell2 = table.cell(7, 0)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('行业类别')
        paragraph.paragraph_format.line_spacing = Pt(45)  # 设置行间距
    
        cell2 = table.cell(7, 1)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('\x20\x20\x20\x20\x20\x20危险化学品生产单位\x20\x20\x20\x20\x20\x20\x20\x20\x20危险化学品经营单位\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20煤矿(    )'
                          '\n\x20\x20\x20\x20\x20\x20煤炭生产经营单位\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20金属非金属(    )\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20职业卫生'
                          '\n\x20\x20\x20\x20\x20\x20烟花爆竹生产单位\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20烟花爆竹经营单位\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20职业健康'
                          '\n\x20\x20\x20\x20\x20\x20金属冶炼(    )\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20陆上石油天然气开采单位'
                          '\n\x20\x20\x20\x20\x20\x20其他生产经营单位\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20一般行业生产经营单位')
        paragraph.paragraph_format.line_spacing = Pt(16)  # 设置行间距
    
        cell2 = table.cell(8, 0)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('人员类别')
        paragraph.paragraph_format.line_spacing = Pt(16)  # 设置行间距
    
        cell2 = table.cell(8, 1)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('\x20\x20\x20\x20\x20\x20主要负责人\x20\x20\x20\x20\x20\x20\x20\x20安全生产管理人员')
        paragraph.paragraph_format.line_spacing = Pt(16)  # 设置行间距
    
        cell2 = table.cell(9, 0)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('\n\n\n\n申请人承诺事项')
    
        # 报名的日期
        end_time_list = user_info.get("enter_time").split("-")
        end_time_str = f'{end_time_list[0]}{end_time_list[1]}{end_time_list[2]} 日'
    
        file_template_content = user_info["file_template_content"]
        promise_str = ''
        exam_str = ''
        if file_template_content:
            for one_template in file_template_content:
                if one_template.get('title') == '申请人承诺事项':
                    promise_str = one_template.get('content')
                if one_template.get('title') == '申请人参加安全培训情况':
                    exam_str = one_template.get('content')
    
        cell2 = table.cell(9, 1)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
    
        paragraph.add_run(f'\x20\x20\x20\x20{promise_str}')
        paragraph.add_run('\n\t\t\t\t承诺及申请人(签名并按指纹) :')
        paragraph.add_run(f'\n\t\t\t\t\t\t\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{end_time_str}')
        paragraph.paragraph_format.line_spacing = Pt(18)  # 设置行间距
    
        cell2 = table.cell(10, 0)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run('\n\n\n申请人参加安全培训情况(此栏由委托培训单位填写)')
    
        cell2 = table.cell(10, 1)
        paragraph = cell2.paragraphs[0]
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 居中设置
        paragraph.add_run(f'\x20\x20\x20\x20\x20\x20{exam_str}')
        paragraph.add_run(f'\n培训单位名称:  {user_info["organization_name"]}')
        paragraph.add_run(f'\n培训地点:  {user_info["organization_address"]}')
        paragraph.add_run(f'\n培训起止日期:  {user_info["start_time"]} ~ {user_info["end_time"]}  培训学时:  {int(user_info["study_times"]) + int(user_info["practical_times"])}学时')
        paragraph.add_run('\n培训单位负责人(签字) :\t\t\t\x20\x20\x20公章:')
        paragraph.add_run(f'\n\t\t\t\t\t\t\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{end_time_str}')
    
        paragraph.paragraph_format.line_spacing = Pt(18)  # 设置行间距
    
        info_four = '备注:申请人提交该申请表时,还应当提供本人的身份证复印件、学历证书复印件等有关材料,并签字按指纹予以确认。'
        info_four_paragraph = doc.add_paragraph()
        info_four_paragraph.paragraph_format.line_spacing = Pt(12)  # 设置行间距
        four_run = info_four_paragraph.add_run(info_four)
        four_run.font.size = Pt(8)
    
        # 选择狂图片的地址
        project_dir = os.path.abspath('.')
        select_icon_url = project_dir + '/app/static/default/select_icon.png'
        unselect_icon_url = project_dir + '/app/static/default/unselect_icon.png'
    
        # 标准照
        fzr_seal_url = zip_file_path + '/' + user_info['name'] + '标准照'
        bzz_icon_url = fzr_seal_url + '.png'
        if os.path.exists(bzz_icon_url):
            add_float_picture(info_four_paragraph, bzz_icon_url, width=Cm(1.88), pos_x=Cm(16.3), pos_y=Cm(3.91))
        else:
            bzz_icon_url = fzr_seal_url + '.jpg'
            if os.path.exists(bzz_icon_url):
                add_float_picture(info_four_paragraph, bzz_icon_url, width=Cm(1.88), pos_x=Cm(16.3), pos_y=Cm(3.91))
    
        # 身份证件类型
        id_type = user_info['id_type']
        id_card_icon_url = unselect_icon_url
        officer_icon_url = unselect_icon_url
        passport_icon_url = unselect_icon_url
        other_icon_url = unselect_icon_url
    
        if id_type == '身份证':
            id_card_icon_url = select_icon_url
        elif id_type == '军官证':
            officer_icon_url = select_icon_url
        elif id_type == '护照':
            passport_icon_url = select_icon_url
        else:
            other_icon_url = select_icon_url
        add_float_picture(info_four_paragraph, id_card_icon_url, width=Cm(0.3), pos_x=Cm(5.25), pos_y=Cm(6.71))
        add_float_picture(info_four_paragraph, officer_icon_url, width=Cm(0.3), pos_x=Cm(7.15), pos_y=Cm(6.71))
        add_float_picture(info_four_paragraph, passport_icon_url, width=Cm(0.3), pos_x=Cm(5.25), pos_y=Cm(7.16))
        add_float_picture(info_four_paragraph, other_icon_url, width=Cm(0.3), pos_x=Cm(7.15), pos_y=Cm(7.16))
    
        # 申请类型
        first_icon_url = unselect_icon_url
        second_icon_url = unselect_icon_url
        last_icon_url = unselect_icon_url
        train_type = user_info['train_type']
    
        if train_type == 0:
            first_icon_url = select_icon_url
        elif train_type == 1:
            second_icon_url = select_icon_url
        else:
            last_icon_url = select_icon_url
        add_float_picture(info_four_paragraph, first_icon_url, width=Cm(0.3), pos_x=Cm(5.2), pos_y=Cm(8.58))
        add_float_picture(info_four_paragraph, second_icon_url, width=Cm(0.3), pos_x=Cm(7.45), pos_y=Cm(8.58))
        add_float_picture(info_four_paragraph, last_icon_url, width=Cm(0.3), pos_x=Cm(5.2), pos_y=Cm(9.03))
    
        # 培训类型
        myself_icon_url = unselect_icon_url
        entrust_icon_url = unselect_icon_url
        training_mode = user_info['training_mode']
    
        if training_mode == '自主培训':
            myself_icon_url = select_icon_url
        else:
            entrust_icon_url = select_icon_url
        add_float_picture(info_four_paragraph, myself_icon_url, width=Cm(0.3), pos_x=Cm(12.82), pos_y=Cm(8.8))
        add_float_picture(info_four_paragraph, entrust_icon_url, width=Cm(0.3), pos_x=Cm(15.1), pos_y=Cm(8.8))
    
        # 最高学历
        educate_icon_url1 = unselect_icon_url
        educate_icon_url2 = unselect_icon_url
        educate_icon_url3 = unselect_icon_url
        educate_icon_url4 = unselect_icon_url
        educate_icon_url5 = unselect_icon_url
        educate_icon_url6 = unselect_icon_url
        education = user_info['education']
    
        if education == '初中':
            educate_icon_url1 = select_icon_url
        elif education == '中专或同等学历':
            educate_icon_url2 = select_icon_url
        elif education == '专科或同等学历':
            educate_icon_url3 = select_icon_url
        elif education == '本科或同等学历':
            educate_icon_url4 = select_icon_url
        elif education == '高中或同等学历':
            educate_icon_url5 = select_icon_url
        elif education == '研究生及以上':
            educate_icon_url6 = select_icon_url
        add_float_picture(info_four_paragraph, educate_icon_url1, width=Cm(0.3), pos_x=Cm(5.3), pos_y=Cm(9.52))
        add_float_picture(info_four_paragraph, educate_icon_url2, width=Cm(0.3), pos_x=Cm(8.71), pos_y=Cm(9.52))
        add_float_picture(info_four_paragraph, educate_icon_url3, width=Cm(0.3), pos_x=Cm(12.15), pos_y=Cm(9.52))
        add_float_picture(info_four_paragraph, educate_icon_url4, width=Cm(0.3), pos_x=Cm(5.3), pos_y=Cm(9.98))
        add_float_picture(info_four_paragraph, educate_icon_url5, width=Cm(0.3), pos_x=Cm(8.71), pos_y=Cm(9.98))
        add_float_picture(info_four_paragraph, educate_icon_url6, width=Cm(0.3), pos_x=Cm(12.15), pos_y=Cm(9.98))
    
        # 行业类别
        job_icon_url1 = unselect_icon_url
        job_icon_url2 = unselect_icon_url
        job_icon_url3 = unselect_icon_url
        job_icon_url4 = unselect_icon_url
        job_icon_url5 = unselect_icon_url
        job_icon_url6 = unselect_icon_url
        job_icon_url7 = unselect_icon_url
        job_icon_url8 = unselect_icon_url
        job_icon_url9 = unselect_icon_url
        job_icon_url10 = unselect_icon_url
        job_icon_url11 = unselect_icon_url
        job_icon_url12 = unselect_icon_url
        job_icon_url13 = unselect_icon_url
        job_class_str = user_info['job_class_str']
    
        if job_class_str == '危险化学品生产单位':
            job_icon_url1 = select_icon_url
        elif job_class_str == '煤炭生产经营单位':
            job_icon_url2 = select_icon_url
        elif job_class_str == '烟花爆竹生产单位':
            job_icon_url3 = select_icon_url
        elif '金属冶炼' in job_class_str:
            job_icon_url4 = select_icon_url
        elif job_class_str == '其他生产经营单位':
            job_icon_url5 = select_icon_url
        elif job_class_str == '危险化学品经营单位':
            job_icon_url6 = select_icon_url
        elif '金属非金属' in job_class_str:
            job_icon_url7 = select_icon_url
        elif job_class_str == '烟花爆竹经营单位':
            job_icon_url8 = select_icon_url
        elif job_class_str == '陆上石油天然气开采单位':
            job_icon_url9 = select_icon_url
        elif job_class_str == '一般行业生产经营单位':
            job_icon_url10 = select_icon_url
        elif '煤矿' in job_class_str:
            job_icon_url11 = select_icon_url
        elif job_class_str == '职业卫生':
            job_icon_url12 = select_icon_url
        else:
            job_icon_url13 = select_icon_url
        add_float_picture(info_four_paragraph, job_icon_url1, width=Cm(0.3), pos_x=Cm(5.2), pos_y=Cm(10.5))
        add_float_picture(info_four_paragraph, job_icon_url2, width=Cm(0.3), pos_x=Cm(5.2), pos_y=Cm(11.09))
        add_float_picture(info_four_paragraph, job_icon_url3, width=Cm(0.3), pos_x=Cm(5.2), pos_y=Cm(11.65))
        add_float_picture(info_four_paragraph, job_icon_url4, width=Cm(0.3), pos_x=Cm(5.2), pos_y=Cm(12.22))
        add_float_picture(info_four_paragraph, job_icon_url5, width=Cm(0.3), pos_x=Cm(5.2), pos_y=Cm(12.77))
    
        add_float_picture(info_four_paragraph, job_icon_url6, width=Cm(0.3), pos_x=Cm(9.4), pos_y=Cm(10.5))
        add_float_picture(info_four_paragraph, job_icon_url7, width=Cm(0.3), pos_x=Cm(9.4), pos_y=Cm(11.09))
        add_float_picture(info_four_paragraph, job_icon_url8, width=Cm(0.3), pos_x=Cm(9.4), pos_y=Cm(11.65))
        add_float_picture(info_four_paragraph, job_icon_url9, width=Cm(0.3), pos_x=Cm(9.4), pos_y=Cm(12.22))
        add_float_picture(info_four_paragraph, job_icon_url10, width=Cm(0.3), pos_x=Cm(9.4), pos_y=Cm(12.77))
    
        add_float_picture(info_four_paragraph, job_icon_url11, width=Cm(0.3), pos_x=Cm(13.7), pos_y=Cm(10.5))
        add_float_picture(info_four_paragraph, job_icon_url12, width=Cm(0.3), pos_x=Cm(13.7), pos_y=Cm(11.09))
        add_float_picture(info_four_paragraph, job_icon_url13, width=Cm(0.3), pos_x=Cm(13.7), pos_y=Cm(11.65))
    
        # 人员类别
        fzr_icon_url = unselect_icon_url
        safe_icon_url = unselect_icon_url
        qual_type_str = user_info['qual_type_str']
        if '主要负责人' in qual_type_str:
            fzr_icon_url = select_icon_url
        else:
            safe_icon_url = select_icon_url
    
        add_float_picture(info_four_paragraph, fzr_icon_url, width=Cm(0.3), pos_x=Cm(5.2), pos_y=Cm(13.37))
        add_float_picture(info_four_paragraph, safe_icon_url, width=Cm(0.3), pos_x=Cm(7.8), pos_y=Cm(13.37))
    
        # 签名和指纹
        zw_seal_url = zip_file_path + '/' + user_info['name'] + '指纹文件'
        zw_path = zw_seal_url + '.png'
        if os.path.exists(zw_path):
            add_float_picture(info_four_paragraph, zw_path, width=Cm(2.0), pos_x=Cm(15.5), pos_y=Cm(16.3))
        else:
            zw_path = zw_seal_url + '.jpg'
            if os.path.exists(zw_path):
                add_float_picture(info_four_paragraph, zw_path, width=Cm(2.0), pos_x=Cm(15.5), pos_y=Cm(16.3))
        qm_seal_url = zip_file_path + '/' + user_info['name'] + '签名文件'
        qm_path = qm_seal_url + '.png'
        if os.path.exists(qm_path):
            add_float_picture(info_four_paragraph, qm_path, width=Cm(3.0), pos_x=Cm(15.5), pos_y=Cm(16.3))
        else:
            qm_path = qm_seal_url + '.jpg'
            if os.path.exists(qm_path):
                add_float_picture(info_four_paragraph, qm_path, width=Cm(3.0), pos_x=Cm(15.5), pos_y=Cm(16.3))
    
        # 公司盖章和负责人签名
        fzr_seal_url = zip_file_path + '/' + user_info['name'] + '负责人签名'
        fzr_qm_path = fzr_seal_url + '.png'
        if os.path.exists(fzr_qm_path):
            add_float_picture(info_four_paragraph, fzr_qm_path, width=Cm(4.0), pos_x=Cm(8.2), pos_y=Cm(20.6))
        else:
            fzr_qm_path = fzr_seal_url + '.jpg'
            if os.path.exists(fzr_qm_path):
                add_float_picture(info_four_paragraph, fzr_qm_path, width=Cm(4.0), pos_x=Cm(8.2), pos_y=Cm(20.6))
    
        company_seal_url = zip_file_path + '/' + user_info['name'] + '公司盖章'
        company_zw_path = company_seal_url + '.png'
        if os.path.exists(company_zw_path):
            add_float_picture(info_four_paragraph, company_zw_path, width=Cm(4.2), pos_x=Cm(12.5), pos_y=Cm(20.3))
        else:
            company_zw_path = company_seal_url + '.jpg'
            if os.path.exists(company_zw_path):
                add_float_picture(info_four_paragraph, company_zw_path, width=Cm(4.2), pos_x=Cm(12.5), pos_y=Cm(20.3))
    
        word_file_path = zip_file_path + f'/{user_info["id_card"]}.docx'
    
    
    user_info = {'name': '张三', .......................}
    zip_file_path = 'E:/'
    safe_produce_word(user_info, zip_file_path)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390
    • 391
    • 392
    • 393
    • 394
    • 395
    • 396
    • 397
    • 398
    • 399
    • 400
    • 401
    • 402
    • 403
    • 404
    • 405
    • 406
    • 407
    • 408
    • 409
    • 410
    • 411
    • 412
    • 413
    • 414
    • 415
    • 416
    • 417
    • 418
    • 419
    • 420
    • 421
    • 422
    • 423
    • 424
    • 425
    • 426
    • 427
    • 428
    • 429
    • 430
    • 431
    • 432
    • 433
    • 434
    • 435
    • 436
    • 437
    • 438
    • 439
    • 440
    • 441
    • 442
    • 443
    • 444
    • 445
    • 446
    • 447
    • 448
    • 449
    • 450
    • 451
    • 452
    • 453
    • 454
    • 455
    • 456
    • 457
    • 458
    • 459
    • 460
    • 461
    • 462
    • 463
    • 464
    • 465
    • 466
    • 467
    • 468
    • 469
    • 470
    • 471
    • 472
    • 473
    • 474
    • 475
    • 476
    • 477
    • 478
    • 479
    • 480
    • 481
    • 482
    • 483
    • 484
    • 485
    • 486
    • 487
    • 488
    • 489
    • 490
    • 491
    • 492
    • 493
    • 494
    • 495
    • 496
    • 497
    • 498
    • 499
    • 500
    • 501
    • 502
    • 503
    • 504
    • 505
    • 506
    • 507
    • 508
    • 509
    • 510
    • 511
    • 512
    • 513
    • 514
    • 515
    • 516
    • 517
    • 518
    • 519
    • 520
    • 521
    • 522
    • 523
    • 524
    • 525
    • 526
    • 527
    • 528
    • 529
    • 530
    • 531
    • 532
    • 533
    • 534
    • 535
    • 536
    • 537
    • 538
    • 539
    • 540
    • 541
    • 542
    • 543
    • 544
    • 545
  • 相关阅读:
    Leetcode—392.判断子序列【简单】
    QueryWrapper里执行mysql函数
    QML、C++ 和 JS 三者之间的交互
    力扣:116. 填充每个节点的下一个右侧节点指针(Python3)
    MySql ocp认证之主从复制(三)
    设置QCheckbox 样式的注意事项
    Spring Boot
    IO学习系列之使用fgetc和fputc复制文件内容
    8. C#多线程基础概念
    [NISACTF 2022]popchains - 反序列化+伪协议
  • 原文地址:https://blog.csdn.net/leshen_88/article/details/136228800