如何将OOXML插入本机和在线Word中的锁定内容控件?

时间:2017-10-17 22:42:51

标签: office-js word-addins

我正在开发一个Word插件,它将OOXML插入到锁定的内容控件中(即设置了cannotDeletecannotEdit个标志),并且遇到了本机和在线Word之间的结果问题。在原生Word中,cannotEdit标志被尊重,因此ContentControl.insertOoxml将失败,除非我首先禁用该标记,无论我是否使用startreplace作为第二个参数。

但是,在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的推荐方法是什么?

0 个答案:

没有答案