使用python-docx处理word.docx文件

Posted xconline

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python-docx处理word.docx文件相关的知识,希望对你有一定的参考价值。

使用文本

为了有效地处理文本,重要的是要先对段落等块级元素和运行等内联级对象有所了解。

块级与内联文本对象

该段落是Word中的主要块级对象。

块级项在其左右边缘之间流动其包含的文本,每当文本超出其右边界时,就会增加一行。对于段落,边界通常是页边距,但是如果页面按列布局,边界也可以是列边界,如果段落出现在表格单元格内,则边界也可以是单元格边界。

表也??是块级对象。

内联对象是出现在块级项目内部的内容的一部分。一个例子是一个以粗体显示的单词或一个全大写的句子。最常见的内联对象是run块容器中的所有内容都在内联对象内部。通常,一个段落包含一个或多个运行,每个运行包含该段落的文本的一部分。

块级项目的属性指定其在页面上的位置,例如段落前后的缩进和空格。内联项的属性通常指定显示内容的字体,如字体,字体大小,粗体和斜体。

段落属性

段落具有多种属性,可以指定其在容器(通常是页面)中的位置以及将内容划分为不同行的方式。

通常,最好定义一个段落样式,将这些属性收集到一个有意义的组中,然后将适当的样式应用于每个段落,而不是将这些属性直接直接应用于每个段落。这类似于级联样式表(CSS)与HTML一起工作的方式。此处描述的所有段落属性都可以使用样式设置,也可以直接应用于段落。

ParagraphFormat使用段落paragraph_format属性可以使用的对象 访问段落的格式设置属性 

水平对齐(对齐)

也称为对齐,可以使用枚举WD_PARAGRAPH_ALIGNMENT的值将段落的水平对齐方式设置为左对齐,居中对齐,右对齐或完全对齐(左右对齐) 

>>> from docx.enum.text import WD_ALIGN_PARAGRAPH
>>> document = Document()
>>> paragraph = document.add_paragraph()
>>> paragraph_format = paragraph.paragraph_format

>>> paragraph_format.alignment
None  # indicating alignment is inherited from the style hierarchy
>>> paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
>>> paragraph_format.alignment
CENTER (1)

缩进

缩进是段落和其容器边缘之间的水平空间,通常是页边距。段落可以在左侧和右侧分别缩进。第一行的缩进也可以与该段落的其余部分不同。缩进的第一行比段落的其余部分缩进缩进较少的第一行具有悬挂缩进

压痕被指定使用Length的值,诸如InchesPt,或 Cm负值有效,并且使段落与边距重叠指定的数量。None表示缩进值是从样式层次结构继承的。分配None给缩进属性将删除任何直接应用的缩进设置,并从样式层次结构恢复继承:

>>> from docx.shared import Inches
>>> paragraph = document.add_paragraph()
>>> paragraph_format = paragraph.paragraph_format

>>> paragraph_format.left_indent
None  # indicating indentation is inherited from the style hierarchy
>>> paragraph_format.left_indent = Inches(0.5)
>>> paragraph_format.left_indent
457200
>>> paragraph_format.left_indent.inches
0.5

右侧缩进以类似的方式工作:

>>> from docx.shared import Pt
>>> paragraph_format.right_indent
None
>>> paragraph_format.right_indent = Pt(24)
>>> paragraph_format.right_indent
304800
>>> paragraph_format.right_indent.pt
24.0

第一行缩进使用first_line_indent属性指定, 并且相对于左缩进进行解释。负值表示悬挂缩进:

>>> paragraph_format.first_line_indent
None
>>> paragraph_format.first_line_indent = Inches(-0.25)
>>> paragraph_format.first_line_indent
-228600
>>> paragraph_format.first_line_indent.inches
-0.25

制表位

制表位决定了段落文字中制表符的呈现方式。特别是,它指定了制表符后面的文本的开始位置,与该位置对齐的方式,以及一个可选的前导字符,它将填充制表符跨越的水平空间。

段落或样式的制表位包含在TabStops使用以下tab_stops属性 访问对象中ParagraphFormat

>>> tab_stops = paragraph_format.tab_stops
>>> tab_stops
<docx.text.tabstops.TabStops object at 0x106b802d8>

使用以下add_tab_stop()方法添加新的制表位

>>> tab_stop = tab_stops.add_tab_stop(Inches(1.5))
>>> tab_stop.position
1371600
>>> tab_stop.position.inches
1.5

对齐方式默认为左对齐,但可以通过提供WD_TAB_ALIGNMENT枚举的成员来指定 前导字符默认为空格,但可以通过提供WD_TAB_LEADER 枚举的成员来指定

>>> from docx.enum.text import WD_TAB_ALIGNMENT, WD_TAB_LEADER
>>> tab_stop = tab_stops.add_tab_stop(Inches(1.5), WD_TAB_ALIGNMENT.RIGHT, WD_TAB_LEADER.DOTS)
>>> print(tab_stop.alignment)
RIGHT (2)
>>> print(tab_stop.leader)
DOTS (1)

使用以下命令上的序列语义可以访问现有的制表位TabStops

>>> tab_stops[0]
<docx.text.tabstops.TabStop object at 0x1105427e8>

TabStopsTabStopAPI文档中提供了更多详细信息

段落间距

space_before和 space_after特性分别控制随后的段落之间的间隔,前后段落控制间距。间段间距折叠页面布局中,这意味着两个段落之间的间距是最大的的 space_after为第一段和space_before第二段的。段落间距通常指定为一个Length值 Pt

>>> paragraph_format.space_before, paragraph_format.space_after
(None, None)  # inherited by default

>>> paragraph_format.space_before = Pt(18)
>>> paragraph_format.space_before.pt
18.0

