• 【Python办公自动化之Word】


    python办公⾃动化之-Word

    python-docx库

    1、安装python-docx

    cmd窗⼝或终端输⼊pip install python-docx按下回⻋等待安装完成。
    说明

    2、⽂档的结构说明

    在这里插入图片描述

    在word⽂档中,其主要结构如下所述:

    1. 每个document包含多个paragraph,每个paragraph有多个run,每个run包含有(text⽂本,font字体,color颜⾊,字号)
    2. 每个document包含多个tables,table中有多个rows,每个row包含多个cells,每个cell中包含多个paragraph。对于写word表格不论是 head 还是paragraph 基本操作都是先添加对象,然后再添加run就好了
    3. word表格的结构包含head标题、normal 正⽂、Caption表

    3、基本操作语法

    3.1 打开⽂档

    document = Document
    

    不填默认为新建⼀个⽂档

    3.2加⼊不同等级的标题

    document.add_heading('总标题',0)
    document.add_heading('⼀级标题',1)
    document.add_heading('⼆级标题',2)
    

    3.3 添加⽂本

     paragraph = document.add_paragraph('⽂本内容')
    

    3.4 设置字号

    run = paragraph.add_run('设置字号、')
    run.font.size = Pt(34)
    

    插曲1:实战演示

    from docx import Document
    from docx.shared import Pt
    
    document = Document()
    
    # 添加标题
    document.add_heading('总标题', 0)
    document.add_heading('一级标题', 1)
    document.add_heading('二级标题', 2)
    
    paragraph = document.add_paragraph('我是⽂本内容')
    
    run = paragraph.add_run('设置字号、')
    run.font.size = Pt(34)
    
    document.save('test.docx')	#生成的文件名+路径,不设路径默认在工程目录下
    

    运行结果:

    在这里插入图片描述

    3.5 设置中⽂字体

    run = paragraph.add_run('设置中⽂字体、')
    run.font.name = '宋体'
    r = run._element
    r.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
    

    3.6 设置斜体

    run = paragraph.add_run('斜体、')
    run.italic = True
    

    3.7 设置粗体

     paragraph.add_run('粗体').bold = True
    

    3.8⾸⾏缩进

    缩进⽅式属性
    左边缩进left_indent
    右边缩进right_indent
    ⾸⾏缩进first_line_indent

    插曲2:实战演示

    from docx import Document
    from docx.oxml.ns import qn
    from docx.shared import Pt
    
    document = Document()
    
    # 添加标题
    document.add_heading('总标题', 0)
    document.add_heading('一级标题', 1)
    document.add_heading('二级标题', 2)
    
    paragraph = document.add_paragraph('我是文本本内容')
    paragraph.add_run('粗体').bold = True
    
    run = paragraph.add_run('设置字号、')
    run.font.size = Pt(34)
    run = paragraph.add_run('设置中⽂字体、')
    run.font.name = '华文彩云'
    r = run._element
    r.rPr.rFonts.set(qn('w:eastAsia'), '华文彩云')
    
    run = paragraph.add_run('斜体、')
    run.italic = True
    
    document.save('test.docx')
    

    在这里插入图片描述

    插曲3:实战演示

    from docx import Document
    from docx.shared import Inches
    
    doc = Document()
    paragraph = doc.add_paragraph()
    paragraph.add_run('因______,特向您请事假____天。请假时间自_____年___月___日至_____年___月___日。这段时间内原计划安排的课程已做好处理,希望领导批准。' )
    
    article2_format = paragraph.paragraph_format
    article2_format.first_line_indent = Inches(0.3) #英寸单位
    doc.save('请假.docx')
    

    在这里插入图片描述

    3.9 对⻬⽅式

    名称属性
    左对⻬LEFT
    居中CENTER
    右对⻬RIGHT
    ⽂本两端对⻬JUSTIFY

    插曲4:实战演示

    from docx import Document
    from docx.enum.text import
    WD_PARAGRAPH_ALIGNMENT
    doc = Document()
    title = doc.add_paragraph()
    a2 = title.add_run('标题内容')
    title.alignment =
    WD_PARAGRAPH_ALIGNMENT.CENTER # 居中
    doc.save('test.docx')
    

    在这里插入图片描述

    3.10 增加列表

    from docx import Document
    document = Document()
    document.add_paragraph(
     '⽆序列表元素1', style='List Bullet'
     )
    document.add_paragraph(
     '⽆序列表元素2', style='List Bullet'
     )
    document.add_paragraph(
     '⽆序列表元素3', style='List Bullet'
     )
    
    document.add_paragraph(
     '有序列表元素1', style='List Number'
     )
    document.add_paragraph(
     '有序列表元素2', style='List Number'
     )
    document.add_paragraph(
     '有序列表元素3', style='List Number'
     )
    
    
    document.save('列表.docx')
    

    在这里插入图片描述

    3.11 增加图片

    png为图⽚名称(必须与代码⽂件在同⼀个⽂件夹内)

    document.add_picture('1.png',width=Inches(1.35)
    

    3.12 增加表格

    table = document.add_table(rows=1, cols=3)
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = 'Name'
    hdr_cells[1].text = 'Id'
    hdr_cells[2].text = 'Desc'
    

    插曲5:实战演示

    from docx import Document
    from docx.shared import Inches
    
    doc = Document()
    # doc.add_picture('dlrb.jpeg', width=Inches(1.35))
    doc.add_picture('dlrb.jpeg', width=Inches(1.35), height=Inches(1.35))
    
    table = doc.add_table(rows=1, cols=3, style="Table Grid")
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = 'Name'
    hdr_cells[1].text = 'Id'
    hdr_cells[2].text = 'Desc'
    for i in range(3):
        row_cells = table.add_row().cells
        row_cells[0].text = 'test'+str(i)
        row_cells[1].text = str(i)
        row_cells[2].text = 'desc'+str(i)
    doc.save('test.docx')
    

    运行效果:

    在这里插入图片描述

    3.13 再增加3行表格元素

    for i in range(3):
     row_cells = table.add_row().cells
     row_cells[0].text = 'test'+str(i)
     row_cells[1].text = str(i)
     row_cells[2].text = 'desc'+str(i)
    

    3.14 增加分页

    document.add_page_break()
    

    3.15 保存文件

    document.save('测试.docx')
    

    3.16 完整代码

    from docx import Document
    from docx.shared import Pt
    from docx.shared import Inches
    from docx.oxml.ns import qn
    document = Document()
    document.add_heading(u'MS WORD写⼊测试',0)
    document.add_heading('⼀级标题',1)
    document.add_heading('⼆级标题',2)
    paragraph = document.add_paragraph('我们在做⽂
    本测试!')
    run = paragraph.add_run('设置字号、')
    run.font.size = Pt(34)
    run = paragraph.add_run('设置中⽂字体、')
    run.font.name = '宋体'
    r = run._element
    r.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
    run = paragraph.add_run('斜体、')
    run.italic = True
    paragraph.add_run('粗体').bold = True
    document.add_paragraph('Intense quote',
    style='Intense Quote')
    document.add_paragraph(
     '⽆序列表元素1', style='List Bullet'
    )
    document.add_paragraph(
     '⽆序列表元素3', style='List Bullet'
    )
    document.add_paragraph(
     '有序列表元素1', style='List Number'
    )
    document.add_paragraph(
     '有序列表元素3', style='List Number'
    )
    
    document.add_picture('dlrb.jpeg',width=Inches(1.35))
    table = document.add_table(rows=1, cols=3)
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = 'Name'
    hdr_cells[1].text = 'Id'
    hdr_cells[2].text = 'Desc'
    for i in range(3):
     row_cells = table.add_row().cells
     row_cells[0].text = 'test'+str(i)
     row_cells[1].text = str(i)
     row_cells[2].text = 'desc'+str(i)
    document.add_page_break()
    document.save('测试.docx')
    
    

    在这里插入图片描述

    3.17 获取文档操作

    from docx import Document
    
    doc = Document('test.docx')
    paragraphs = doc.paragraphs
    # print(len(paragraphs))
    for paragraph in paragraphs:
        print(paragraph.text)
    

    test.tocx

    在这里插入图片描述

    运行结果:

    在这里插入图片描述

    3.18 获取段落数量

    # 段落数量
    print(len(doc.paragraphs ))
    

    4、案例

    4.1 请假条

    from docx import Document
    from docx.oxml.ns import qn
    from docx.shared import Pt, Inches
    from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
    
    doc = Document()
    # 全局字体设置
    doc.styles['Normal'].font.name = '宋体'
    doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
    
    # 创建标题
    title = doc.add_paragraph()
    title1 = title.add_run('公司员工请假条')
    title1.font.size = Pt(20)
    title1.blod = True
    title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    
    # 正文
    article1 = doc.add_paragraph()
    article2 = article1.add_run('___部:')
    
    article3 = doc.add_paragraph()
    article4 = article3.add_run('因____________ ,特向您请事假天。请假时间自_年月日 至_年月日。这段时间内原计 划安排的课程已做好处理,希望领导批准。')
    
    # ⾸⾏缩进 负值表示悬挂缩进
    article3_format = article3.paragraph_format
    article3_format.first_line_indent = Inches(0.3)
    
    article3 = doc.add_paragraph()
    a3 = article3.add_run('请假人:') # 内容
    article3.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
    article3_format = article3.paragraph_format
    article3_format.right_indent = Inches(0.9)
    
    nowData = doc.add_paragraph()
    n3 = nowData.add_run('年 月 日') # 内容
    nowData.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
    nowData_format = nowData.paragraph_format
    nowData_format.right_indent = Inches(0.3)
    
    doc.save('请假条.docx')
    

    在这里插入图片描述

    4.2 Excel转换为word

    import xlrd
    from docx import Document
    from docx.enum.section import WD_ORIENTATION
    from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
    from docx.shared import Pt, Cm, RGBColor
    from docx.oxml.ns import qn
    from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT
    
    
    def read_excel():
        """读取Excel"""
        book = xlrd.open_workbook('test.xlsx')
        sheet = book.sheet_by_name(book.sheet_names()[0])
        nrows = sheet.nrows # 行数
        ncols = sheet.ncols # 列数
        datas = [] # 存放数据
        # 第一列 标题
        keys = sheet.row_values(0)
        for row in range(1, nrows):
          data = {} # 每一行数据
          for col in range(0, ncols):
            value = sheet.cell_value(row, col) # 取出每一个单元格的数据
            # 替换到特殊字符
            value = value.replace('<', '').replace('>', '').replace('$', '')
            data[keys[col]] = value
            # 截取第一列元素
            if col == 0:
              first = '' # 截取元素 第1
              second = '' # 截取元素 第2
              third = '' # 截取元素 第3
              arrs = value.lstrip('/').split('/') # 去掉第一个/ 然后再以/分组
              if len(arrs) > 0:
                if len(arrs) == 1:
                  first = arrs[0]
                  second = first
                  third = second
                elif len(arrs) == 2:
                  first = arrs[0]
                  second = arrs[1]
                  third = second
                elif len(arrs) == 3:
                  first = arrs[0]
                  second = arrs[1]
                  third = arrs[2]
                else:
                  first = arrs[0]
                  second = arrs[1]
                  third = arrs[2]
              else:
                first = value.ltrip('/')
                second = first
                third = second
              data['first'] = first
              data['second'] = second
              data['third'] = third
            # 截取第一列结束
          datas.append(data)
        return datas
    
    
    
    def write_word(datas):
        """生成word文件"""
        if len(datas) < 1:
          print('Excel没有内容')
          return
        # 定义word文档对象
        doc = Document()
        # 添加横向
        section = doc.sections[0] # doc.add_section(start_type=WD_SECTION_START.CONTINUOUS) # 添加横向页的连续节
        section.orientation = WD_ORIENTATION.LANDSCAPE
        page_h, page_w = section.page_width, section.page_height
        section.page_width = page_w # 设置横向纸的宽度
        section.page_height = page_h # 设置横向纸的高度
        # 设置字体
        doc.styles['Normal'].font.name = u'宋体'
        doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
        # 获取第3部分(部门) 并去重
        data_third = []
        for data in datas:
          third = data['third']
          if data_third.count(third) == 0:
            data_third.append(third)
        for third in data_third:
          h2 = doc.add_heading(third, level=2) # 写入部门,二级标题
          run = h2.runs[0] # 可以通过add_run来设置文字,也可以通过数组来获取
          run.font.color.rgb = RGBColor(0, 0, 0)
          run.font.name = u'宋体'
          doc.add_paragraph(text='', style=None) # 增加空白行 换行
          # 开始获取模板
          data_template = []
          for data in datas:
            if data['third'] == third:
              template = {'first': data['first'], '模板名称': data['模板名称']}
              if data_template.count(template) == 0:
                data_template.append(template)
          # 获取模板完成
          # 遍历模板
          for template in data_template:
            h3 = doc.add_heading(template['模板名称'], level=3) # 插入模板名称,三级标题
            run = h3.runs[0] # 可以通过add_run来设置文字,也可以通过数组来获取
            run.font.color.rgb = RGBColor(0, 0, 0)
            run.font.name = u'宋体'
            doc.add_paragraph(text='', style=None) # 换行
            data_table = filter(
              lambda data: data['third'] == third and data['模板名称'] == template['模板名称'] and data['first'] ==
                     template['first'], datas)
            data_table = list(data_table)
            # 新增表格 4行5列
            doc_table = doc.add_table(rows=4, cols=5)
            doc_table.style = "Table Grid"
            doc_table.style.font.size = Pt(9)
            doc_table.style.font.name = '宋体'
    
            # 合并单元格 赋值
            doc_table.rows[0].cells[1].merge(doc_table.rows[0].cells[4])
            doc_table.rows[1].cells[1].merge(doc_table.rows[1].cells[4])
            doc_table.rows[2].cells[1].merge(doc_table.rows[2].cells[4])
            doc_table.rows[0].cells[0].text = '流程名称:'
            doc_table.rows[0].cells[1].text = data_table[0]['模板名称']
            doc_table.rows[1].cells[0].text = '使用人:'
            doc_table.rows[1].cells[1].text = data_table[0]['first']
            doc_table.rows[2].cells[0].text = '流程说明:'
            doc_table.rows[2].cells[1].text = data_table[0]['流程说明']
    
            # 设置标题
            head_cells = doc_table.rows[3].cells # 前面还有三行,特殊处理
            head_cells[0].text = '节点'
            head_cells[1].text = '节点名'
            head_cells[2].text = '处理人员'
            head_cells[3].text = '处理方式'
            head_cells[4].text = '跳转信息'
            # 设置列宽
            head_cells[0].width = Cm(1.9)
            head_cells[1].width = Cm(4.83)
            head_cells[2].width = Cm(8.25)
            head_cells[3].width = Cm(2.54)
            head_cells[4].width = Cm(5.64)
            # 第1 列水平居中,并设置行高,所有单元格内容垂直居中
            for i in range(0, 4):
              # 水平居中
              p = doc_table.rows[i].cells[0].paragraphs[0]
              p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
              doc_table.rows[i].height = Cm(0.6) # 行高
              # 垂直居中
              for j in range(0, 5):
                doc_table.rows[i].cells[j].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
    
            # 生成表格并填充内容
            row_num = 0
            for data in data_table:
              row = doc_table.add_row()
              row_cells = row.cells
              row_cells[0].text = str(row_num + 1) # 序号,需要转换成字符串
              row_cells[1].text = data['节点名称']
              row_cells[2].text = data['审批人员']
              row_cells[3].text = data['审批方式']
              row_cells[4].text = ''
              # 水平居中
              p = row_cells[0].paragraphs[0]
              p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
              row.height = Cm(0.6) # 行高
              # 垂直居中
              for j in range(0, 5):
                row_cells[j].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
              row_num = row_num + 1
    
            doc.add_paragraph(text='', style=None) # 换行
        doc.save('test.docx')
    
    print(write_word(read_excel()))
    

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    二进制,八进制,十进制,十六进制 原码、反码、补码
    对某钓鱼样本分析
    贪吃蛇游戏
    常用 CMD 命令
    EPLAN学习笔记1:连接定义点和电位定义点
    MacOS 中 ARM64 汇编 ldr =address 伪指令导致运行时崩溃的原因及解决
    wpf资源Resources探究性学习(一)
    UE基础篇六:音频
    h5 table自动滚动的方法
    麒麟KYLINIOS软件仓库搭建03-软件仓库添加新版本的软件包
  • 原文地址:https://blog.csdn.net/v13111329954/article/details/139842779