我正在使用Python-docx来创建和编写Word文档。
如何使用python-docx将文本放入文档标题?
http://image.prntscr.com/image/8757b4e6d6f545a5ab6a08a161e4c55e.png
由于
答案 0 :(得分:4)
不幸的是,此功能尚未实现。链接到的@SamRogers页面是增强提议的一部分(又名。"分析页面")。然而,由@eupharis进行的实施正在进行中,因此可能在一个月左右的时间内可用。如果你想跟随它,正在进行的拉取请求就在这里。 https://github.com/python-openxml/python-docx/pull/291
答案 1 :(得分:2)
我一直在使用它
header = document.sections[0].header
header.add_paragraph('Test Header')
Header是BlockItemContainer的子类,从中继承了与Document相同的内容编辑功能,例如.add_paragraph()。
答案 2 :(得分:1)
(关于这个问题很老......)
我在我的项目中使用了一种解决方法,我的“客户端”在不同页面中需要不同的标题:
使用python-docx和分节符创建文档
执行带有两个参数的单词宏文件(* .xlsm):( 1)fileName = path,docTitle =要在页脚中插入的文档的标题。
宏文件将打开新创建的文档,并添加已存在于宏文件中的页眉和页脚。如果页眉和页脚文本需要改变,则需要修改它。
Pyton代码:
wd = win32com.client.Dispatch("Word.Application")
wd.Visible = False
doc = wd.Documents.Open(pathToDOCM) # path here
wd.Run("Main.RunMain",fileName, docTitle) # 2 args
doc.Close()
del wd
VBA代码:
VBA (inside *.xlsm) code:
Sub RunInside()
Call RunMain("C:\Users\???\dokument.docx", "test")
End Sub
Sub RunMain(wordDocument As String, wordTitle As String)
' Create Headers
Call CreateHeaders(wordDocument, wordTitle)
End Sub
Sub CreateHeaders(wordDocument As String, wordTitle As String)
Dim i As Integer
Dim outputName As String
Dim aDoc As Document
Dim oApp As Word.Application
Dim oSec As Word.Section
Dim oDoc As Word.Document
Dim hdr1, hdr2 As HeaderFooter
Dim ftr1, ftr2 As HeaderFooter
'Create a new document in Word
Set oApp = New Word.Application
'Set oDoc = oApp.Documents.Add
Set oDoc = oApp.Documents.Open(wordDocument)
'Set aDoc as active document
Set aDoc = ActiveDocument
oDoc.BuiltInDocumentProperties("Title") = wordTitle
For i = 1 To 9:
Set hdr1 = aDoc.Sections(i).Headers(wdHeaderFooterPrimary)
Set hdr2 = oDoc.Sections(i).Headers(wdHeaderFooterPrimary)
Set ftr1 = aDoc.Sections(i).Footers(wdHeaderFooterPrimary)
Set ftr2 = oDoc.Sections(i).Footers(wdHeaderFooterPrimary)
If i > 1 Then
With oDoc.Sections(i).Headers(wdHeaderFooterPrimary)
.LinkToPrevious = False
End With
With oDoc.Sections(i).Footers(wdHeaderFooterPrimary)
.LinkToPrevious = False
End With
End If
hdr1.Range.Copy
hdr2.Range.Paste
ftr1.Range.Copy
ftr2.Range.Paste
Next i
outputName = Left(wordDocument, Len(wordDocument) - 5)
outputName = outputName + ".pdf"
oDoc.SaveAs outputName, 17
oDoc.Close SaveChanges:=wdSaveChanges
Set oDoc = Nothing
Set aDoc = Nothing
End Sub
最后评论: 代码循环遍历不同的部分并复制粘贴页眉和页脚。它还将文档保存为* .PDF。
答案 3 :(得分:1)
此功能已实现。参见:https://python-docx.readthedocs.io/en/latest/dev/analysis/features/header.html
您可以使用python-docx将文本添加到word文档的标题中,如下所示:
header = document.sections[0].header
head = header.paragraphs[0]
head.text = 'Add Your Text'
答案 4 :(得分:1)
对于那些希望通过docx设置自定义标头的人:
我必须使用几个软件包才能使其正常工作。我的用例是这样的:我生成了多个模板,然后将它们合并在一起,但是当我将它们与docx合并时,来自主文件(以下)的标头应用于所有部分,并且所有部分都标记为linkedToPrevious = True,尽管被=原始文件中为False。但是,docx可以很好地完成附加文件的工作,并使其另一端无错误地出现,因此我决定找到一种使之工作的方法。参考代码:
INT
所以现在我有了一个包含所有适当章节的主文档(combined.docx),但是标题需要进行调整。您无法使用docx遍历文档,获取当前所在的部分并进行调整或将标题链接设置为false。如果设置为False,则完全擦除标题。您可以显式调用该部分并进行调整,但是由于该部分之后的所有内容都链接到上一部分,因此您将在此之后更改文档的其余部分。所以我加入了win32com:
获取节的数量,然后使用win32com向后迭代。这样,当您删除linkedToPrevious时,就可以将标头保留在适当的位置。
master = Document(files[0])
composer = Composer(master)
footnotes_doc = Document('chapters/footnotes.docx')
for file in files[1:]:
mergeDoc = Document(file)
composer.append(mergeDoc)
composer.append(footnotes_doc)
composer.save("chapters/combined.docx")
好的,现在文档已准备好编辑标头,我们可以轻松地使用docx进行操作,现在无需担心。首先,我们需要解析XML(我使用docx访问该XML,然后将其提供给lxml)以获取所需部分的位置:
def getSections(document):
sectionArray = {}
sections = document.sections
x = 1
for section in sections:
sectionArray[x] = section
x += 1
return sectionArray
start_doc = Document('chapters/combined.docx')
listArray = getSections(start_doc) #gets an array of all sections
keylist = list(reversed(sorted(listArray.keys()))) ##now reverse it
word = win32com.client.gencache.EnsureDispatch("Word.Application")
word = client.DispatchEx("Word.Application")
word.Visible = False
#tell word to open the document
word.Documents.Open(' C:\path to\combined.docx')
#open it internally
doc = word.Documents(1)
try:
for item in keylist:
word.ActiveDocument.Sections(item).Headers(win32com.client.constants.wdHeaderFooterPrimary).LinkToPrevious=False
word.ActiveDocument.Sections(item).Headers(win32com.client.constants.wdHeaderFooterEvenPages).LinkToPrevious=False
word.ActiveDocument.SaveAs("c:\wherever\combined_1.docx")
doc.Close()
word.Quit()
except:
doc.Close()
word.Quit()
这是很多工作。我敢打赌,有一种方法可以完全使用win32com来实现,但是我无法根据页面正文中的内容弄清楚如何使用相关部分。 “ sectPr”标签始终位于页面的末尾,因此在将文档组合为文本时,我知道页面上需要一个新标题“ Section”,我知道下一个打印出来的部分就是我想要的部分进行编辑,这样我就可以在列表中找到它的位置。
我认为整个工作流程都是骇客,但它可以正常工作,希望示例代码可以帮助某人。
答案 5 :(得分:0)
您可以使用header.text,例如
em.flush()
有关详细信息,请参阅http://python-docx.readthedocs.io/en/latest/dev/analysis/features/header.html?highlight=header
答案 6 :(得分:0)
ActiveSheet.Range("$A$4:$P$40").AutoFilter Field:=12, Criteria1:= _
">16/12/2019", Operator:=xlAnd
您可以在文本的两边使用 import docx
document = docx.Document()
header_section = document.sections[0]
header = header_section.header
header_text = header.paragraphs[0]
header_text.text = "Header of document"
使其居中对齐