向MS Office Word文档OfficeJS中的单词添加/删除突出显示

时间:2018-12-05 06:32:53

标签: jquery ms-word office-js

我需要在外接程序中突出显示Word文档中的单词,并且当用户需要删除由外接程序创建的突出显示时,应该只能删除由外接程序做出的突出显示。 用户制作的突出显示不应删除。

现在,我可以在外接程序中用红色突出显示单词,并且当用户想要删除突出显示时,即使用户突出显示也被删除了。

下面是我的代码:

//Add highlights
return context.sync().then(function () {
// Queue a set of commands to change the font for each found item.
for (var i = 0; i < searchResults.items.length; i++) {
    searchResults.items[i].font.color = 'red';
    searchResults.items[i].font.underline = 'wave';
}
return context.sync();
});

//Remove highlights
Word.run(function (context) {
            // Create a proxy object for the document body.
            var body = context.document.body;

            // Queue a commmand to clear the contents of the body.
            body.load("font");

            return context.sync().then(function () {
                // Queue a set of commands to change the font for each found item.
                body.font.color = 'black';
                body.font.underline = 'None';
                return context.sync();
            })
                .catch(errorHandler);
        });

1 个答案:

答案 0 :(得分:1)

为此您有几种选择。

  1. 您可以存储突出显示的范围。
  2. 您可以使用不可见的内容控件包装范围结果(如Cindy在她的评论中建议的那样), 创建一个标签,然后遍历那些内容控件(使用通过标签方法获取的内容控件)进行格式化 突出显示(并删除内容控件。

2)易于实现:)

对于1),请检查以下示例,它不能完全满足您的要求,但是您可以了解如何实现此目的。目标是使用treackedObjects方法(最重要的一点)保存每个范围。在这种情况下,我将创建一个找到范围的数组,然后可以使用它来清理突出显示。请不要忘记调用context.trackedObjects.remove,因为您正在分配内存来临时存储这些对象。顺便说一下,在我的示例中,请确保包含ID为“ FoundRanges”的组合itesm。

这是您可以使用的script lab snippet

function loadCombo() {
    Word.run(function (context) {
        var rangesAr = [];
        var currentlySelectedIndex = 0;
        var myRanges = context.document.body.search("Word");
        context.load(myRanges, { expand: 'font' });
        return context.sync()

            .then(function () {
                var myCombo = document.getElementById("FoundRanges");

                for (var i = 0; i < myRanges.items.length; i++) {
                    var myItem = document.createElement("option");
                    myItem.text = myRanges.items[i].text
                    myCombo.add(myItem);
                    var newRange = myRanges.items[i].getRange();
                    rangesAr.push(newRange);
                    context.trackedObjects.add(newRange);
                   
                }
                $('#FoundRanges').change(function () {
                    
                    rangesAr[this.selectedIndex].font.bold = true;
                    currentlySelectedIndex = this.selectedIndex;
                    return context.sync()
                        .catch(function (e) {
                           console.og(e.message);
                        })
                });
                return context.sync()
            })
            
    }).catch(function (e) {
        console.log(e.message)
    })
}