Python 在0.8.8之前的版本中创建页眉和页脚

Python 在0.8.8之前的版本中创建页眉和页脚,python,python-3.x,header,footer,python-docx,Python,Python 3.x,Header,Footer,Python Docx,是否有在Microsoft Word(docx)文件中添加页眉和页脚的解决方法 在python docx到0.8.8之前的版本中未实现这些功能 更具体地说,我想补充: 页脚页码 将一些随机文本添加到标题 理想的代码如下所示: from docx import Document document = Document() # Add header and footer on all pages document.save("demo.docx") 它不是最优雅的(它要求您在VBA和Pyth

是否有在Microsoft Word(
docx
)文件中添加页眉和页脚的解决方法

python docx
0.8.8
之前的版本中未实现这些功能

更具体地说,我想补充:

  • 页脚页码
  • 将一些随机文本添加到标题
  • 理想的代码如下所示:

    from docx import Document
    
    document = Document()
    
    # Add header and footer on all pages
    
    document.save("demo.docx")
    
    它不是最优雅的(它要求您在VBA和Python之间导航),但您可以使用win32com库来利用MS Word功能。这当然需要安装MS Office的Windows计算机

    import win32com.client as win32
    msword = win32.gencache.EnsureDispatch('Word.Application')
    doc = msword.Documents.Add
    doc.Sections(1).Footers(1).Range.Text = r'Text to be included'
    doc.Sections(1).Footers(1).PageNumbers.Add()
    

    您可以使用的解决方法之一是利用Word中创建的模板文档。创建一个空白文档,添加任何带有文本的页眉和带有页码的页脚,然后保存文档。然后使用:

    from docx import Document
    document = Document("template.docx")
    # Do your editing
    document.save("demo.docx")
    
    。。。您应该能够编辑所有其他内容,同时保留页眉和页脚

    最终,我认为这个解决方案对于页码问题非常有效。如果每个文档都需要唯一的标题文本,那么可能会有点棘手。如果是这种情况,您可能希望尝试直接编辑docx文件的XML。您可以在终端中使用此选项:

    unzip template.docx
    
    。。。将docx XML文件吐出到目录中。您还可以使用zipfile在python中执行此操作:

    import zipfile
    
    document = zipfile.ZipFile("template.docx")
    for xml in document.filelist:
        if "header" in xml.filename:
            read = document.read(xml.filename)
            print(read.decode())
    
    print语句将打印整个XML文件,但您应该能够找到以下要点:

    <w:r><w:t>ThisIsMyHeader</w:t></w:r>
    
    thismyheader
    
    这将是标题中的文本。您所要做的就是编辑XML文件,将这些文件重新组合在一起,然后将文件类型更改回docx

    这显然是一个超级黑客的解决办法,不幸的是,我没有能够让它完全工作,但如果你绝对需要它,至少这将是朝着正确方向迈出的一步


    祝你好运

    模板方法有效,其主要优点是它是真正的跨平台解决方案。但是,它要求已在文档中应用一次样式

    让我们从<代码> Python DOXX 考虑一个(简化的)玩具示例版本。

    第一步涉及创建模板文档:

    from docx import Document
    
    document = Document()
    
    document.add_heading('Document Title', 0)
    
    p = document.add_paragraph('A plain paragraph having some ')
    p.add_run('bold').bold = True
    p.add_run(' and some ')
    p.add_run('italic.').italic = True
    
    document.add_heading('Heading, level 1', level=1)
    document.add_paragraph('Intense quote', style='IntenseQuote')
    
    document.add_paragraph(
        'first item in unordered list', style='ListBullet'
    )
    document.add_paragraph(
        'first item in ordered list', style='ListNumber'
    )
    
    document.save('demo.docx')
    
    (请注意,您也可以在第一步中手动应用样式,而无需使用Word中的
    python docx
    。)

    接下来,在Microsoft Word中打开此
    demo.docx
    ,您可以:

  • 添加所需的标题
  • 从菜单中插入页码
  • 保存文档
  • 完成上述操作后,只需删除
    demo.docx
    文档的主要内容(而不是页眉和页脚的内容!),然后再次保存文件

    在第二步中,使用
    python docx
    调用
    demo.docx
    进行所需的更改:

    from docx import Document
    
    document = Document('demo.docx')
    
    document.add_heading('A New Title for my Document', 0)
    
    p = document.add_paragraph('A new paragraph having some plain ')
    p.add_run('bold').bold = True
    p.add_run(' and some ')
    p.add_run('italic.').italic = True
    
    document.add_heading('New Heading, level 1', level=1)
    document.add_paragraph('Intense quote', style='IntenseQuote')
    
    document.add_paragraph(
        'first new item in unordered list', style='ListBullet'
    )
    document.add_paragraph(
        'first new item in ordered list', style='ListNumber'
    )
    
    document.save('demo.docx')
    
    您甚至可以进一步添加内容,例如具有现有表格样式的表格:

    from docx import Document
    
    document = Document('demo.docx')
    
    document.add_page_break()
    
    recordset = [ [1, "101", "Spam"], [2, "42", "Eggs"], [3, "631", "Spam, spam, eggs, and spam"]]
    
    table = document.add_table(rows=1, cols=3)
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = 'Qty'
    hdr_cells[1].text = 'Id'
    hdr_cells[2].text = 'Desc'
    
    for item in recordset:
        row_cells = table.add_row().cells
        row_cells[0].text = str(item[0])
        row_cells[1].text = str(item[1])
        row_cells[2].text = item[2]
    
    table.style = 'ColorfulShading'
    
    document.save('demo.docx')
    
    当然,在不影响模板的情况下,可以避免重复第一步,然后在那里进行必要的更改(例如,
    demo\u copy.docx
    ):

    import shutil
    shutil.copyfile('demo.docx', 'demo_copy.docx')
    

    最后,值得一提的是,您还可以使用定制的样式!有关如何使用python docx和表样式执行此操作的示例,请参见。

    类似的内容如何(感谢Eliot K)

    也许这不是最优雅的方法,但应该做你需要的事情。 可能会将难看的保存/加载代码隔离在代码灰尘角落的某个函数中;-)

    同样,需要安装microsoft office的windows计算机

    import win32com.client as win32
    msword = win32.gencache.EnsureDispatch('Word.Application')
    doc = msword.Documents.Add
    doc.Sections(1).Footers(1).Range.Text = r'Text to be included'
    doc.Sections(1).Footers(1).PageNumbers.Add()
    

    祝你好运

    我一直在用它工作

    from docx import Document
    document = Document()
    
    header = document.sections[0].header
    header.add_paragraph('Test Header') 
    
    header = document.sections[0].footer
    header.add_paragraph('Test Footers')
    


    如何将其链接到python docx apiAh创建的文档。所以你想让代码使用docx文档对象工作?尝试了模板的方法。这种方法的问题是无法识别表格和段落的样式,这给了我一个错误:
    KeyError:u“没有名称为'Heading 1'的样式”
    ,不幸的是,我对归档格式的docx文件的了解非常有限,因此我不确定是否有办法解决这个问题。希望对这个过程有多一点了解的其他人能够参与进来,并给出更完整的答案。抱歉:(.您的答案有两个问题:1)所描述的步骤无法在0.8.8之前的版本中完成;2)它没有提供如何在OP要求时插入页码的解决方案。