Python操作word基础

简介: Python操作word基础


在办公自动化的操作,往往可能会存在Word的操作。因为在办公 时,对文档的操作是必不可少的。而在Python操作Word时,可以 使用一个三方的模块库 Python-docx


安装


pip install python-docx


常用方法与属性



from docx import Document
def create_word():
    # 创建word文档
    doc1 = Document()
    # 增加标题
    doc1.add_heading('欢迎使用Python创建Word',0)
    doc1.add_heading('Python操作 增加1级标题',1)
    doc1.add_heading('Python操作 增加2级标题',2)
    # 保存文档
    doc1.save('./create_data/01_创建word文档.docx')
if __name__ == '__main__':
    create_word()



Word写入段落数据

常用方法与属性



from docx.enum.style import WD_BUILTIN_STYLE
def create_word():
    from docx import Document
    # 创建一个word文档
    doc1 = Document()
    # 增加段落信息
    doc1.add_paragraph('Python第一阶段','Title')
    # doc1.add_paragraph('Python第一阶段',style = 'Title')
    par1 =doc1.add_paragraph('本阶段是进入“程序员”的门槛,需要学习编程基本的知识。本阶段会从0开始,循序渐进。让小伙伴们学完本阶段,可以掌握:变量、数据类型、控制语句、容器、函数和面向对象等。教程中会穿插一些有趣的案例,寓教于乐,引起大家的兴趣。 ')
    # 给段落后面追加内容
    par1.add_run('“兴趣永远是好的老师”。')
    doc1.add_paragraph('本阶段是进入“程序员”的门槛,需要学习编程基本的知识。本阶段会从0开始,循序渐进。让小伙伴们学完本阶段,可以掌握:变量、数据类型、控制语句、容器、函数和面向对象等。教程中会穿插一些有趣的案例,寓教于乐,引起大家的兴趣。 “兴趣永远是好的老师”。')
    # 增加列表-无序
    doc1.add_paragraph('哪个不是动物:')
    doc1.add_paragraph('喜洋洋',style='List Bullet')
    doc1.add_paragraph('美羊羊',style='List Bullet')
    doc1.add_paragraph('懒洋洋',style='List Bullet')
    doc1.add_paragraph('苹果',style='List Bullet')
    doc1.add_paragraph('灰太狼',style='List Bullet')
    # 增加列表-有序
    doc1.add_paragraph('今年的学习计划:')
    doc1.add_paragraph('Python',style='List Number')
    doc1.add_paragraph('HTML',style='List Number')
    doc1.add_paragraph('JS',style='List Number')
    doc1.add_paragraph('Flask',style='List Number')
    # 增加引用
    doc1.add_paragraph('这个是一个引用内容',style='Intense Quote')
    # 保存word文档
    doc1.save('./create_data/02_增加段落.docx')
if __name__ =='__main__':
    create_word()

 



Word增加图片

常用方法与属性



def create_word():
    from docx import Document
    # 创建一个文档
    doc1 = Document()
    # 增加图片
    pic = doc1.add_picture('./base_data/backg.jpg')
    # 获取文档的宽度
    page_width = doc1.sections[0].page_width
    # 获取文档的左边距
    page_left_width = doc1.sections[0].left_margin
    print(page_width)
    print(page_left_width)
    # 获取中间内容的宽度
    content_width = page_width-page_left_width*2
    print(content_width)
    # 获取图片应该缩小的比例
    # 如果图片或者页面宽度值太高,有可能程序无法计算,可以考虑同时缩小几倍
    sc =(content_width/100)/(pic.width/100)
    # 修改图片的宽、高
    pic.width = int(pic.width*sc)
    pic.height = int(pic.height*sc)
    # 保存文档
    doc1.save('./create_data/03_增加图片.docx')
if __name__ == '__main__':
    create_word()


Word增加表格

常用方法与属性



