案例

官网地址: https://python-docx.readthedocs.io/en/latest/

pip install python-docx

from docx import Document
from docx.shared import Inches document = Document() document.add_heading('Document Title', 0) p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote') document.add_paragraph(
'first item in unordered list', style='List Bullet'
)
document.add_paragraph(
'first item in ordered list', style='List Number'
) # document.add_picture('touxiang2.jpg', width=Inches(1.25)) records = (
(3, '101', 'Spam'),
(7, '422', 'Eggs'),
(4, '631', 'Spam, spam, eggs, and spam')
) table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
row_cells = table.add_row().cells
row_cells[0].text = str(qty)
row_cells[1].text = id
row_cells[2].text = desc document.add_page_break() document.save('demo.docx')

添加图片并设置图片大小

from docx import Document
from docx.shared import Inches
document = Document()
document.add_picture(open('mm.png', mode='rb'),width=Inches(6.0), height=Inches(6.0))
document.save('test.docx')

其它案例

from docx import Document
from docx.shared import Inches

document = Document()
# 0,标题:一、关于图片
document.add_heading('一、关于图片', level=2)
# 1,添加图片
document.add_paragraph('1,添加图片')
document.add_picture('mm.png')
# 2,设置图片大小 Inches(1.0)
document.add_paragraph('2,设置图片大小 width=Inches(1.0)')
document.add_picture('mm.png', width=Inches(1.0))

# 3,设置图片大小 Inches(4.0)
document.add_paragraph('3,设置图片大小 width=Inches(4.0)')
document.add_picture('mm.png', width=Inches(4.0))

# 4,设置图片大小 Inches(6.0)
document.add_paragraph('4,设置图片大小 width=Inches(6.0)')
document.add_picture('mm.png', width=Inches(6.0))

# 5,设置图片大小 width=Inches(6.0),height=Inches(6.0)
document.add_paragraph('5,设置图片大小 width=Inches(6.0),height=Inches(6.0)')
document.add_picture('mm.png', width=Inches(6.0), height=Inches(6.0))

# 最后保存成word文档
document.save("mcw.docx")
print("docx保存成功!")

document.add_paragraph('4,设置图片大小 width=Inches(6.0)')  这个应该是添加正文,看类型是正文类型

1.概念

块级元素(block-level) 是指作为一个整体的元素,典型的是段落(paragraph)。
行内元素(inline) ,你可以把它理解为一部分块级元素,即一个块级元素包含一个或多个行内元素,典型的是run对象(我也不知道run应该翻译成什么)。
举个例子,你在Word回车换行开始输入文本,即自成一个段落,如果你选中其中的几个文字,那这些文字即为run对象

2.段落

段落(paragraph)是最主要的块级元素,比如说我们要往文档里添加文字,其实就添加段落,add_paragraph()可以添加一个段落,返回一个Paragraph对象

2.1 插入段落

往下添加段落,往指定段落前插入段落

from docx import Document
from docx.text.paragraph import Paragraph doc = Document() paragraph1 = doc.add_paragraph("这是第1个段落")
paragraph2 = doc.add_paragraph("这是第2个段落") # type: Paragraph
# 查看文档的所有列表
print(doc.paragraphs) # 返回包含文档所有段落的列表
# 在paragraph2这个段落的前面插入一个段落
paragraph2.insert_paragraph_before("额外插入的段落文字") doc.save("./test.docx")

2.1 段落样式

2.1.1 引用内置样式

设置Paragraph的style属性即可

from docx import Document
from docx.text.paragraph import Paragraph doc = Document() paragraph1 = doc.add_paragraph("这是第1个段落") # type: Paragraph
paragraph1.style = "List Bullet" # 设置段落样式为无序1 # 有序段落样式
doc.add_paragraph("测试段落List Number", style="List Number")
doc.add_paragraph("测试段落List Number", style="List Number") # 无序段落样式2
doc.add_paragraph("测试段落List Bullet 2", style="List Bullet 2")
doc.add_paragraph("测试段落List Bullet 2", style="List Bullet 2") doc.save("./test.docx") # 一些常用的段落样式
# styles = doc.styles
# paragraph_styles = [s for s in styles if s.type == WD_STYLE_TYPE.PARAGRAPH]
# for style in paragraph_styles:
# print(style.name)

有下面的样式

['Normal', 'Header', 'Footer', 'Heading 1', 'Heading 2', 'Heading 3', 'Heading 4', 'Heading 5', 'Heading 6', 'Heading 7', 'Heading 8',
'Heading 9', 'No Spacing', 'Title', 'Subtitle', 'List Paragraph', 'Body Text', 'Body Text 2', 'Body Text 3', 'List', 'List 2', 'List 3', 'List Bullet',
'List Bullet 2', 'List Bullet 3', 'List Number', 'List Number 2', 'List Number 3', 'List Continue', 'List Continue 2', 'List Continue 3',
'macro', 'Quote', 'Caption', 'Intense Quote', 'TOC Heading']

