使用python-docx向现有docx添加内容

使用python-docx向现有docx添加内容,python,python-docx,Python,Python Docx,我想打开一个现有的word文档,在其中我已经添加了页码,只需添加一些文本和标题即可 这里有一个基本的例子,说明我是如何努力实现我的目标的 #!/usr/bin/env python from docx import Document document = Document('report-template.docx') document.add_heading('Headline No. 1', level=1) document.add_paragraph('Test No. 1') doc

我想打开一个现有的word文档,在其中我已经添加了页码,只需添加一些文本和标题即可

这里有一个基本的例子,说明我是如何努力实现我的目标的

#!/usr/bin/env python 
from docx import Document
document = Document('report-template.docx')
document.add_heading('Headline No. 1', level=1)
document.add_paragraph('Test No. 1')
document.add_heading('Heading No. 2', level=2)
document.add_paragraph('Test No. 2')
document.save('example.docx')
当我用一个完整的新文档执行上述操作时,一切都很好——当用已经存在的文件执行此操作时,失败了,出现以下错误

Traceback (most recent call last):
  File "create-report-test.py", line 6, in <module>
    document.add_heading('Headline No. 1', level=1)
  File "/usr/lib/python2.7/site-packages/docx/document.py", line 43, in add_heading
    return self.add_paragraph(text, style)
  File "/usr/lib/python2.7/site-packages/docx/document.py", line 63, in add_paragraph
    return self._body.add_paragraph(text, style)
  File "/usr/lib/python2.7/site-packages/docx/blkcntnr.py", line 38, in add_paragraph
    paragraph.style = style
  File "/usr/lib/python2.7/site-packages/docx/text/paragraph.py", line 111, in style
    style_or_name, WD_STYLE_TYPE.PARAGRAPH
  File "/usr/lib/python2.7/site-packages/docx/parts/document.py", line 75, in get_style_id
    return self.styles.get_style_id(style_or_name, style_type)
  File "/usr/lib/python2.7/site-packages/docx/styles/styles.py", line 113, in get_style_id
    return self._get_style_id_from_name(style_or_name, style_type)
  File "/usr/lib/python2.7/site-packages/docx/styles/styles.py", line 143, in _get_style_id_from_name
    return self._get_style_id_from_style(self[style_name], style_type)
  File "/usr/lib/python2.7/site-packages/docx/styles/styles.py", line 57, in __getitem__
    raise KeyError("no style with name '%s'" % key)
KeyError: u"no style with name 'Heading 1'"
回溯(最近一次呼叫最后一次):
文件“createreporttest.py”,第6行,在
文件。添加标题(标题1,级别=1)
文件“/usr/lib/python2.7/site packages/docx/document.py”,第43行,添加标题
返回self.add_段落(文本、样式)
文件“/usr/lib/python2.7/site packages/docx/document.py”,第63行,添加段落
返回自我。添加段落(文本、样式)
文件“/usr/lib/python2.7/site packages/docx/blkcntnr.py”,第38行,添加段落
段落风格=风格
文件“/usr/lib/python2.7/site packages/docx/text/paragration.py”,第111行,样式为
样式或名称,WD样式类型段落
文件“/usr/lib/python2.7/site packages/docx/parts/document.py”,第75行,格式为get\u style\u id
返回self.styles.get\u style\u id(style\u或\u名称、style\u类型)
文件“/usr/lib/python2.7/site packages/docx/styles/styles.py”,第113行,在get\u style\u id中
返回self.\u从\u name(style\u或\u name,style\u type)获取\u style\u id\u
文件“/usr/lib/python2.7/site packages/docx/styles/styles.py”,第143行,位于“从名称获取样式id”中
返回self.\u从\u style(self[style\u name],style\u type)获取\u style\u id\u
文件“/usr/lib/python2.7/site packages/docx/styles/styles.py”,第57行,在__
raise KeyError(“没有名为“%s”的样式%key”)
KeyError:u“没有名称为“标题1”的样式”
我读了下面的文档,但似乎我遗漏了什么——有人有想法吗


提前感谢

python docx
只能使用文档中已定义的样式。此错误表示未定义标题1段落样式。Word一开始没有定义样式(好的,像普通的样式一样,但仅此而已),然后在第一次使用内置样式时将其添加到文件中

两种选择:

  • 手动在文档中添加标题1段落,然后将其删除。之后,将在文档中定义标题1段落样式。Word添加样式后,即使删除了使用该样式的所有段落,也不会将其删除

  • 使用python docx自己定义标题1。请参阅此处有关如何执行此操作的文档:

  • 本页可能也值得快速阅读,以填写一些样式概念:

    太好了-这正是问题所在。现在,当我手动定义所有样式时,它就开始工作了。但是否有可能使用默认属性加载这些样式?这就是我所做的,但样式只是“普通”段落:
    style=document.style
    style.add\u style('Heading 1',WD\u style\u TYPE.paragration,builtin=True)
    我希望
    builtin
    标志能解决这个问题。否。内置样式没有“内置”默认值。您必须计算出它们各自需要什么属性,然后自己应用它们。您可以使用opc diag浏览.docx包中的styles.xml部分,其中定义了styles.xml部分,以查看需要哪些设置。内置样式根据默认主题、Word版本等而有所不同,因此没有通用的样式集。尽管标题很简单;可能每个都有三到四个设置,比如字体大小、前间距和基于。除非你能确定起始文件,否则我会试试。非常感谢你的帮助。我将努力找出这些默认样式的属性,并自己应用它们。@scanny我尝试按照您的建议手动添加样式,但仍然会出现相同的错误。我不是在用word,我是在用LibreOffice Writer这可能是个问题吗???@StarLord如果你把这个问题作为一个单独的问题来问,并包括你具体案例的所有细节,我会看一看。如果您用“pythondocx”标记它,我会看到它。