无法插入表格范围内的值的行

时间:2019-04-23 17:02:40

标签: javascript typescript office-js office-addins

我试图在不包含任何表格的Excel工作表中插入一些行,但是我只能插入空白行。尝试更改这些空行的值会导致row.values打印正确的数据,但是即使context.sync()之后,文件本身上的行仍为空白。

我尝试使用insert中的Excel.Range方法通过执行以下操作成功插入空行:

let empty_space   = sheet.getCell(index,0).getResizedRange(index, row.length)
empty_space.insert("Down")

然后我尝试使用对新范围empty_space的引用,将其值替换为名为row(其长度用于定义上述范围)的数组上的值:

empty_space.load("values")
await context.sync()
empty_space.values[0] = row 

如果我随后执行console.log(empty_space.values),则会看到列出了正确的值,但是文件中的行仍然为空。

我还尝试通过拼接将行插入工作表的已用范围:

full_range.values.splice(index, 0, row)

与上面相同,在控制台上正确打印,但显示空白单元格。

如何使用范围将值的数组插入文件顶部的新行中。我无法将范围转换为表格,因为这会带来很多其他问题。

编辑:以下是我用来尝试实现此功能的全部内容:

insert_banner = async ( sheet_range, context ) => {
   let banner_rows = this.state.sheet_content.banner.banner_rows

    for (let r in banner_rows) {
      let index         = parseInt(r)
      let row           = banner_rows[r]

      let empty_space   = this.state.sheet.getCell(index,0).getResizedRange(index, row.length)
      empty_space.insert("Down")
      empty_space.values[0] = row
      await context.sync()
    }
}

banner_rows是二维数组。

编辑2:我尝试像这样使用set的{​​{1}}方法:

Excel.Range

但是不管我尝试什么,我都会收到以下错误消息:

“ InvalidArgument:输入数组中的行数或列数与范围的大小不匹配。”

即使在调试时,我也可以看到empty_space.set( {values: row} ) row确实具有相同的尺寸1x48。

编辑3:这是我尝试过的另一种方法:

empty_space.values

在这种情况下,如果我在此函数后添加断点,则可以看到insert_banner = async ( sheet_range, context ) => { let banner_rows = this.state.sheet_content.banner.banner_rows let sheet_values = sheet_range.values for (let r in banner_rows) { let index = parseInt(r) let row = banner_rows[r] sheet_values.splice(index, 0, row) } return context.sync() } 的值 do 在相应的行上包含正确的信息。我不明白为什么文件本身没有反映出这种情况。

1 个答案:

答案 0 :(得分:1)

我在您的代码中看到的几个问题:

  1. 您不需要加载empty_space的值。您需要在同步后加载代码将要读取的属性,而不是代码要写入的属性。

  2. 将值分配给empty_space.values [0]时,仅在JavaScript中填充代理对象,而不在工作簿中填充实际范围。要将新值发送到工作簿,您必须调用context.sync。 (由于看起来不需要此行上方的context.sync,因此只需将其移至该行下方即可。)context.log起作用的原因是因为您正在记录代理对象的值。

我认为您第二个代码块中的代码应为:

empty_space.values[0] = row
await context.sync()