Paragraph的简介在上一章已经介绍过,大家对Paragraph应该已经有了基本的了解。本章主要介绍Paragraph里各项属性和方法的说明及主要的使用场景及使用方式。
1、添加标题
标题由文档对象document添加,默认是添加一级标题,可以通过参数 level 设置,范围是1-9,如果设置为0,则表示是段落标题。
示例代码:
# 添加段落标题
document.add_heading('我是段落标题', level=0)
# 添加标题,默认是一级标题
document.add_heading('我是一级标题')
# 添加二级标题
document.add_heading('我是二级标题', level=2)
# 添加三级标题
document.add_heading('我是三级标题', level=3)
效果
2、添加段落和文本
段落(paragraph)由文档(document)创建,文本(run)由段落(paragraph)创建。
即一个文档由多个段落组成,一个段落由多个文本组成。
段落和文本通常是一起使用的。
2.1、普通文本
包括 内容文本,无序列表,有序列表,标题
示例:
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
p1 = document.add_paragraph()
r1 = p1.add_run()
r1.text = 'run2'
r1.bold = 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'
)
效果:
2.2、超链接
超链接在python-docx里不能像普通文本这样去处理,后面单独用一章去讲解在Word中如何对超链接进行读取,添加,更新,删除。
3、段落设置
3.1、对齐方式
段落对齐方式的设置主要用到Paragraph. alignmen这个属性。
新建的Paragraph默认段落设置为None。
paragraph = document.add_paragraph()
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置为居中对齐
WD_PARAGRAPH_ALIGNMENT是docx.enum.text. WD_PARAGRAPH_ALIGNMENT中定义的枚举类型常量。
常量1 | 说明2 | 值 |
---|---|---|
LEFT | 左对齐 | 0 |
CENTER | 居中 | 1 |
RIGHT | 右对齐 | 2 |
JUSTIFY | 两端对齐 | 3 |
DISTRIBUTE | 分散对齐 | 4 |
JUSTIFY_MED | 以中等字符压缩比调整 | 5 |
JUSTIFY_HI | 以高字符压缩比调整 | 6 |
JUSTIFY_LOW | 以低字符压缩比调整 | 7 |
THAI_JUSTIFY | 以泰语格式调整 | 8 |
前5种与Word中的定义相同
3.2、缩进
段落的缩进主要分为 左侧缩进、右侧缩进、首行/悬挂缩进 这三个部分。分别对应python-docx中docx.text.parfmt.ParagraphFormat中的left_indent、right_indent和first_line_indent三个属性。
这三个属性都可以设置值,属于Length类型,所以需要从docx.shared类中导入单位,主要单位有pt(磅)、cm(厘米)、inches(英寸)、mm(毫米),其中pt的值为Int类型,另外三个的值为float类型。
# 导入单位
from docx.shared import Pt, Cm, Inches
3.2.1、左侧缩进
左缩进属性为left_indent,默认值为None,赋值时,必须使用单位转换,如Cm(0.75)代表值为0.75厘米。
p2.paragraph_format.left_indent = Cm(1) # 左侧缩进1厘米
3.2.2、右侧缩进
右缩进属性为right_indent,默认值为None,赋值时,必须使用单位转换,如Inches(0.75)代表值为0.75英寸。效果同左侧缩进。
p2.paragraph_format.right_indent = Cm(0.75) # 右侧缩进
3.2.3、首行/悬挂缩进
首行/悬挂缩进使用first_line_indent属性来实现,当值大于0时,为首行缩进;当值为小于0时,为悬挂缩进,用法同left_indent。
p2.paragraph_format.left_indent = Cm(1) # 左侧缩进一厘米
p2.paragraph_format.first_line_indent = Pt(10.5) * 2 # 首行缩进2个汉字位; Pt(10.5)是五号字体的大小,x2表示两个字的大小
3.3、间距
段落的间距主要分为 段前间距、段后间距和行间距。分别对应python-docx中docx.text.parfmt.ParagraphFormat中的space_before,space_after和line_spacing、line_spacing_rule 几个属性。
前三个值为Length类型,设置时需要做单位转换。
3.3.1、段前间距
设置段前间距使用space_before,默认值为None,用法同left_indent。
paragraph.paragraph_format.space_before = Pt(10) # 段前间距10磅
3.3.2、段前间距
设置段后间距使用space_after,默认值为None,用法同left_indent。
paragraph.paragraph_format.space_after = Pt(20) # 段后间距20磅
3.3.3、行间距
设置行间距可以使用2个属性line_spacing和line_spacing_rule,这两个属性不用同时设置。
paragraph.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE # 1.5倍行距
line_spacing_rule的值是docx.enum.text. WD_LINE_SPACING中的枚举类型的常量,值的列表如下:
ONE_POINT_FIVE | 1.5倍行距 |
AT_LEAST | 最小行距 |
DOUBLE | 双倍行距 |
EXACTLY | 固定值 |
MULTIPLE | 多倍行距 |
SINGL | 单倍行距 |
当line_spacing_rule的值设置为EXACTLY或MULTIPLE时,需要对line_spacing属性进行设置具体的数值。
当只使用line_spacing属性时,如果值满足line_spacing_rule的规则,line_spacing_rule自动进行赋值。例如当line_spacing为2时,line_spacing_rule自动赋值为WD_LINE_SPACING.DOUBLE。
如果生成的Word文档,行间距特别大,则可以使用该属性对行间距进行设置。
4、样式
4.1、定义文档样式
创建一个新文档的时候,默认使用内置样式“Normal”,对内置样式做设置后,段落和文本就默认使用文档上的样式,这样就不需要为每一个段落去指定样式了,除非某个段落的样式比较特殊,再单独设置,通常是对段落里的文本做特殊设置来实现,段落本身没有样式的设置。
4.1.1、查看有哪些样式
可以通过以下代码查看:
doc=Document()
for s in doc.styles:
print(s)
结果:
4.1.2、常用样式的设置方式
doc = Document()
doc.styles["Normal"].font.name = "宋体" # 设置全局字体
doc.styles["Normal"]._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') # 如果想要设置中文字体,需要加上这一句
doc.styles["Normal"].font.color.rgb = RGBColor(0,0,0) # 设置正文全局颜色为黑色
doc.styles["Normal"].font.size = docx.shared.Pt(12) # 设置正文全局大小为12磅
doc.styles["Heading 1"].font.size = docx.shared.Pt(26)
doc.styles["Heading 2"].font.size = docx.shared.Pt(22)
# ... 可以逐项设置好
4.1.3、常用字号和颜色
Word里面用阿拉伯数字表示字体大小,磅数为字体大小的一半,比如说五号字体,对应的是字体大小是21,则对应的磅数是10.5磅。
常用颜色RGB | |||
---|---|---|---|
颜色 | R | G | B |
黑色 | 0 | 0 | 0 |
红色 | 255 | 0 | 0 |
蓝色 | 0 | 0 | 255 |
黄色 | 255 | 255 | 0 |
绿色 | 0 | 255 | 0 |
白色 | 255 | 255 | 255 |
4.2、段落样式
段落(paragraph)的样式继承自Document的样式,其本身没有样式(如字体,大小,颜色等)的设置,通常是对段落(paragraph)中的内容(runs)做设置,实现不同的显示效果。
4.3、设置文本样式
可以灵活的设置段落内文本的各种样式,设置方式参考以下代码。
import docx
from docx import Document
from docx.shared import Pt
from docx.oxml.ns import qn
from docx.shared import RGBColor
#创建一个word文档
doc = Document()
doc.styles["Normal"].font.name = "宋体" # 设置全局字体
doc.styles["Normal"]._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') # 如果想要设置中文字体,需要加上这一句
doc.styles["Normal"].font.color.rgb = RGBColor(0,0,0) # 设置正文全局颜色为黑色
doc.styles["Normal"].font.size = docx.shared.Pt(12) # 设置正文全局大小为12磅
doc.styles["Heading 1"].font.size = docx.shared.Pt(28)
doc.styles["Heading 2"].font.size = docx.shared.Pt(26)
# ... 可以逐项设置好
doc.add_paragraph("这是使用Document输入的内容")
paragraph1 = doc.add_paragraph()
run1 = paragraph1.add_run()
run1.font.name = "Times New Roman" # 设置西文是新罗马字体
run1.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') # 设置中文是宋体
run1.font.size = Pt(22) # 字号大小
run1.font.bold = False # 是否加粗
run1.font.italic = False # 是否斜体
run1.font.underline = False # 是否下划线
run1.bold = True # 加粗
run1.italic = True # 斜体
run1.underline = True # 下划线
# run1.font.underline = WD_UNDERLINE.DOUBLE # 双下划线
# run1.font.shadow = True # 是否阴影
# run1.font.strike = True # 是否删除线
# run1.font.double_strike = True # 是否双删除线
run1.font.color.rgb = RGBColor(0, 255, 0) # 字体颜色
# run1.font.color.rgb = RGBColor.from_string("ff0056") # 网页色
# run1.font.highlight_color = WD_COLOR_INDEX.YELLOW # 文本高亮颜色,此次设置为黄色
run1.text = "这是第一个段落的第一段内容。"
run2 = paragraph1.add_run()
run2.font.name = "Times New Roman" # 设置西文是新罗马字体
run2.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') # 设置中文是宋体
run2.font.size = Pt(16) # 字号大小
run2.font.bold = True # 是否加粗
run2.font.italic = False # 是否斜体
run2.font.underline = False # 是否下划线
run2.bold = True # 加粗
run2.italic = True # 斜体
run2.underline = True # 下划线
# run2.font.underline = WD_UNDERLINE.DOUBLE # 双下划线
# run2.font.shadow = True # 是否阴影
# run2.font.strike = True # 是否删除线
# run2.font.double_strike = True # 是否双删除线
run2.font.color.rgb = RGBColor(255, 0, 0) # 字体颜色
# run2.font.color.rgb = RGBColor.from_string("ff0056") # 网页色
# run2.font.highlight_color = WD_COLOR_INDEX.YELLOW # 文本高亮颜色,此次设置为黄色
run2.text = "这是第一个段落的第二段内容。"
doc.save("Run_Demo.docx")
效果:
下一章介绍如何替换Paragraph里的内容,是比较实用的一个场景,通常是在需要生成大量格式相同内容不同的文档,或频繁生成重复文档的时候使用。实现方式是基于Word模板动态替换其中的内容生成新文档。