我使用此方法从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();
});
但结果是一样的。
总而言之,任何人都可以回答如何在没有重新加载整个文档的情况下重新加载?
答案 0 :(得分:1)
感谢您提出问题,请为此添加更多详情。拥有您的Office的内部版本号将有很大帮助,感谢您在Github中提供它。我知道你是一个只支持Word.js 1.1需求集的Word版本,因此在新版本中代码可以更简单,现在请耐心等待。如果您可以添加指向您正在插入的OOXML有效负载的链接,那么在这种情况下也非常有用,如果您可以添加这些详细信息将有助于我们更有效地帮助您。
话虽如此,解决方案的方法是有3个OOXML片段:一个用于文档正文,另一个用于标题正文,另一个用于页脚正文,你分别执行3个操作。
以下是一些可以澄清API行为的事实,解释了为什么需要采用这种方法并可能指导您朝着正确的方向发展。
首先,设计中的body.insertOoxml()不会替换文档中的现有页眉/页脚,而body.insertFileFromBase64()方法也是如此。该操作仅影响文档的正文。换句话说,根据设计,如果要插入的OOXML包含页眉和页脚定义,为了保护当前文档,它们将被忽略而不会覆盖现有文档。这是一个script lab sample(和btw go here来学习如何使用脚本实验室)来证明这一事实。查看我插入的OOXML标记,它包含页眉和页脚定义,并在调用document.body.insertOoxml()
页眉和页脚被视为单独的正文元素(事实上,文件格式是单独的文档,称为&#34;子文档&#34;)。因此,要在那里插入OOXML,每个都需要单独的OOXML片段,看起来像
mySections.items[0].getHeader("primary").insertOoxml(ooXmlHeader, "replace");
return context.sync()
&#13;
我希望这很有用。