>>> paragraph_format.space_after = Pt(12)
>>> paragraph_format.space_after.pt
12.0

行间距

行距是一段段落中后续基线之间的距离。行距可以指定为绝对距离或相对于行高(基本上是所用字体的磅值)。典型的绝对度量值为18分。典型的相对度量是双倍间距(2.0行高)。默认行距是单行距(1.0行高)。

行间距由line_spacing和 line_spacing_rule属性的相互作用控制 。 line_spacing是一个Length值,(小)值float或无。Length值表示的绝对距离。float表示许多线高。None表示行间距是继承的。line_spacing_ruleWD_LINE_SPACING枚举的成员,None

>>> from docx.shared import Length
>>> paragraph_format.line_spacing
None
>>> paragraph_format.line_spacing_rule
None

>>> paragraph_format.line_spacing = Pt(18)
>>> isinstance(paragraph_format.line_spacing, Length)
True
>>> paragraph_format.line_spacing.pt
18.0
>>> paragraph_format.line_spacing_rule
EXACTLY (4)

>>> paragraph_format.line_spacing = 1.75
>>> paragraph_format.line_spacing
1.75
>>> paragraph_format.line_spacing_rule
MULTIPLE (5)

分页性能

四个段落属性,keep_together, keep_with_next, page_break_before,以及 widow_control如何接近页边界款的行为的控制方面。

keep_together 导致整个段落出现在同一页面上,如果该段落在两个页面之间被打断,则会在该段落之前发出分页符。

keep_with_next与下一个段落在同一页面上保留一个段落。例如,这可用于使节标题与节的第一段在同一页面上。

page_break_before导致将段落放置在新页面的顶部。可以在章节标题上使用它,以确保章节在新页面上开始。

widow_control 中断页面以避免将段落的第一行或最后一行与段落的其余部分放在单独的页面上。

这些属性的所有四个都是三态,这意味着他们可以采取的价值 TrueFalseNoneNone指示属性值是从样式层次结构继承的。True表示“打开”,False表示“关闭”:

>>> paragraph_format.keep_together
None  # all four inherit by default
>>> paragraph_format.keep_with_next = True
>>> paragraph_format.keep_with_next
True
>>> paragraph_format.page_break_before = False
>>> paragraph_format.page_break_before
False

应用字符格式

字符格式在运行级别应用。示例包括字体字体和大小,粗体,斜体和下划线。

一个Run对象有一个只读font属性提供访问Font对象。运行的Font对象提供用于获取和设置该运行的字符格式的属性。

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

可以通过以下方式访问运行的字体:

>>> from docx import Document
>>> document = Document()
>>> run = document.add_paragraph().add_run()
>>> font = run.font

字体和大小设置如下:

>>> from docx.shared import Pt
>>> font.name = ‘Calibri‘
>>> font.size = Pt(12)

许多字体属性是三态,这意味着他们可以采取的价值观 TrueFalseNoneTrue表示该属性为“开”,表示该属性为False“关”。从概念上讲,该None值表示“继承”。样式继承层次结构中存在一个运行,默认情况下,运行从该层次结构继承其字符格式。使用该Font对象直接应用的任何字符格式都会覆盖继承的值。

粗体和斜体是三态属性,全大写字母,删除线,上标和许多其他属性也是如此。请参阅FontAPI文档以获取完整列表:

>>> 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如果不需要下划线,通常是正确的选择。WD_UNDERLINE 枚举的成员指定其他形式的下划线,例如双精度或虚线。

>>> font.underline
None
>>> font.underline = True
>>> # or perhaps
>>> font.underline = WD_UNDERLINE.DOT_DASH

字体颜色

每个Font对象都有一个ColorFormat对象,对象可通过其只读color属性访问其颜色

将特定的RGB颜色应用于字体:

>>> from docx.shared import RGBColor
>>> font.color.rgb = RGBColor(0x42, 0x24, 0xE9)

还可以通过分配MSO_THEME_COLOR_INDEX枚举的成员来将字体设置为主题颜色 

>>> from docx.enum.dml import MSO_THEME_COLOR
>>> font.color.theme_color = MSO_THEME_COLOR.ACCENT_1

字体的颜色可以通过分配被恢复到其默认(继承)值 None,以任一rgb或 theme_color属性ColorFormat

>>> font.color.rgb = None

确定字体的颜色首先要确定其颜色类型:

>>> font.color.type
RGB (1)

type属性的值可以是MSO_COLOR_TYPE枚举的成员,也可以是“ 无”。MSO_COLOR_TYPE.RGB表示它是RGB颜色。MSO_COLOR_TYPE.THEME指示主题颜色。 MSO_COLOR_TYPE.AUTO指示其值由应用程序自动确定,通常设置为黑色。(此值相对很少。)None 指示未应用颜色,并且颜色是从样式层次结构继承的;这是最常见的情况。

当颜色类型为MSO_COLOR_TYPE.RGB时,该rgb 属性将是一个RGBColor指示RGB颜色值:

>>> font.color.rgb
RGBColor(0x42, 0x24, 0xe9)

当颜色类型为MSO_COLOR_TYPE.THEME时,该 theme_color属性将成为MSO_THEME_COLOR_INDEX的成员, 指示主题颜色:

>>> font.color.theme_color
ACCENT_1 (5)

以上是关于使用python-docx处理word.docx文件的主要内容,如果未能解决你的问题,请参考以下文章

使用python-docx处理word.docx文件

使用python-docx处理word.docx文件

使用python-docx处理word.docx文件

python 操作 word 文档,使用 python-docx 操作 word docx 文档

使用Python操纵具有链接和跟踪更改的Microsoft Word DOCX文件

使用docx4j编程式地创建复杂的Word(.docx)文档