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

时间:2018-06-08 20:22:06

标签: python python-3.x header footer python-docx

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

这些版本未在python-docx 之前0.8.8的版本中实施。

更具体地说,我想补充一下:

  1. 页码到页脚
  2. 一些随机文字到标题
  3. 理想代码如下所示:

    from docx import Document
    
    document = Document()
    
    # Add header and footer on all pages
    
    document.save("demo.docx")
    

5 个答案:

答案 0 :(得分:6)

模板方法有效,其主要优势在于它是一个真正的 跨平台 解决方案。但是,它需要在文档中使用样式

让我们考虑来自python-docx的玩具示例的(简化)版本 documentation page

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

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')

(请注意,您也可以在第一步中手动应用样式,而不使用python-docx,即Word中的样式。)

接下来,在Microsoft Word中打开此demo.docx

  1. 添加所需的标题
  2. 从菜单中插入页码
  3. 保存文档
  4. 完成上述操作后,您只需删除demo.docx文档的主要内容(但不删除页眉和页脚的内容!)并再次保存文件。

    在第二步中,您使用demo.docx致电python-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')
    

    当然,可以避免copying the customized file一直重复第一步,然后在那里进行必要的更改(例如demo_copy.docx)而不影响模板:

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

    最后,值得一提的是,您还可以使用 自定义 样式!有关如何使用python-docx和表格样式see here执行此操作的示例。

答案 1 :(得分:1)

它不是最优雅的(它需要您在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()

答案 2 :(得分:0)

您可以使用的解决方法之一是使用在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>

标题中的文字。您所要做的就是编辑XML文件,将文件重新组合在一起,然后将文件类型更改回docx。

这显然是一个超级黑客的解决方法,不幸的是我无法让它完全发挥作用,但如果你绝对需要它,它至少会朝着正确的方向迈出一大步。

祝你好运!

答案 3 :(得分:-1)

这样的事情怎么样(感谢Eliot K)

from docx import Document
import win32com.client as win32
import os.path
import tempfile

tempdir = tempfile.gettempdir()
msword = win32.gencache.EnsureDispatch('Word.Application')
tempfile = os.path.join(tempdir, "temp.doc")

document = Document()

document.save(tempfile)

doc = msword.Documents.Open(tempfile)

doc.Sections(1).Footers(1).Range.Text = r'Text to be included'
doc.Sections(1).Footers(1).PageNumbers.Add()
doc.SaveAs(tempfile, FileFormat = 0)

document = Document(tempfile)

也许不是最优雅的方法,但是应该做您需要的事情。 也许将丑陋的保存/加载代码隔离在代码尘土飞扬的角落中的某个函数中;-)

同样,确实需要装有Microsoft Office的Windows计算机。

祝你好运!

答案 4 :(得分:-1)

我一直在使用它

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')

https://python-docx.readthedocs.io/en/latest/dev/analysis/features/header.html

enter image description here