使用python-docx处理word.docx文件
Posted xconline
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python-docx处理word.docx文件相关的知识,希望对你有一定的参考价值。
使用页眉和页脚
Word支持页眉和页脚。页眉是出现在每页顶部区域的文本,与正文分开,通常传达上下文信息,例如文档标题,作者,创建日期或页码。文档中的页面标题在页面之间是相同的,只是内容上的差别很小,例如节标题或页码的变化。页面标题也称为运行头。
一个页面页脚中的每个日日夜夜,只不过它出现在页面底部的页头类似。请勿将其与脚注混淆,脚注在页面之间并不统一。为简便起见,此处经常使用标头一词来指代标头或页脚对象,以使读者能够理解其对两种对象类型的适用性。
访问节的标题
页眉和页脚链接到一个节 ; 这允许每个节具有不同的页眉和/或页脚。例如,横向部分的标题可能比纵向部分的标题宽。
每个节对象都有一个.header
属性,可以访问_Header
该节的对象:
>>> document = Document()
>>> section = document.sections[0]
>>> header = section.header
>>> header
<docx.section._Header object at 0x...>
甲_Header
目的是总是存在于Section.header
,即使当没有报头该节限定。实际标头定义的存在由指示 _Header.is_linked_to_previous
:
>>> header.is_linked_to_previous
True
值为True
表示该_Header
对象不包含标题定义,并且该部分将显示与上一部分相同的标题。这种“继承”行为是递归的,因此“链接的”标头实际上是从具有标头定义的第一个先前部分中获得其定义的。在Word UI中,此“链接”状态指示为 “与先前相同”。
一个新文档没有标题(在它包含的单个部分中), 在这种情况下.is_linked_to_previous
也是True
如此。请注意,这种情况可能有点违反直觉,因为没有先前的节头可链接。在这种“没有上一个标题”的情况下,不显示任何标题。
添加标题(简单的情况)
只需编辑_Header
对象的内容即可将标题添加到新文档中。一个_Header
对象是一个“故事”容器及其内容进行编辑,就像一个Document
对象。请注意,就像新文档一样,新标题已经包含一个(空)段落:
>>> paragraph = header.paragraphs[0]
>>> paragraph.text = "Title of my document"
还要注意,添加内容(甚至只是访问header.paragraphs
)的行为添加了标头定义并更改了状态.is_linked_to_previous
:
>>> header.is_linked_to_previous
False
添加“分区”标题内容
具有多个“区域”的标题通常是使用精心放置的制表位来完成的。
中心和右对齐“区域”所需的制表位是Word中Header
and Footer
样式的一部分。如果您使用的是自定义模板而不是默认的 python-docx,则在模板中定义该样式可能很有意义。
插入的制表符(" "
)用于分隔左,中和右对齐的标题内容:
>>> paragraph = header.paragraphs[0]
>>> paragraph.text = "Left Text Center Text Right Text"
>>> paragraph.style = document.styles["Header"]
该Header
样式会自动应用到新的标题,因此Header
在这种情况下,不需要上面的第三行(应用样式),但此处包含了第三行以说明一般情况。
删除标题
可以通过分配True
其 .is_linked_to_previous
属性来删除不需要的标头:
>>> header.is_linked_to_previous = True
>>> header.is_linked_to_previous
True
标头的内容True
分配给时,将 不可撤消地删除.is_linked_to_previous
。
了解多节文档中的标题
“刚开始编辑”方法在简单情况下效果很好,但是要理解多节文档中的标题行为,一些简单的概念将很有帮助。这里简而言之:
- 每个部分可以有自己的标头定义(但不必如此)。
- 缺少标题定义的节将继承该节的标题。该
_Header.is_linked_to_previous
属性仅反映是否存在标头定义,False
何时存在定义,True
何时不存在。 - 缺少标题定义是默认状态。新文档没有定义的标题,新插入的节也没有。在这两种情况下均会
.is_linked_to_previous
报告True
。 - 如果
_Header
对象具有标题定义,则其内容为其自身的内容。如果不是,则其内容为确实具有标题定义的第一先前部分的内容。如果没有节具有标头定义,则在第一个节上添加一个新的标头定义,其他所有节都继承该标头定义。头定义的这种添加发生在第一次访问头内容时(可能是通过引用)header.paragraphs
。
添加标头定义(一般情况)
可以通过False
为其.is_linked_to_previous
属性分配一个明确的标头定义给缺少该标头的部分 :
>>> header.is_linked_to_previous
True
>>> header.is_linked_to_previous = False
>>> header.is_linked_to_previous
False
新添加的标头定义包含一个空的段落。请注意,以这种方式离开标头有时会很有用,因为它可以有效地“关闭”该节的标题和之后的节,直到下一个具有已定义标头的节。
分配False
给.is_linked_to_previous
已经具有标题定义的标题不会执行任何操作。
继承的内容自动定位
编辑标题的内容会考虑任何“继承”来编辑源标题的内容。因此,例如,如果第2部分标题是从第1部分继承的,并且您编辑了第2部分标题,则实际上是在更改第1部分标题的内容。除非您首先显式分配False
其.is_linked_to_previous
属性,否则不会为第2节添加新的标头定义。
以上是关于使用python-docx处理word.docx文件的主要内容,如果未能解决你的问题,请参考以下文章
python 操作 word 文档,使用 python-docx 操作 word docx 文档