如何使用不同的数据集多次渲染 docxtemplater

How to render docxtemplater multiple times with different data sets

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

我使用的 Word 文档包含任意标签,因此我首先需要检查 Word 文档并获取它包含的所有标签的列表。为此,我使用 InspectModule,它被设置为 docxtemplater.render() 的选项。然后我查询一个服务,我在其中使用标签作为动态查询的参数。最后,我通过调用 docxtemplater.setData(myData) 然后(再次)docxtemplater.render().

将标签替换为各种查询结果

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

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

代码:这会获取所有标签,并将 Word 文档中的所有标签替换为字符串“undefined”。

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());

我发现 docxtemplater FAQs (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());

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

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

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