天天看点

【python-docx 07】使用word样式

定义样式

使用

Document.styles

属性定义样式:

>>> document = Document()
>>> styles = document.styles
>>> styles
<docx.styles.styles.Styles object at 0x10a7c4f50>
           

Styles对象可以像字典一样访问,key为样式名称:

>>> styles['Normal']
<docx.styles.style._ParagraphStyle object at <0x10a7c4f6b>
           
内置样式使用其英文名称存储在WordprocessingML文件中,例如:“Heading 1”,但是在中文版的word中,我们看到的是‘标题1’。由于python-docx在WordprocessingML文件上运行,因此样式查找必须使用英文名称。此外部站点上提供的文档允许您创建本地语言名称和英语样式名称之间的映射:外部链接

Styles对象是可迭代的。例如,以下代码将生成段落样式的列表:

>>> from docx.enum.style import WD_STYLE_TYPE
>>> styles = document.styles
>>> paragraph_styles = [
...     s for s in styles if s.type == WD_STYLE_TYPE.PARAGRAPH
... ]
>>> for style in paragraph_styles:
...     print(style.name)
...
Normal
Body Text
List Bullet
           

应用样式

Paragraph,Run和Table对象每个都有一个style属性。将样式对象分配给此属性将应用该样式:

document = Document()
paragraph = document.add_paragraph()
print(paragraph.style.name)
# 'Normal'
paragraph.style = document.styles['Heading 1']
print(paragraph.style.name)
# 'Heading 1'
           

样式名称也可以直接分配给对象,python-docx会自动去查找样式:

paragraph.style = 'List Bullet'
print(paragraph.style.name)
# 'List Bullet'
           

也可以使用样式对象或其名称在创建时应用样式:

paragraph = document.add_paragraph(style='Body Text')
print(paragraph.style.name)
# 'Body Text'

body_text_style = document.styles['Body Text']
paragraph = document.add_paragraph(style=body_text_style)
print(paragraph.style.name)
# 'Body Text'
           

添加或者删除样式

通过指定唯一名称和样式类型,可以向文档添加新样式:

from docx.enum.style import WD_STYLE_TYPE
styles = document.styles
style = styles.add_style('Citation', WD_STYLE_TYPE.PARAGRAPH)
print(style.name)
# 'Citation'
print(style.type)
# PARAGRAPH (1)
           

使用

base_style

属性指定新样式应从以下格式继承格式设置的样式:

print(style.base_style)
# None
style.base_style = styles['Normal']
print(style.base_style.name)
# 'Normal'
           

只需调用delete()方法即可从文档中删除样式:

styles = document.styles
print(len(styles))
# 10
styles['Citation'].delete()
print(len(styles))
# 9
           
Style.delete()方法从文档中删除样式。它不会影响应用该样式的文档中的内容,使用该内容对象的默认样式来呈现。

定义字符格式

字符,段落和表格样式都可以指定要应用于具有该样式内容的字符格式。可以在样式中指定能直接应用于文本的所有字符格式。包括字体字体和大小,粗体,斜体和下划线。

这三种样式类型中的每一种都具有Font对象的font属性。样式的Font对象提供用于获取和设置该样式的字符格式的属性。

这里提供了几个例子。有关完整的可用属性集,请参阅Font API文档。

可以像这样访问文字的字体:

from docx import Document
document = Document()
style = document.styles['Normal']
font = style.font
           

字体和大小设置如下:

from docx.shared import Pt
font.name = '宋体'
font.size = Pt(12)
           

许多字体属性都是三态,True,False和None。

True表示属性为“on”,

False表示属性为“off”。

从概念上讲,None值表示“继承”。

由于样式存在于继承层次结构中,因此在层次结构中的正确位置指定属性非常重要,通常尽可能远离层次结构。

例如,如果所有’标题’都应该是Arial字体,那么在’标题1’样式上设置该属性并使’标题2’从’标题1’继承更有意义。

粗体和斜体都是三态的,如全大写,删除线,上标等等。有关这类属性的完整列表,请参阅Font API文档:

# 斜体
font.italic = True  
font.italic = False
font.italic = None
           

下划线是一种特殊情况。它是三态属性和枚举值属性的混合体。

True表示单个下划线,是迄今为止最常见的。

