如何使用不同的数据集多次渲染 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。
我使用 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。