在Office-js中获取范围的周围文本

时间:2019-10-12 18:40:11

标签: ms-word office-js

我有代码可以在Word中查找文本并将结果范围存储在数组中。我能够使用范围数组导航匹配结果。我还希望能够显示范围的周围文本。这与“查找”在Word中的工作方式非常相似。

enter image description here

例如,我想在以下文本中显示Reading的第二个实例的范围的周围文本(也许前后二十个字符):

“要更改图片在文档中的放置方式,请单击它并在其旁边显示一个用于布局选项的按钮。在处理表时,单击要添加行或列的位置,然后单击加号。在新的“阅读”视图中,阅读也变得更加容易。您可以折叠文档的一部分并专注于所需的文本。如果您需要在到达末尾之前停止阅读,Word会记住您停下的位置-即使在其他设备上。”

这将是输出。

“在新的“阅读”视图中阅读也变得更加容易。您可以折叠部分内容”

我正在使用Visual Studio 2017和Office-js 1.1。

    function first() {
        ranges[0].select();
        ranges[0].font.highlightColor = "aqua";
        ranges[0].context.sync();
        showSurroundText(ranges[0]);
    }

    function previous() {
        if (index > 0) {
            ranges[--index].select();
            ranges[index].font.highlightColor = "aqua";
            ranges[index+1].font.highlightColor = "yellow";
            ranges[index].context.sync();
            showSurroundText(ranges[index]);
        }
    }

    function next() {
        console.log("Next");
        if (index < ranges.length - 1) {
            ranges[++index].select();
            ranges[index].font.highlightColor = "aqua";
            ranges[index-1].font.highlightColor = "yellow";
            ranges[index].context.sync();
            showSurroundText(ranges[index]);
        }
    }

    function showSurroundText(range:Word.Range){
        surroundTextRange = /*need help computing this range */
        surroundTextRange.load("text");
        $("#output").htmml(surroundTextRange.text);
    }

1 个答案:

答案 0 :(得分:0)

不幸的是,Office JS API中没有方法可以按一定数量的字符来扩展(或缩小)范围或选择。 (Reference

与COM API相比,扩大范围是一项复杂的工作。可用方法:

 - expandToOrNullObject(range)
 - getNextTextRangeOrNullObject(endingMarks, trimSpacing)
 - getRange(rangeLocationString)
 - getTextRanges

使用getNextTextRangeOrNullObject,例如,可以通过将.指定为endingMarks来获得范围(搜索结果)之后的下一个句子。可以使用getRange将其“折叠”到起点,以便将搜索范围扩展到下一个句子的开头。

倒退甚至更复杂。一种可能是使所有段落最多到包含搜索词的段落,然后获取该段落的最后一个句子并扩展到该点。

以下代码段演示并提供了开始“调整”所需内容的地方:

let results = context.document.body.search("Reading");
results.load("length");
await context.sync();

//Work with the first found search term
let rngFound = results.items[0];

//Expand to end of sentence
let rngNextSent = rngFound.getNextTextRangeOrNullObject(["."]);
let rngExpAfter = rngNextSent.getRange("Start"); let rngFoundExp = rngFound.expandToOrNullObject(rngExpAfter);

await context.sync();

//Get paragraphs to this point
let rngDocStart = rngFound.parentBody.getRange("Start");
let rngToStart = rngFoundExp.expandToOrNullObject(rngDocStart);
let paras = rngToStart.paragraphs;
paras.load("items");
await context.sync();

//Get the paragraph previous
let nrParas = rngToStart.paragraphs.items.length-2;
let rngPrev = rngToStart.paragraphs.items[nrParas];

//Get the last sentence in that paragraph
let rngParaSent = rngPrev.getTextRanges(["."]); rngParaSent.load("items"); await context.sync(); let rngPrevSent = rngParaSent.items[rngParaSent.items.length - 1];

//Extend the extended range to the last sentence in the previous paragraph
let rngComplete = rngFoundExp.expandToOrNullObject(rngPrevSent);
rngComplete.select();
await context.sync();