False意味着没有下划线,但更多情况下,如果不需要下划线,则None是正确的选择。

其他形式的下划线(如double或dashed)是使用

WD_UNDERLINE

里的方法指定:

from docx.enum.text import WD_UNDERLINE
font.underline = True
font.underline = WD_UNDERLINE.DOT_DASH  # 点划线
           

定义段落格式

段落样式和表格样式都允许指定段落格式。这些样式通过其

paragraph_format

属性提供对

ParagraphFormat

对象的访问。

段落格式包括布局行为,例如对齐,缩进,前后空格,之前的分页和孤行控制。有关可用属性的完整列表,请参阅ParagraphFormat对象的API文档页面API文档页面。

下面是如何创建一个段落样式的示例,该段落样式具有1/4英寸的悬挂缩进,上方12个点的间距以及孤行控制:

from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Inches, 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
           

使用段落特定的样式属性

段落样式具有

next_paragraph_style

属性,该属性指定应用在该段落之后插入的新段落的样式。当样式通常只在序列中出现一次(例如标题)时,这非常有用。在这种情况下,完成标题后,段落样式可以自动设置回主体样式。

在最常见的情况(正文段落)中,后续段落应该与当前段落具有相同的样式。如果未指定下一个段落样式,则默认情况下通过应用相同样式来处理。

以下是如何将’标题1’样式的下一个段落样式更改为正文文本的示例:

from docx import Document
document = Document()
styles = document.styles

styles['Heading 1'].next_paragraph_style = styles['Body Text']
           

通过指定None或样式本身可以恢复默认:

heading_1_style = styles['Heading 1']
print(heading_1_style.next_paragraph_style.name)
# 'Body Text'

heading_1_style.next_paragraph_style = heading_1_style
print(heading_1_style.next_paragraph_style.name)
# 'Heading 1'

heading_1_style.next_paragraph_style = None
print(heading_1_style.next_paragraph_style.name)
# 'Heading 1'
           

控制样式在Word中的显示方式

样式的属性分为两类,行为属性和格式属性。

其行为属性控制样式在Word中出现的时间和位置。

其格式设置属性确定应用样式的内容的格式,例如字体的大小及其段落缩进。

一共有五种行为属性:

  • hidden
  • unhide_when_used
  • priority
  • quick_style
  • locked

priority属性采用整数值。

其他四种样式行为属性是三态,True(on),False(off)或None(inherit)。

在样式库中显示样式

以下代码将使“Body Text”段落样式首先显示在样式库中:

from docx import Document
document = Document()
style = document.styles['Body Text']

style.hidden = False
style.quick_style = True
style.priorty = 1 # 优先级
           

从样式库中删除样式

此代码将从样式库中删除“Normal”段落样式,但允许它保留在推荐列表中:

style = document.styles['Normal']

style.hidden = False
style.quick_style = False
           

使用潜在样式

有关潜在样式如何定义尚未在.docx文件的styles.xml部分中定义的内置样式的行为属性的说明。

访问文档中的潜在样式

可以从styles对象访问文档中的潜在样式:

document = Document()
latent_styles = document.styles.latent_styles
           

LatentStyles

对象支持

len()

,迭代和字典样式的访问方法:

len(latent_styles)
# 161
latent_style_names = [ls.name for ls in latent_styles]
print(latent_style_names)
# ['Normal', 'Heading 1', 'Heading 2', ... 'TOC Heading']
latent_quote = latent_styles['Quote']
print(latent_quote)
# <docx.styles.latent.LatentStyle object at 0x10a7c4f50>
           

更改潜在样式默认值

LatentStyles

对象还提供对当前文档中内置样式的默认行为属性的访问。这些默认值为

_LatentStyle

定义的任何未定义属性以及没有明确潜在样式定义的内置样式的所有行为属性提供值。

有关完整的可用属性集,请参阅LatentStyles对象的API文档:

>>> latent_styles.default_to_locked
False
>>> latent_styles.default_to_locked = True
>>> latent_styles.default_to_locked
True
           

添加潜在样式定义

可以使用

LatentStyles上的add_latent_style()

方法添加新的潜在样式。此代码为内置样式“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']
# <docx.styles.latent.LatentStyle object at 0x10a7c4f50>
latent_styles['Light Grid'].delete()