0
                            Office.context.document.bindings.getAllAsync((result: Office.AsyncResult) => {             
                                if (result.status == Office.AsyncResultStatus.Succeeded) {
                                    for (let attBinding of result.value) {
                                        var binding = attBinding as Office.Binding;  
                                    }
                                } 
                            })

我们正在开发一个带有所选文本存储的 Office 应用程序。我们将所有选定的文本保存在绑定列表中。但是我们需要在整个文档中按范围选定的文本排序列表。但是函数 getAllAsync() 返回随机列表...

我们如何在文档中按层次结构对这些绑定进行排序?

例如:

Text1(第一个选中) Text2(第三个选中) Text3(第二个选中)

--

我们需要排序列表,例如:

  1. 文本1

  2. 文本2

  3. 文本3

不是随机列表!

4

1 回答 1

0

是的你可以!这里的关键是要记住,创建绑定实际上是向文档添​​加内容控件,因此您需要做的是使用应用于选择或文档正文的 contentControls 集合并遍历它以获取阅读顺序。(顺便说一句,如果您只需要选择或所有文件,但我会解释两者)。

现在在示例之前进行一些澄清:

  1. 实际上, bindings.getAllAsync() 方法与阅读顺序不匹配,但也不是随机的。它实际上按其创建顺序返回绑定,这对您的方案似乎没有用处。
  2. 另一方面range.contentControls集合(范围可以是选择或文档的正文)将为您提供文档阅读顺序范围内的所有内容控件。请注意,此集合将包括带有和不带有绑定的内容控件。所以你需要确保当你创建你的绑定时,你以一种你以后能够识别它们的方式来做,这很简单,因为你可以使用新的 API 插入一个内容控件,设置它的标题然后使用bindings.addFromNamedItemAsync方法使用标题创建绑定。您还可以设置内容控件的标记,以在解决方案的上下文中识别这表示绑定。

这是一个示例,说明如何创建内容控件并向它们添加 Binding,然后另一个示例显示如何使用 contentControls 集合以阅读顺序遍历绑定:

创建绑定:

function insertContentControlWithBinding() {
    Word.run(function (context) { 
        //first we insertTheContentCOntrol on the selection, then set the title and tags and finally create the binding.
        var myContentControl = context.document.getSelection().insertContentControl();
        context.load(myContentControl);
        return context.sync()
            .then(function () {
                myContentControl.title = "identifier"; //this will be used later to create the binding.
                myContentControl.tag = "BOUND"; //used to mark as a bound content control.
                return context.sync()
                    .then(function (context) {
                        Office.context.document.bindings.addFromNamedItemAsync("identifier", Office.BindingType.Text, {}, function (result) {
                            if (result.status = Office.AsyncResultStatus.Succeeded) {
                                console.log("binding Created succesfully")
                            }
                         })

                     })    
             })

    }).catch(function (e) { 
        console.log(e.message);
    })
}

按阅读顺序获取绑定: 这确实是您问题的底线答案,但我认为对正在发生的事情进行很好的解释会很有用。谢谢你的耐心!

function getBindingsinReadingOrder() {
     Word.run(function (context) { 
        var myContentControls = context.document.body.contentControls; 
        context.load(myContentControls);
        return context.sync()
            .then(function () {
                // lets traverse the content controls and checl which ones are bound by checking the tag.
                for (var i = 0; i < myContentControls.items.length; i++) {
                    if (myContentControls.items[i].tag == "BOUND") {
                        //its a binding! lets print the content
                        console.log(myContentControls.items[i].text);
                    }
                    else {
                        console.log("not a bound cc");
                     }
                 }
             }) 
    }).catch(function (e) { 
        console.log(e.message);
    })
 }

希望这可以增加清晰度并解除您的场景障碍。感谢和快乐编码!胡安。

于 2017-02-09T21:20:43.087 回答