我正在开发一个Word插件,它将OOXML插入到锁定的内容控件中(即设置了cannotDelete
和cannotEdit
个标志),并且遇到了本机和在线Word之间的结果问题。在原生Word中,cannotEdit
标志被尊重,因此ContentControl.insertOoxml
将失败,除非我首先禁用该标记,无论我是否使用start
或replace
作为第二个参数。
但是,在Word Online中,使用start
作为第二个参数会忽略两个标志(无论其值是否成功),并使用插入的OOXML替换任何当前内容,而不是将其添加到前面。使用replace
时,最终结果符合预期,但cannotDelete
标志控制调用是否成功而不是cannotEdit
。
最终结果是我不能在内容控件中容易地添加OOXML,因为Word Online会覆盖任何当前内容,并且我必须在执行实际替换时禁用这两个标志,因为cannotEdit
受到本机Word和cannotDelete
的尊重{1}}受到Word Online的尊重。
这是一个简单的脚本来演示这个问题:
Office.initialize = function (reason) {
return Word.run(function (context) {
var contentControls = context.document.contentControls;
context.load(contentControls, 'id');
return context.sync().then(function () {
var control = contentControls.items[0];
//control.cannotDelete = false;
//control.cannotEdit = false;
// Use 'start' or 'replace' as a second parameter to notice varying behavior in Word Online
control.insertOoxml("<pkg:package xmlns:pkg='http://schemas.microsoft.com/office/2006/xmlPackage'><pkg:part pkg:name='/_rels/.rels' pkg:contentType='application/vnd.openxmlformats-package.relationships+xml' pkg:padding='512'><pkg:xmlData><Relationships xmlns='http://schemas.openxmlformats.org/package/2006/relationships'><Relationship Id='rId1' Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument' Target='word/document.xml'/></Relationships></pkg:xmlData></pkg:part><pkg:part pkg:name='/word/document.xml' pkg:contentType='application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml'><pkg:xmlData><w:document xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' ><w:body><w:p><w:pPr><w:spacing w:before='360' w:after='0' w:line='480' w:lineRule='auto'/><w:rPr><w:color w:val='70AD47' w:themeColor='accent6'/><w:sz w:val='28'/></w:rPr></w:pPr><w:r><w:rPr><w:color w:val='70AD47' w:themeColor='accent6'/><w:sz w:val='28'/></w:rPr><w:t>This text has formatting directly applied to achieve its font size, color, line spacing, and paragraph spacing.</w:t></w:r></w:p></w:body></w:document></pkg:xmlData></pkg:part></pkg:package>", "start");
//control.cannotDelete = true;
//control.cannotEdit = true;
return context.sync();
});
})
.catch(function (error) {
console.log('Error: ' + JSON.stringify(error));
if (error instanceof OfficeExtension.Error) {
console.log('Debug info: ' + JSON.stringify(error.debugInfo));
}
});
};
我还创建了一个simple document用于测试,虽然它只不过是一个包含某些内容的锁定的富文本内容控件。
原样,脚本在本机Word中将失败,因为cannotEdit
标志未首先被禁用,但将在Word Online中成功并且测试文本将被替换(即使使用了start
)。使用replace
代替start
并取消注释设置control.cannotEdit
的行,将导致它在原生Word中成功,但在Word Online中失败。为了在使用replace
时在两种环境中取得成功,control.cannotDelete
行也必须取消注释。
这是预期的行为吗?在线和本机环境中使用ContentControl.insertOoxml
的推荐方法是什么?