def create_table():
    from docx import Document
    # 创建word文档
    doc1 = Document()
    # 增加表格
    table = doc1.add_table(rows=1,cols=3)
    # 设置表格的内容
    cells = table.rows[0].cells
    cells[0].text = '编号'
    cells[1].text = '姓名'
    cells[2].text = '职业'
    data = (
        (1,'吕小布','将军'),
        (2,'诸葛亮','军事'),
        (3,'刘备','主攻'),
    )
    for i,n,w in data:
        # 增加一行数据
        tmp_cell = table.add_row().cells
        '''
        问题1:
        tmp_cell[0] = i
        TypeError: 'tuple' object does not support item assignment  
        有可能是直接给单元格设置内容了!需要给text属性设置内容
        '''
        '''
        问题2:
        for char in text:
        TypeError: 'int' object is not iterable
        给单元格设置值,不能是数字,需要转成str
        '''
        tmp_cell[0].text = str(i)
        tmp_cell[1].text = n
        tmp_cell[2].text = w
    # 保存文档
    doc1.save('./create_data/04_增加表格.docx')
if __name__ =='__main__':
    create_table()

   



Word设置文字样式

常用方法与属性



 注意
我们在写word的时候,一般英文采用Arial和新罗马字体,中文 是宋体和黑体 w:eastAsia是东亚的意思。应该是规定使用中文字体时确认“微 软雅黑”是哪个地方的微软雅黑 记住即可
def use_style():
    from docx import Document
    from docx.shared import Pt,Inches,RGBColor
    # 创建文档
    doc1 = Document()
    # 设置加粗
    p1 = doc1.add_paragraph('这是段落1:\n')
    p1.runs[0].font.bold=True
    # 加粗
    p1.add_run('这是内容1.1_加粗\n').font.bold=True
    # 斜体
    p1.add_run('这是内容1.2_斜体\n').font.italic = True
    # 删除线
    p1.add_run('这是内容1.3_删除线\n').font.strike = True
    # 阴影
    p1.add_run('这是内容1.4_阴影\n').font.shadow = True
    # 字体大小
    p1.add_run('这是内容1.5_字体大小\n').font.size = Pt(30)
    # 颜色 rgb三原色 0-255
    p1.add_run('这是内容1.6_颜色\n').font.color.rgb = RGBColor(255,100,76)
    # 字体
    # p1.add_run('这是内容1.7_字体\n').font.name='微软雅黑'  # 只写这个设置不成功的
    run = p1.add_run('这是内容1.7_字体\n')
    from docx.oxml.ns import qn
    '''
    AttributeError: 'NoneType' object has no attribute 'rFonts'
    直接设置字体,会报错,需要先声明字体名称
    '''
    run.font.name=''
    run._element.rPr.rFonts.set(qn('w:eastAsia'),'微软雅黑')
    doc1.save('./create_data/05_设置字体样式.docx')
if __name__ == "__main__":
    use_style()


Word设置段落样式

常用方法与属性



def use_style():
    from docx import Document
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    from docx.shared import Pt
    # 创建文档
    doc1 = Document()
    # 段落居中
    doc1.add_paragraph('这是段落1:').paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
    # 设置整段离左侧距离
    doc1.add_paragraph('Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是...').paragraph_format.left_indent = Pt(50)
    # 设置首行左侧距离
    doc1.add_paragraph('Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是...').paragraph_format.first_line_indent = Pt(50)
    # 段落离上面的距离
    doc1.add_paragraph('这是段落2:').paragraph_format.space_before=Pt(30)
    # 段落离下面的距离
    doc1.add_paragraph('这是段落3:').paragraph_format.space_after=Pt(30)
    # 设置行间距
    doc1.add_paragraph('这是段落4:')
    doc1.add_paragraph('Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是...').paragraph_format.line_spacing = Pt(50)
    doc1.save('./create_data/06_设置段落样式.docx')
if __name__ =='__main__':
    use_style()


Word生成通知书


from docx import Document
from docx.shared import Pt,RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
def create_book():
    # 生成一个文档
    doc1 = Document()
    # 增加标题
    title = doc1.add_paragraph()
    run = title.add_run('录取通知书')
    # 设置标题的样式
    run.font.size = Pt(30)
    run.font.color.rgb = RGBColor(255,0,0)
    run.font.name = ''
    run._element.rPr.rFonts.set(qn('w:eastAsia'),'黑体')
    title.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    # 增加内容
    doc1.add_paragraph('张三 同学:')
    content1 = doc1.add_paragraph('兹录取你入我校 人工智能技术 专业类学习。请凭本通知书来报道。具体时间、地点见《新生入学须知》。')
    # 设置内容样式
    content1.paragraph_format.first_line_indent = Pt(30)
    # 落款
    footer = doc1.add_paragraph('清华大学\n')
    footer.add_run('二0三0年八月十号')
    footer.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
    # 保存文档
    doc1.save('./create_data/07_录取通知书.docx')
