2017-10-07 164 views
1

使用Office的JavaScript API,我尝试使用下面的代码填写所选表:的MS Word API:表中的值没有设置

Word.run(function (context) { 
     var table = context.document.getSelection().parentTable; 

     context.load(table); 

     return context.sync() 
      .then(function() { 
       if (table.isNullObject == true || !table) { 
        console.log("selection ist not table"); 
        errorHandler("selection is not a table"); 
       } else { 
        // loop over table 
        for (var row = 0; row < table.values.length; row++) { 
         for (var column = 0; column < table.values[row].length; column++) { 
          console.log(table.values[row][column]); 
          table.values[row][column] = "Test " + row + " " + column; 
         } 

         context.sync().then(function() { 
          console.log("done"); 
         }).catch(function (e) { 
          console.log(e); 
         }); 
        } 
       } 
      }); 
     }); 

脚本运行正常,表对象存在,值记录并最终“完成”。但是表格保持原样 - 没有更新值。我错过了什么?

回答

2

你已经发布的代码需要注意几点:

  • table对象喜欢你的代码正在做检查isNullObject是无效的,因为上面说的行会都已经抛出,如果出现错误parentTable不存在。
  • 错误处理(catch语句)应该位于Word.run之后 - 这样就会发现Word.run内发生的任何错误。
  • 而不是像你一样加载整个table对象,你应该只加载你需要的属性(在这种情况下,valuesrows/items/cells/items/body)。
  • 要设置单元格值,请在要更新的单元格的body上使用insertText方法。

以下代码示例合并了此反馈,并应成功更新表中的值。

Word.run(function (context) { 
    var table = context.document.getSelection().parentTable; 

    table.load("values, rows/items/cells/items/body"); 

    return context.sync() 
     .then(function() { 
      for (var row = 0; row < table.values.length; row++) { 
       for (var column = 0; column < table.values[row].length; column++) { 
        console.log(table.values[row][column]); 
        table.rows.items[row].cells.items[column].body.insertText("Test " + row + " " + column, "Replace"); 
       } 
      } 

      return context.sync() 
       .then (function() { 
        console.log("Done"); 
       }); 
     }); 
}).catch(function (e) { 
    console.log(e); 
}); 
0

伟大的问题@BernhardWebstudio!解释为什么您的特定代码不起作用是因为加载项代码是在与Office应用程序分开的过程中调用的,并且它必须发出“请求”才能实际获取数据。这与请求REST或OData调用中的属性类似。 (例如$ select)

这对您意味着什么?那么只需稍微修改一下代码即可,只需要请求加载哪个表的属性即可。既然你只关心表的值,用这种类型的代码很容易做到这一点。如果您注意到我也有一条注释掉的行table.load("[Property Name]");也可以使用Office Apps对象模型作为代理对象。金也指出了其他一些非常好的建议。欢呼声和快乐编码!

Word.run(function (context) { 
 
    let table = context.document.getSelection().parentTable; 
 
    //table.load("values"); 
 
    context.load(table, "values"); 
 

 
    //...