官方文档说段落样式名应该与微软Office保持一致,但我看了微软给出的样式名与其对不上,建议直接参考源码的给出的枚举值,位置是/docx/enum/style.py,或者官方文档:https://python-docx.readthedocs.io/en/latest/user/styles-understanding.html

2.1.2 段落对齐

from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT doc = Document() paragraph1 = doc.add_paragraph("这是居中对齐段落")
paragraph1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 居中对齐 doc.add_paragraph("这是左对齐段落").alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # 左对齐
doc.add_paragraph("这是右对齐段落").alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT # 右对齐
doc.add_paragraph("这是两端对齐段落").alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY # 两端对齐
doc.add_paragraph("这是分散对齐段落").alignment = WD_PARAGRAPH_ALIGNMENT.DISTRIBUTE # 分散对齐 doc.save("./test.docx")

2.1.3 段落设置

from docx import Document
from docx.shared import Pt doc = Document() paragraph1 = doc.add_paragraph("这是一个普通的段落这是一个普通的段落这是一个普通的段落这是一个普通的段落这是一个普通的段落这是一个普通的段落这是一个普通的段落这是一个普通的段落这是一个普通的段落这是一个普通的段落这是一个普通的段落这是一个普通的段落这是一个普通的段落这是一个普通的段落这是一个普通的段落")
# paragraph.line_spacing_rule = WD_LINE_SPACING.EXACTLY # 行距固定值
# paragraph.line_spacing_rule = WD_LINE_SPACING.MULTIPLE # 多倍行距
# paragraph1.paragraph_format.line_spacing = 1.5 # 行间距,1.5倍行距
paragraph1.paragraph_format.line_spacing = Pt(20) # 行间距,固定值20磅
paragraph1.paragraph_format.first_line_indent = Pt(10) # 首行缩进10磅
paragraph1.paragraph_format.space_before = Pt(30) # 段前30磅
paragraph1.paragraph_format.space_after = Pt(15) # 段后15磅 doc.save("./test.docx")

特别说明,首行缩进的单位支持Pt、Cm、Mm、Inches等,如果想要缩进几个字符,需要自己进行转换,因为不同字号字符占用的磅数是不同的(五号字体 = 10.5pt = 3.70mm = 14px = 0.146inch)

3.Run

Run是指段落中某一部分文本,我们取到某些文本之后才能设置它们的样式,例如加粗、斜体、下划线等

from docx import Document
from docx.oxml.ns import qn
from docx.shared import Pt, RGBColor
from docx.text.paragraph import Paragraph doc = Document() paragraph1 = doc.add_paragraph("这是第1个段落") # type: Paragraph
run1 = paragraph1.add_run("追加的文字")
run1.bold = True # 加粗
run1.italic = True # 斜体
run1.underline = True # 下划线
# run1.text = "修改之后的文字" # 修改文本
run1.font.name = "Times New Roman" # 设置西文是新罗马字体
run1.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') # 设置中文是宋体
run1.font.size = Pt(30) # 字号大小
run1.font.bold = False # 是否加粗
run1.font.italic = False # 是否斜体
run1.font.underline = False # 是否下划线
run1.font.shadow = True # 是否阴影
run1.font.color.rgb = RGBColor(56, 36, 255) # 字体颜色
# run1.font.color.rgb = RGBColor.from_string("ff0056") # 字体颜色 doc.save("./test.docx")

关于下划线,font.underline=True是单行下划线,其他样式可以参考官方给出的枚举值:https://python-docx.readthedocs.io/en/latest/api/enum/WdUnderline.html#wdunderline

当然也可以直接使用完整的字符样式

from docx import Document
from docx.text.paragraph import Paragraph doc = Document() paragraph1 = doc.add_paragraph("这是第1个段落") # type: Paragraph
run2 = paragraph1.add_run("又追加了文字")
run2.style = "Emphasis" # 使用“强调”样式 doc.save("./test.docx")

4.标题

可以通过add_heading()添加标题,标题等级用数字0-9表示,其实标题也是一个Paragraph对象

from docx import Document

doc = Document()
title = doc.add_heading(text="这是一级标题", level=1) # type: Paragraph
doc.add_heading(text="这是一级标题2", level=1)
doc.add_heading(text="这是二级标题", level=2)
print("text:", title.text) # text: 这是一级标题
print("style:", title.style) # style: _ParagraphStyle('Heading 1') id: 1883614425040
doc.save("./test.docx")

标题等级(level)默认是1,对应“标题1”,如果设置为0,对应“标题”

5.Document对象常用方法和属性

from docx import Document
from docx.shared import Inches
from docx.text.paragraph import Paragraph doc = Document() doc.add_heading("这是一个标题")
doc.add_paragraph("这是一个段落")
doc.add_page_break() # 插入一个分页符,实际上是调用新建段落的add_break(WD_BREAK.PAGE)
doc.add_picture('麒麟神兽.png', width=Inches(1.0)) # 添加一张图片,实际上是调用新建段落的run.add_picture
doc.add_table(5, 6) # 添加一个5行6列的表格 print(doc.paragraphs) # 返回所有段落(列表)
print(doc.tables) # 返回所有表格(列表)
print(doc.styles) # 返回默认Styles对象 doc.save("./test.docx")