def create_book2(name,major,school,_time):
    # 生成一个文档
    doc1 = Document()
    # 增加标题
    title = doc1.add_paragraph()
    run = title.add_run('录取通知书')
    # 设置标题的样式
    run.font.size = Pt(30)
    run.font.color.rgb = RGBColor(255,0,0)
    run.font.name = ''
    run._element.rPr.rFonts.set(qn('w:eastAsia'),'黑体')
    title.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    # 增加内容
    doc1.add_paragraph(f'__{name}__ 同学:')
    content1 = doc1.add_paragraph(f'兹录取你入我校 __{major}__ 专业类学习。请凭本通知书来报道。具体时间、地点见《新生入学须知》。')
    # 设置内容样式
    content1.paragraph_format.first_line_indent = Pt(30)
    # 落款
    footer = doc1.add_paragraph(f'{school}\n')
    footer.add_run(f'{_time}')
    footer.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
    # 保存文档
    doc1.save(f'./create_data/07_录取通知书_{name}.docx')
if __name__ == '__main__':
    # create_book()
    create_book2('吕布','人工智能技术','清华大学','二0三0年八月十号')


其中有两个版本,第一个是写死的,第二个是根据不同的信息进行修改



Word读取内容


常用方法与属性


from docx import Document
def read_word():
    # 打开文档
    doc1 = Document('./base_data/原数据.docx')
    # 读取数据-段落
    for p in doc1.paragraphs:
        print(p.text)
    # 读取表格
    for t in doc1.tables:
        for row in t.rows:
            for c in row.cells:
                print(c.text,end=' ')
            print()
if __name__ == '__main__':
    read_word()


Word通过模板生成文档

from docx import Document
def create_word(_data):
    # 打开文档
    doc1 = Document('./base_data/word_模板.docx')
    # 读取里面的数据
    for p in doc1.paragraphs:
        # 替换新数据 如果直接级paragraph的text替换内容,会丢失样式
        # p.text = p.text.replace('{0}','000001')
        # p.text = p.text.replace('{1}','2030')
        # p.text = p.text.replace('{2}','01')
        # p.text = p.text.replace('{3}','01')
        # p.text = p.text.replace('{4}','01')
        # p.text = p.text.replace('{5}','01')
        # p.text = p.text.replace('{6}','闯红灯')
        # p.text = p.text.replace('{7}','600')
        for run in p.runs:
            run.text = run.text.replace('{0}',_data[0])
            run.text = run.text.replace('{1}',_data[1])
            run.text = run.text.replace('{2}',_data[2])
            run.text = run.text.replace('{3}',_data[3])
            run.text = run.text.replace('{4}',_data[4])
            run.text = run.text.replace('{5}',_data[5])
            run.text = run.text.replace('{6}',_data[6])
            run.text = run.text.replace('{7}',_data[7])
    # 保存新文件
    doc1.save(f'./create_data/09_模板生成文档_{_data[0]}.docx')
if __name__ == '__main__':
    data = [
        ('00001','2030','01','01','01','01','闯红灯','600'),
        ('00002','2030','02','01','01','01','违反禁令','300'),
        ('00003','2030','03','01','01','01','违章停车','300'),
        ('00004','2030','04','01','01','01','挑线','100'),
        ('00005','2030','05','01','01','01','没礼让行人','300'),
    ]
    for d in data:
        create_word(d)
        # print(d)



Word转换PDF


使用office组件将word转换成PDF文件(缺点:只支持windows平 台) 原理:使用python win32 库 调用word底层vba,将word转成pdf


安装


pip install pywin32


本地选装 office 套件,可以安装比较稳定的版本



