如何使用 officejs 在 MS Word 中重新加载页眉和页脚 api

How to reload header and footer in MS Word using officejs api

我使用此方法从 BE 收到 ooxml 格式的文档(并且来自 BE 的 xml 包含整个文档,包括页眉和页脚(如果存在)):

public someGetMethod(templateId: string): ng.IPromise<Template[]> {
    return this.Service.getXml(templateId)
        .then((myBodyXML: string) => {
            return Word.run((...args) => {
                const context = args[0];
                const body = context.document.body;
                body.insertOoxml(myBodyXML, Word.InsertLocation.replace);

                return context.sync();
            })
                .catch((error: Error) => {
                    console.error('Error: ' + JSON.stringify(error));
                });
        });
}

这很好用。

当我选择其他文档并使用此方法再次加载它时,问题就开始了,因为页眉和页脚没有改变,只有文档正文。

是的,这是正常的,因为我使用 body.insertOoxml() 并且根据 the documentation 正文不包含页眉和页脚(但是如何以及为什么加载它们第一次不重载第二次?).

我尝试以这种方式获取页眉和页脚并清理它或加载空文本或 ooxml 在我选择下一个要加载的模板之前:

const mySections = context.document.sections;
context.load(mySections);
return context.sync().then(() => {
    myHeader = mySections.items[0].getHeader('primary');
    myHeader.insertOoxml(myBodyXML, Word.InsertLocation.replace);
    // or
    myHeader.clear();
    // or
    myHeader.insertText('', Word.InsertLocation.replace);
    return context.sync();
});

但结果是一样的

所以,总而言之,谁能回答如何重新加载而无需重新加载整个文档的痛苦?

感谢您的提问,请添加更多详细信息。拥有 Office 的内部版本号会有很大帮助,感谢您在 Github 中提供它。我知道您使用的 Word 版本仅支持 Word.js 1.1 要求集,因此在较新的版本中代码可以更简单,请耐心等待。同样在这种情况下,如果您可以将 link 添加到您要插入的 OOXML 有效负载中,这也是非常有帮助的,如果您可以添加这些详细信息,将有助于我们更有效地帮助您。

也就是说,解决你的场景的方法是有 3 个 OOXML 片段:一个用于文档正文,另一个用于页眉正文,另一个用于页脚正文,你分别进行这 3 个操作。

这里有一些事实可以阐明 API 的行为方式,解释您为什么需要采用这种方法并可能指导您朝着正确的方向前进。

  1. 首先,body.insertOoxml()在设计上不会替换文档中现有的headers/footers,body.insertFileFromBase64()方法也是如此。该操作仅影响文档的主体。换句话说,如果要插入的 OOXML 包含页眉和页脚定义,那么为了保护当前文档,它们将被忽略而不是覆盖现有的。这是一个 script lab sample (and btw go here 来学习如何使用脚本实验室)演示了这一事实。查看我正在插入的 OOXML 标记,它包含页眉和页脚定义,并且它们 not 在调用 document.body.insertOoxml()

    后插入到文档中
  2. 页眉和页脚被认为是单独的正文元素(实际上在文件格式中是单独的文档,称为 "sub documents")。所以要在那里插入 OOXML,您需要为每个单独的 OOXML 片段,看起来像

mySections.items[0].getHeader("primary").insertOoxml(ooXmlHeader, "replace");
return context.sync()

  1. 最后清除页眉和页脚我认为您采用了正确的方法,只需确保遍历文档中的所有部分,here is a script lab sample 展示了如何执行此操作。

希望有用。