的确分页了,这是第二页

参考链接:https://blog.csdn.net/qq_39147299/article/details/125179590

python-docx操作word文档详解的更多相关文章

  1. C#使用Docx操作word文档

    C#使用Docx编写word表格 最近接手了一个小Demo,要求使用Docx,将Xml文件中的数据转换为word文档,组织数据形成表格. 写了已经一周,网络上的知识太零碎,就想自己先统计整理出来,方便 ...

  2. C#中使用Spire.docx操作Word文档

    使用docx一段时间之后,一些地方还是不方便,然后就尝试寻找一种更加简便的方法. 之前有尝试过使用Npoi操作word表格,但是太烦人了,随后放弃,然后发现免费版本的spire不错,并且在莫种程度上比 ...

  3. 利用Python操作Word文档【图片】

    利用Python操作Word文档

  4. MYSQL服务器my.cnf配置文档详解

    MYSQL服务器my.cnf配置文档详解 硬件:内存16G [client] port = 3306 socket = /data/3306/mysql.sock [mysql] no-auto-re ...

  5. Python批量创建word文档(2)- 加图片和表格

    Python创建word文档,任务要求:小杨在一家公司上班,每天都需要给不同的客户发送word文档,以告知客户每日黄金价格.要求在文档开始处给出banner条,价格日期等用表格表示.最后贴上自己的联系 ...

  6. Python批量创建word文档(1)- 纯文字

    Python创建word文档,任务要求:小杨在一家公司上班,每天都需要给不同的客户发送word文档,以告知客户每日黄金价格.最后贴上自己的联系方式.代码如下: 1 ''' 2 #python根据需求新 ...

  7. iText操作word文档总结

    操作word文档的工具有很多,除了iText之外还有POI,但是POI擅长的功能是操作excel,虽然也可以操作word,但是能力有限,而且还有很多的bug,技术并不成熟,下面就重点介绍一种操作wor ...

  8. C#操作Word文档(加密、解密、对应书签插入分页符)

    原文:C#操作Word文档(加密.解密.对应书签插入分页符) 最近做一个项目,客户要求对已经生成好的RTF文件中的内容进行分页显示,由于之前对这方面没有什么了解,后来在网上也找了相关的资料,并结合自己 ...

  9. python自动化之word文档

    #########################docx文件############################ ''' .docx文件有很多结构,有3种不同的类型来表示 在最高一层,Docum ...

  10. Java文件操作系列[3]——使用jacob操作word文档

    Java对word文档的操作需要通过第三方组件实现,例如jacob.iText.POI和java2word等.jacob组件的功能最强大,可以操作word,Excel等格式的文件.该组件调用的的是操作 ...

随机推荐

  1. Ubuntu20.04和Docker环境下安装Redash中文版

    创建Ubunt20.04虚拟机,请参考:https://www.linuxidc.com/Linux/2020-03/162547.htm 一.安装基础环境: # 1.更换APT国内源 sudo se ...

  2. 2_jQuery

    一. jQuery介绍 1.1 什么是jQuery jQuery, 顾名思义, 也就是JavaScript和查询(Query), 它就是辅助JavaScript开发的js类库 1.2 jQuery核心 ...

  3. java中的自动拆装箱与缓存(Java核心技术阅读笔记)

    最近在读<深入理解java核心技术>,对于里面比较重要的知识点做一个记录! 众所周知,Java是一个面向对象的语言,而java中的基本数据类型却不是面向对象的!为了解决这个问题,Java为 ...

  4. Java注解(4):一个真实的Elasticsearch案例

    昨天把拼了一半的注解+Elasticsearch积木放下了,因为东西太多了拼不好,还容易乱.休息了一晚上接着来. 接着昨天,创建elasticsearch文档注解(相当于数据表的注解): /** * ...

  5. Hyperf使用ElasticSearch记录

    Hyperf 安装 Elasticsearch 协程客户端 hyperf/elasticsearch 主要为 elasticsearch-php 进行了客户端对象创建的工厂类封装,elasticsea ...

  6. 如何在IDEA中创建Module、以及怎样在IDEA中删除Module?

    文章目录 1.为何要使用Module? 2.Module的创建 3.如何从硬盘上删除module 1.为何要使用Module? 目前主流的大型项目都是分布式部署的,结构类型这种多Module结构.不同 ...

  7. 齐博x1嵌套-循环栏目,并列出子栏目下的内容

    嵌套,循环栏目,并列出子栏目下的内容. 代码如下: <div class="channel-list"> <div class="row"&g ...

  8. C语言表白窗口程序

    #include<windows.h> #include<stdio.h> #include<string.h> int main() { char modeCom ...

  9. Java多线程(5):CAS

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 在JDK1.5之前,Java的多线程都是靠synchronized来保证同步的,这会引起很多性能问题,例如死锁.但随着Java的不断完善,JNI ...

  10. vulnhub靶场之NOOB: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:NOOB: 1,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub.com/noob ...