1

我使用 docxtemplater 将 Word 文档(我从云端加载)中的标签替换为实际值。

我使用的 Word 文档包含任意标签,因此我首先需要检查一个 Word 文档并获取它包含的所有标签的列表。为此,我使用InspectModule,它被设置为docxtemplater.render(). 然后我查询一个服务,我使用标签作为动态查询的参数。docxtemplater.setData(myData)最后,我通过调用(again)将标签替换为各种查询结果docxtemplater.render()

问题是,当我使用 调用docxtemplater.render()InspectModule,模块不仅会获取所有标签(这很好),还会将 Word 文档中的所有标签替换为字符串“undefined”(这对我的目的不利),因为我不想用字符串“undefined”替换标签,而是用我的查询结果转换为数据对象。

解决此问题的最佳方法是什么(本质上,我希望能够render()多次调用)?从云端重新加载 Word 文档并重新开始docxtemplater查询render()数据?在第一次docxtemplater调用之前深度复制对象,所以我有一个对象的“新”副本,可以用于第二次调用?或者我可以带一个参数调用,这样它就不会修改文档,或者是否有一种方法可以将对象设置回执行该方法之前的状态?还是有其他更好的选择?谢谢!render()docxtemplaterrender()render()reset()docxtemplaterrender()

代码:这让我得到了所有的标签,并用字符串“未定义”替换了 Word 文档中的所有标签。

const iModule = InspectModule();
const options = {modules: [this.iModule]};
const data = await fetch("something.docx");
const zip = new PizZip(data);
const document = new Docxtemplater(zip, options);
document.render();
const tags = Object.keys(this.iModule.getAllTags());
4

2 回答 2

1

感谢您花时间详细解释您的问题。

我更新了文档以将 doc.render() 放在 console.log 之后,并添加了一条注释,说明它对于检索文档的标签是可选的。

关于您的问题,目前无法使用多个数据集呈现相同的 docxtemplater 实例,您需要使用新的 pizzip 实例和新的 Docxtemplater 实例(但是您可以保留相同的 inputBuffer)。造成这种情况的原因是因为我认为没有办法轻松克隆 pizzip 实例。但这个想法一直在我脑海中,尤其是对于 docxtemplater 版本 4。

于 2021-06-16T20:17:51.860 回答
0

我发现 docxtemplater 常见问题解答(https://docxtemplater.readthedocs.io/en/latest/faq.html#get-list-of-placeholders)中给出的示例误导了我。事实上,你可以简单地省略对 的调用doc.render(),你仍然会得到所有的标签。所以,问题可以这样解决:

const iModule = InspectModule();
const options = {modules: [this.iModule]};
const data = await fetch("something.docx");
const zip = new PizZip(data);
const document = new Docxtemplater(zip, options);
const tags = Object.keys(this.iModule.getAllTags());
于 2021-06-14T15:25:15.890 回答