【问题标题】:Get Excel range using JavaScript API for Office使用 JavaScript API for Office 获取 Excel 范围
【发布时间】:2016-04-25 10:18:28
【问题描述】:

我正在构建一个适用于 Office 的应用程序(用于桌面 Excel),并且我正在寻找 JavaScript API Office 1.1 版中的函数,该函数将返回用户选择的列和行的地址。类似“A1:C3”的结果。

我尝试使用Office.context.document.getSelectedDataAsync(),但它只能让我获得价值。我需要知道他们的地址,以便在我的应用程序中显示它。我的代码是这样的:

Office.context.document.getSelectedDataAsync(Office.CoercionType.Matrix, function (asyncResult) {
    console.log(asyncResult.value);
});

asyncResult 只会给我一个数组值。我在 MSDN 或 Google 上找不到任何有用的帮助。任何帮助表示赞赏。

【问题讨论】:

    标签: javascript excel office365


    【解决方案1】:

    这已经很晚了,但我希望这个替代方案对使用 Excel 2016 的人有用。您可以使用 workbook 上的 getSelectedRange 函数来获取当前选定的范围,然后像下面这样加载地址属性。

    Excel.run(function (ctx) {
        var selectedRange = ctx.workbook.getSelectedRange();
    
        selectedRange.load('address');
    
        return ctx.sync().then(function () {
            //selectedRange.address is now available to use
        }).catch(function (error) {
            //handle
        });
    }).catch(function (error) {
        //handle
    });
    

    【讨论】:

      【解决方案2】:

      这是一个完整的工作示例函数:只需向该函数添加一个测试按钮。您还需要一个 Div 来使用 writeToPage 函数写入结果(或修改到您自己的输出区域。)

      function get_rangecoords() {
          Office.context.document.bindings.addFromPromptAsync(Office.BindingType.Matrix,
                  { id: "MyMatrixBinding" },
                  function (asyncResult) {
      
                      //NOW DO OUTPUT OR ERROR
                      if (asyncResult.status === "failed") {
                          writeToPage("Error get_rangecoords. " + asyncResult.error.message, 3);
                      }
                      else {
                          writeToPage("Added new binding with type: " + asyncResult.value.type + " and id: " + asyncResult.value.id, 1);
                      }
                  });
          Office.select("bindings#MyMatrixBinding", onBindingNotFound).
                      addHandlerAsync(Office.EventType.BindingSelectionChanged,
                    onBindingSelectionChanged,
                    function (AsyncResult) {
                        writeToPage("Event handler was added successfully! Change the matrix current selection to trigger the event", 1);
                    });
      
          //Trigger on selection change, get partial data from the matrix 
          function onBindingSelectionChanged(eventArgs) {
              eventArgs.binding.getDataAsync({
                  CoercionType: "matrix",
                  startRow: eventArgs.startRow,
                  startColumn: eventArgs.startColumn,
                  rowCount: 1, columnCount: 1
              },
      
      
          function (asyncResult) { 
                  //NOW DO OUTPUT OR ERROR
                  if (asyncResult.status === "failed") {
                      writeToPage("Error asyncResult: " + asyncResult.error.message, 3);
                  }
                  else {
                      writeToPage('Start Row:' + eventArgs.startRow + ' Start Col:' + eventArgs.startColumn + '\nSelected Row count:' + eventArgs.rowCount + ', Col Count:' + eventArgs.columnCount + '\nFirst Cell Value:' + asyncResult.value[0].toString(), 1);
                  }
              });
          }
      
          //Show error message in case the binding object wasn"t found 
          function onBindingNotFound() {
              writeToPage("The binding object was not found. Please return to previous step to create the binding", 3);
          }
      }
      
      
      function writeToPage(text, varimportance) {
      
          if (varimportance == "") {
              document.getElementById('Notificationarea').style.color = "black";
          }
          if (varimportance == 1) {
              document.getElementById('Notificationarea').style.color = "darkgreen";
          }
          if (varimportance == 2) {
              document.getElementById('Notificationarea').style.color = "darkorange";
          }
          if (varimportance == 3) {
              document.getElementById('Notificationarea').style.color = "red";
          }
      
          document.getElementById('Notificationarea').innerText = text;
      }
      

      欲了解更多信息,请参阅http://microsoft-office-add-ins.com

      【讨论】:

      • 谢谢你的代码,斯图!到目前为止,我已经弄清楚了,但现在的挑战是选中的工作表。我看不出有一种方法可以知道文件中有多少张纸,以及哪一张是范围。
      • 嗨米罗。我明白你的意思了。你可以尝试这样的事情:假设你有两张纸。您在一个工作表中创建一个与相关范围的绑定,并在工作表 2 中创建一个不同的绑定。然后为每个绑定添加一个事件处理程序,然后您将知道哪个工作表被触发。
      • function addEvent() { Office.select("bindings#myBindingXXX").addHandlerAsync("bindingDataChanged", myHandler1, function (asyncResult) { //NOW DO OUTPUT OR ERROR if (asyncResult.status = == "failed") { writeToPage('Error E1a myHandler1 addEvent: ' + asyncResult.error.message, 3); } else { writeToPage('Event handler: myHandler1 added', 1); } }); }
      • function myHandler1(eventArgs) {//E1b eventArgs.binding.getDataAsync({ coerciontype: "matrix" }, function (asyncResult) { //NOW DO OUTPUT OR ERROR if (asyncResult.status == = "failed") { writeToPage('Error E1b myHandler1: Event tracker ' + asyncResult.error.message, 3); } else { writeToPage('Event tracker, bound data: ' + asyncResult.value, 1); } }) ; }
      • 上面的第一个函数会将事件添加到 myBindingXXX,第二个函数将在绑定发生任何变化时输出结果。
      【解决方案3】:

      诀窍是首先为整个工作表创建一个命名项目,然后将 SelectionChanged 处理程序附加到它。在其参数中,您将获得该命名项目内选择的列、行、高度和宽度。 这里有一个 Microsoft 开发团队的示例:

      https://code.msdn.microsoft.com/office/Apps-for-Office-Get-51cc1aac

      【讨论】:

      • 我没有看到这个答案给出了实际问题的结果。
      • @shyam:我是新手,但它看起来像github.com/OfficeDev/… 的第 47 行,它将 .startRow 和 .startColumn 显示为 bArgs 的属性
      猜你喜欢
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      相关资源
      最近更新 更多