上节对python如何定制word的页眉页脚做了详细介绍,当然,要作出一篇精彩的word文档,样式公布可没,本章继续介绍python如何玩转word的样式。
使用样式
python如何玩转word的样式
此页面使用前一页中开发的概念而不作介绍。如果术语不熟悉,请参阅word的样式参考。
访问样式
使用以下属性访问样式:
>>>document = Document()
>>>styles = document.styles
>>>styles
该对象按名称提供对定义样式的字典式访问:
>>>styles['Normal']
注意
内置样式使用其英文名称存储在WordprocessingML文件中,例如"标题1",即使在本地化版本的Word上工作的用户将在UI中看到本地语言名称,例如"Kop 1"。因为python-docx在WordprocessingML文件上运行,所以样式查找必须使用英文名称。此外部站点上提供的文档允许您创建本地语言名称和英语样式名称之间的映射::show =
用户定义的样式(也称为自定义样式)未进行本地化,并且使用与Word UI中显示的名称完全相同的名称进行访问。
该对象也是可迭代的。通过使用标识属性,可以生成定义样式的各种子集。例如,此代码将生成已定义段落样式的列表:
>>> fromdocx.enum.styleimportWD_STYLE_TYPE
>>>styles = document.styles
>>>paragraph_styles = [
...s for s in styles if s.type == WD_STYLE_TYPE.PARAGRAPH
...]
>>> forstyle in paragraph_styles:
...print(style.name)
...
Normal
Body Text
List Bullet
应用样式
应用样式
word的paragraph对象,每个有style属性。将样式对象分配给此属性将应用该样式:
>>>document = Document()
>>>paragraph = document.add_paragraph()
>>>paragraph.style
>>>paragraph.style.name
'Normal'
>>>paragraph.style = document.styles['Heading 1']
>>>paragraph.style.name
'Heading 1'
样式名称也可以直接分配,在这种情况下python-docx将为您执行查找:
>>>paragraph.style = 'List Bullet'
>>>paragraph.style
>>>paragraph.style.name
'List Bullet'
也可以使用样式对象或其名称在创建时应用样式:
>>>paragraph = document.add_paragraph(style='Body Text')
>>>paragraph.style.name
'Body Text'
>>>body_text_style = document.styles['Body Text']
>>>paragraph = document.add_paragraph(style=body_text_style)
>>>paragraph.style.name
'Body Text'
添加或删除样式
通过指定唯一名称和样式类型,可以向文档添加新样式:
>>> fromdocx.enum.styleimportWD_STYLE_TYPE
>>>styles = document.styles
>>>style = styles.add_style('Citation', WD_STYLE_TYPE.PARAGRAPH)
>>>style.name
'Citation'
>>>style.type
PARAGRAPH (1)
使用该base_style属性指定新样式应从以下格式继承格式设置的样式:
>>>style.base_style
None
>>>style.base_style = styles['Normal']
>>>style.base_style
>>>style.base_style.name
'Normal'
只需调用其方法即可从文档中删除样式 :
>>>styles = document.styles
>>>len(styles)
10
>>>styles['Citation'].delete()
>>>len(styles)
9
注意
该Style.delete()方法从文档中删除样式的定义。它不会影响应用该样式的文档中的内容。具有未在文档中定义的样式的内容使用该内容对象的默认样式来呈现,例如在段落的情况下为"正常"。
定义字符格式
字符,段落和表格样式都可以指定要应用于具有该样式的内容的字符格式。可以在样式中指定可以直接应用于文本的所有字符格式。示例包括字体字体和大小,粗体,斜体和下划线。
这三种样式类型中的每一种都具有 提供对象访问的属性。样式的对象提供了获取和设置该样式的字符格式的属性。
这里提供了几个例子。有关完整的可用属性集,请参阅API文档。
可以像这样访问样式的字体:
>>> fromdocximportDocument
>>>document = Document()
>>>style = document.styles['Normal']
>>>font = style.font
字体和大小设置如下:
>>> fromdocx.sharedimportPt
>>>font.name = 'Calibri'
>>>font.size = Pt(12)
许多字体属性是三值,这意味着他们可以采取的价值观 True,False和None。True表示该物业处于"开启"状态,表示该物业处于False"关闭"状态。从概念上讲,该None值意味着"继承"。由于样式存在于继承层次结构中,因此能够在层次结构中的正确位置指定属性非常重要,通常尽可能远离层次结构。例如,如果所有标题都应该是Arial字体,那么在标题1 样式上设置该属性并使标题2从标题1继承更有意义。
大胆和斜体都是三态属性,如全帽,删除线,上标等等。有关完整列表,请参阅API文档:
>>>font.bold, font.italic
(None, None)
>>>font.italic = True
>>>font.italic
True
>>>font.italic = False
>>>font.italic
False
>>>font.italic = None
>>>font.italic
None
下划线是一种特殊情况。它是三态属性和枚举值属性的混合体。True意味着单一下划线,是迄今为止最常见的。False意味着没有下划线,但None如果不需要下划线,则更经常是正确的选择,因为很少从基础样式继承下划线。其他形式的下划线(如double或dashed)是使用枚举的成员指定的:
>>>font.underline
None
>>>font.underline = True
>>># or perhaps
>>>font.underline = WD_UNDERLINE.DOT_DASH
定义段落格式
段落样式和表格样式都允许指定段落格式。这些样式通过其属性提供对对象的访问。
段落格式包括布局行为,例如对齐,缩进,前后空格,之前的分页控制。有关可用属性的完整列表,请参阅该对象的API文档页面。
下面是一个如何创建一个段落样式的示例,该段落样式具有1/4英寸的悬挂缩进,上方12个点的间距:
>>> fromdocx.enum.styleimportWD_STYLE_TYPE
>>> fromdocx.sharedimportInches, Pt
>>>document = Document()
>>>style = document.styles.add_style('Indent', WD_STYLE_TYPE.PARAGRAPH)
>>>paragraph_format = style.paragraph_format
>>>paragraph_format.left_indent = Inches(0.25)
>>>paragraph_format.first_line_indent = Inches(-0.25)
>>>paragraph_format.space_before = Pt(12)
>>>paragraph_format.widow_control = True
使用段落特定的样式属性
段落样式具有一个 属性,该属性指定要应用于在该样式的段落之后插入的新段落的样式。当样式通常只在序列中出现一次(例如标题)时,这非常有用。在这种情况下,完成标题后,段落样式可以自动设置回主体样式。
在最常见的情况(正文段落)中,后续段落应该与当前段落具有相同的样式。如果未指定下一个段落样式,则默认情况下通过应用相同样式来处理此情况。
以下是如何将标题1样式的下一个段落样式更改为正文文本的示例 :
>>> fromdocximportDocument
>>>document = Document()
>>>styles = document.styles
>>>styles['Heading 1'].next_paragraph_style = styles['Body Text']
可以通过分配None或样式本身来恢复默认行为:
>>>heading_1_style = styles['Heading 1']
>>>heading_1_style.next_paragraph_style.name
'Body Text'
>>>heading_1_style.next_paragraph_style = heading_1_style
>>>heading_1_style.next_paragraph_style.name
'Heading 1'
>>>heading_1_style.next_paragraph_style = None
>>>heading_1_style.next_paragraph_style.name
'Heading 1'
控制样式在Word UI中的显示方式
样式的属性分为两类,行为属性 和格式属性。其行为属性控制样式在Word UI中出现的时间和位置。其格式设置属性确定应用样式的内容的格式,例如字体的大小及其段落缩进。
一种风格有五种行为属性:
·
·
·
·
·
有关这些行为属性如何交互的说明,请参阅" 的" 部分,以确定样式在Word UI中的显示时间和位置。
该priority属性采用整数值。其他四种样式行为属性是三态,这意味着它们可以取值True(on),False(off)或None(inherit)。
在样式库中显示样式
以下代码将使"正文文本"段落样式首先显示在样式库中:
>>> fromdocximportDocument
>>>document = Document()
>>>style = document.styles['Body Text']
>>>style.hidden = False
>>>style.quick_style = True
>>>style.priorty = 1
从样式库中删除样式
此代码将从样式库中删除"正常"段落样式,但允许它保留在推荐列表中:
>>>style = document.styles['Normal']
>>>style.hidden = False
>>>style.quick_style = False
使用潜在样式
有关如何定义尚未在.docx文件的styles.xml部分中定义的内置样式的行为属性的说明, 请参阅的和部分 。
访问文档中的潜在样式
可以从styles对象访问文档中的潜在样式:
>>>document = Document()
>>>latent_styles = document.styles.latent_styles
一个对象支持len(),迭代和样式名字典式的访问:
>>>len(latent_styles)
161
>>>latent_style_names = [ls.name forls in latent_styles]
>>>latent_style_names
['Normal', 'Heading 1', 'Heading 2', ... 'TOC Heading']
>>>latent_quote = latent_styles['Quote']
>>>latent_quote
>>>latent_quote.priority
29
更改潜在样式默认值
该对象还提供对当前文档中内置样式的默认行为属性的访问。这些默认值为 定义的任何未定义属性以及没有明确潜在样式定义的内置样式的所有行为属性提供值。有关完整可用属性集的对象,请参阅API文档 :
>>>latent_styles.default_to_locked
False
>>>latent_styles.default_to_locked = True
>>>latent_styles.default_to_locked
True
添加潜在的样式定义
可以使用方法添加新的潜在样式 。此代码为内置样式"List Bullet"添加了一种新的潜在样式,将其设置为显示在样式库中:
>>>latent_style = latent_styles['List Bullet']
KeyError: no latent style with name 'List Bullet'
>>>latent_style = latent_styles.add_latent_style('List Bullet')
>>>latent_style.hidden = False
>>>latent_style.priority = 2
>>>latent_style.quick_style = True
删除潜在的样式定义
可以通过调用其delete()方法删除潜在样式定义 :
>>>latent_styles['Light Grid']
>>>latent_styles['Light Grid'].delete()
>>>latent_styles['Light Grid']
KeyError: no latent style with name 'Light Grid'
有关样式的介绍,就暂时到这里,老铁们有什么意见和需求请尽管提,觉得不错的点个大赞。