在工作中,我们有一个word文档,我们必须一直编辑以传递给另一个团队,告诉他们如何执行某些任务。由于我不喜欢盲目地填写数据,而且我一直在寻找简化我必须完成的任务的方法,所以我决定自动完成这个过程。在考虑了一些方法(例如从头开始生成word文档或编辑现有文档)之后,我决定就地编辑文档。
我在文档中插入了特殊标记(具体来说,它们采用[SOME_NAME_HERE]
形式),然后我将解析文档中的那些特殊标记,并用我实际需要的值替换它们。然后我将.docx解压缩到包含其中所有XML文档的文件夹,并解析document.xml
文件,替换值。
在此过程中,根据实际需要,文档的某些部分必须从中删除。所以我的第一个想法是在document.xml
文件中添加注释。例如:
<!-- INITIAL BUILD ONLY -->
<w:p w:rsidR="00202319" w:rsidRPr="00D00FF5" w:rsidRDefault="00202319" w:rsidP="00AC0192">
<w:r w:rsidR="00E548A2" w:rsidRPr="00D00FF5">
<w:rPr>
<w:rStyle w:val="emcfontstrong"/>
</w:rPr>
<w:t>Some text here</w:t>
</w:r>
</w:p>
<!-- END INITIAL BUILD ONLY -->
然后,当我去生成输出word文档时,我只是删除所有“INITIAL BUILD ONLY”部分(当然,除非它是初始版本)。
但是,我遇到的问题是,当您将文档转换回Word文档,在Word中打开并保存时,它将“清理”文档,并删除我添加的所有注释它。
所以,我的问题是,有没有办法保留文档中的注释,或者是否有任何我可以添加到XML的特殊标记,这些标记在文档的标准视图/编辑过程中不可见,但不会保存后用Word删除?
答案 0 :(得分:1)
选择编辑文档是一个不错的选择imo!
Word在打开docx并再次保存时会做很多更改,所以我不相信这一点。我甚至不知道在document.xml
内存储隐藏和持久数据的位置。
这是一个使用其他技术获得所需内容的想法。
Hello {name}
名称=“edi9999”的将替换为Hello edi9999
{#names}
Hello {name}
{/names}
names=[{name:"John"},{name:"Mary"},{name:"Jane"}]
将替换为:
Hello John
Hello Mary
Hello Jane
现在注释掉一个部分的技巧是使用一个空数组。
如果names=[]
输出将是一个空字符串。如果要取消注释,请使用包含一个元素的数组。
灵感来自Mustache
我为Javascript创建了这个实现(适用于Node和浏览器):https://github.com/edi9999/docxgenjs
这里有一个演示:
答案 1 :(得分:0)
为了回应上一张海报,我发现Microsoft Word在打开/保存文件时会做很多幕后魔术,并且不会建议在任何xml文件中存储元数据。
但是,如果您不是在编写脚本之上,那么使用任意数量的模块都不应该太难。这是使用oodocx的基本Python实现,这是我正在开发的模块。
from oodocx import oodocx
from lxml import etree
d = oodocx.Docx('template.docx')
body = d.get_body()
paragraph_to_remove = d.search('Some text here', result_type='paragraph')
body.remove(paragraph_to_remove)
d.save('new document.docx')