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

时间:2018-05-22 06:42:44

标签: javascript ms-word ms-office office-js

我使用此方法从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();
});

但结果是一样的。

总而言之,任何人都可以回答如何在没有重新加载整个文档的情况下重新加载?

1 个答案:

答案 0 :(得分:1)

感谢您提出问题,请为此添加更多详情。拥有您的Office的内部版本号将有很大帮助,感谢您在Github中提供它。我知道你是一个只支持Word.js 1.1需求集的Word版本,因此在新版本中代码可以更简单,现在请耐心等待。如果您可以添加指向您正在插入的OOXML有效负载的链接,那么在这种情况下也非常有用,如果您可以添加这些详细信息将有助于我们更有效地帮助您。

话虽如此,解决方案的方法是有3个OOXML片段:一个用于文档正文,另一个用于标题正文,另一个用于页脚正文,你分别执行3个操作。

以下是一些可以澄清API行为的事实,解释了为什么需要采用这种方法并可能指导您朝着正确的方向发展。

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

  2. 后在文档中插入
  3. 页眉和页脚被视为单独的正文元素(事实上,文件格式是单独的文档,称为&#34;子文档&#34;)。因此,要在那里插入OOXML,每个都需要单独的OOXML片段,看起来像

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

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