把标题放在Python上 - docx

时间:2016-07-21 15:27:40

标签: python python-2.7 python-docx

我正在使用Python-docx来创建和编写Word文档。

如何使用python-docx将文本放入文档标题?

http://image.prntscr.com/image/8757b4e6d6f545a5ab6a08a161e4c55e.png

由于

7 个答案:

答案 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)

(关于这个问题很老......)

我在我的项目中使用了一种解决方法,我的“客户端”在不同页面中需要不同的标题:

  1. 使用python-docx和分节符创建文档

  2. 执行带有两个参数的单词宏文件(* .xlsm):( 1)fileName = path,docTitle =要在页脚中插入的文档的标题。

  3. 宏文件将打开新创建的文档,并添加已存在于宏文件中的页眉和页脚。如果页眉和页脚文本需要改变,则需要修改它。

    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" 使其居中对齐