使用python docx或Editing document.xml编辑浮动文本框?

使用python docx或Editing document.xml编辑浮动文本框?,xml,python-2.7,floating,python-docx,Xml,Python 2.7,Floating,Python Docx,我正在编辑一个docx模板,其中包含一堆浮动图像和文本框。我试图通过PythonDocx编辑这些文本框,或者直接编辑document.xml。然而,PythonDocx的当前迭代似乎只允许编辑内联“图片”(在本例中为文本框)。最终目标是使用PythonDocx编辑文本框,或者通过访问和编辑document.xml来编辑文本框(理想情况下无需解压缩然后压缩备份) 到目前为止,我已经尝试使用PythonDocx来编辑这些文本,但是根据我的研究,文本框不能使用PythonDocx进行编辑 我还尝试过单

我正在编辑一个docx模板,其中包含一堆浮动图像和文本框。我试图通过PythonDocx编辑这些文本框,或者直接编辑document.xml。然而,PythonDocx的当前迭代似乎只允许编辑内联“图片”(在本例中为文本框)。最终目标是使用PythonDocx编辑文本框,或者通过访问和编辑document.xml来编辑文本框(理想情况下无需解压缩然后压缩备份)

到目前为止,我已经尝试使用PythonDocx来编辑这些文本,但是根据我的研究,文本框不能使用PythonDocx进行编辑

我还尝试过单独编辑document.xml,我成功地做到了这一点,但是当我试图压缩目录并将扩展名更改回docx时,我无法打开它

import lxml.etree as ET

xmlfile = r"path\document.xml"

with open(xmlfile) as f:
  tree = ET.parse(f)
  root = tree.getroot()


  for elem in root.getiterator():
    try:
      elem.text = elem.text.replace('current id in document', 'new ID in document')
    except AttributeError:
      pass

tree.write(r"path\documentedit.xml", xml_declaration=True, method='xml')

这是我第一次不用python解压docx。然后使用python编辑XML。然后,我不使用python将其压缩,只是想看看是否可以让它工作,但我无法打开文档。

打开一个开放式打包约定(OPC)包并以Word需要的形式将其重新打开涉及到很多细节

import lxml.etree as ET

xmlfile = r"path\document.xml"

with open(xmlfile) as f:
  tree = ET.parse(f)
  root = tree.getroot()


  for elem in root.getiterator():
    try:
      elem.text = elem.text.replace('current id in document', 'new ID in document')
    except AttributeError:
      pass

tree.write(r"path\documentedit.xml", xml_declaration=True, method='xml')
您可以使用
pythondocx
直接访问XML,同时仍将正确保存(或“重新打包”)的详细信息保留到
pythondocx

如果您使用的是
lxml
,则可以使用
document.\u元素
lxml.etree.\u元素
对象的形式获取文档部分的XML。调用
document.save()
时,将保存对XML树所做的任何更改

另一种方法是使用
document.part.blob
直接访问XML文本。可以将更改的版本(作为Python 2 str/Python 3字节)分配给
document.part.\u blob
(注意前面的下划线)并在调用
document.save()时保存


这避免了您必须处理所有复杂的打包问题。

谢谢,我在代码前面意识到复制到我工作区的初始模板已经解压(解压缩),因此我在代码前面使用lxml直接编辑doument.xml,只需要打包一次。上述建议对任何希望避免包装/重新包装的人都有帮助。一些代码示例会很有用。我看过你在许多其他主题上发表的与python docx
document相关的文章。save()
没有保存更改的内容。但是,
document.part.\u blob
已更改。原因可能是什么?