【问题标题】:Unable to insert row with values on sheet range无法在工作表范围内插入具有值的行
【发布时间】:2019-04-23 17:02:39
【问题描述】:

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

我尝试使用Excel.Range 中的insert 方法成功插入空行:

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)

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

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

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

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:我尝试使用 Excel.Rangeset 方法,如下所示:

empty_space.set( {values: row} )

但无论我尝试什么,我都会不断收到以下错误:

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

尽管在调试时我可以看到 rowempty_space.values 确实具有相同的尺寸,1x48。

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

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()
}

在这种情况下,如果我在这个函数之后添加一个断点,我可以看到sheet_ranges 的值do 包含相应行的正确信息。我不明白为什么这没有反映在文件本身中。

【问题讨论】:

    标签: javascript typescript office-js office-addins


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回复,瑞克。不幸的是,如果我不加载值,我会收到以下错误:“PropertyNotLoaded:属性'values'不可用。在读取属性的值之前,调用包含对象的加载方法并调用“context.sync() “在相关的请求上下文中。”我将编辑我的问题并发布我正在使用的完整功能。
    • 您的问题已经演变。您最初说工作簿没有更新。您的最新版本说您遇到了一个您之前没有提到的错误:“无效参数:输入数组中的行数或列数与范围的大小或维度不匹配。”。此外,据我所知,您的代码的最新版本使用了我给出的建议,并且没有加载values,因此您对我的回答的评论令人困惑。我建议你从一个新问题重新开始。提供整个 Excel.run 方法并指定您遇到的第一个错误以及您在哪里获得它。谢谢。
    猜你喜欢
    • 2018-01-12
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多