from win32com.client import gencache
from win32com.client import constants, gencache
def createPdf(wordPath, pdfPath):
    """
    word转pdf
    :param wordPath: word文件路径
    :param pdfPath:  生成pdf文件路径
    """
    word = gencache.EnsureDispatch('Word.Application')
    doc = word.Documents.Open(wordPath, ReadOnly=1)
    doc.ExportAsFixedFormat(pdfPath,
                            constants.wdExportFormatPDF,
                            Item=constants.wdExportDocumentWithMarkup,
                  CreateBookmarks=constants.wdExportCreateHeadingBookmarks)
    word.Quit(constants.wdDoNotSaveChanges)
if __name__ == "__main__":
    # 路径填写绝对路径
    createPdf(
        r'D:\code\python\auto_code_word\base_data\原数据.docx',
        r'D:\code\python\auto_code_word\create_data\10_word转换成pdf.pdf'
    )
    # 命令要安装pywin32模块,命令:pip install pywin32



Python操作Word模块库文档


目录
相关文章
|
13天前
|
Python
高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作
【6月更文挑战第20天】高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作。装饰器如`@timer`接收或返回函数,用于扩展功能,如记录执行时间。`timer`装饰器通过包裹函数并计算执行间隙展示时间消耗,如`my_function(2)`执行耗时2秒。
16 3
|
22天前
|
Java Serverless 应用服务中间件
Serverless 应用引擎操作报错合集之部署python项目时,构建过程报错,怎么解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
13天前
|
存储 Go 索引
牢记python对象的操作方式
【6月更文挑战第20天】在Python中,`hash()`和`is`帮助确定对象的相等性。`dir()`和`vars()`揭示对象的属性和内部表示,`__slots__`优化内存使用。列表和字典结构有不同的内存和性能特性,字典使用哈希表进行快速访问。
60 5
牢记python对象的操作方式
|
7天前
python+Pycharm+selenium操作浏览器(Chorme或Edge)
python+Pycharm+selenium操作浏览器(Chorme或Edge)
13 1
|
7天前
|
jenkins 持续交付 API
使用Python操作Jenkins的过程详解
Python作为一种简洁、灵活且功能丰富的编程语言,可以与各种API轻松集成,Jenkins的API也不例外。借助于Python中的python-jenkins模块,我们可以轻松地编写脚本来连接到Jenkins服务器,并执行各种操作,如创建、删除、构建Jobs等。这种自动化的方式不仅提高了效率,还使得CI/CD流程更加灵活和可控。
|
14天前
|
Python
Python列表推导式是一种简洁的创建新列表的方式,它允许你在一行代码中完成对数据的操作和转换
【6月更文挑战第19天】Python列表推导式是创建新列表的简洁语法,它在一行内处理数据。表达式如`[expr for item in iterable if cond]`,其中`expr`是对元素的操作,`item`来自`iterable`,`if cond`是可选过滤条件。例如,将数字列表平方:`[x**2 for x in numbers]`。嵌套列表推导处理复杂结构,如合并二维数组:`[[a+b for a,b in zip(row1, row2)] for row1, row2 in zip(matrix1, matrix2)]`。简洁但勿过度复杂化。
23 5
|
14天前
|
Python
Python教程:Python中的输入与输出操作
在编程语言中,输入(Input)和输出(Output),简称I/O,是基础且重要的概念。Python作为一门易于学习且功能强大的编程语言,在处理输入和输出方面提供了多种方式。本文将深入探讨Python中的输入输出操作,包括标准输入输出、文件操作、以及网络I/O等领域
25 4
|
12天前
|
SQL Oracle 关系型数据库
Python连接数据库进行数据查询的操作代码
mysql数据库(mariadb) 连接数据库 首先,你需要使用MySQLdb.connect()函数建立与MySQL数据库的连接。你需要提供数据库服务器的地址(host),用户名(user),密码(passwd),以及你想要操作的数据库名称(db)。 创建Cursor对象 一旦建立了数据库连接,你可以使用连接对象的cursor()方法来创建一个cursor对象。这个方法返回一个cursor实例,你可以使用这个实例来执行SQL查询和命令。
|
15天前
|
Python
【干货】python xlwt写入excel操作
【干货】python xlwt写入excel操作
12 2
|
18天前
|
缓存 Python
[译]Python 和 TOML:新最好的朋友 (2) 使用Python操作TOML
[译]Python 和 TOML:新最好的朋友 (2) 使用Python操作TOML