【问题标题】:Excel AddIn - Adding rows to an existing tableExcel AddIn - 向现有表中添加行
【发布时间】:2019-04-04 18:37:13
【问题描述】:

我在使用 Javascript Excel API 创建 Excel 插件时遇到了一些问题。

第一期: 使用Excel Js library 向现有表添加行:我创建了一个表并添加了一些行;然后用户可以使用来自 REST 服务的新数据更新表内容(因此结果表行可以更改:增加/减少或保持不变)。

tl;dr; 我需要用新行替换表格行。

这看起来很简单:在 Table 命名空间 (reference) 中有一个 addRows 方法。 但这不会按预期工作:如果表已经包含行,则会将新行添加到末尾,而不是替换现有行。

代码如下:

const currentWorksheet = context.workbook.worksheets.getItemOrNullObject(
  "Sheet1"
)
let excelTable = currentWorksheet.tables.getItemOrNullObject(tableName)
if (excelTable.isNullObject) {
  excelTable = currentWorksheet.tables.add(tableRange, true /* hasHeaders */)
  excelTable.name = tableName
  excelTable.getHeaderRowRange().values = [excelHeaders]
  excelTable.rows.add(null, excelData)
} else {
  excelTable.rows.add(0, excelData)
}

我还尝试删除旧行,然后添加新行。

if (!excelTable.isNullObject) {
  for (let i = tableRows - 1; i >= 0; i--) {
    // Deletes all table rows
    excelTable.rows.items[i].delete()
  }

  excelTable.rows.add(0, excelData)
}

但是.. 只有如果表格的列下方没有内容(没有函数、其他表格等),它可以正常工作。


我尝试了另一种方法:使用 范围。 第一次创建表时,接下来我删除所有行,获取新数据的范围并插入值:

if (excelTable.isNullObject) {
  excelTable = currentWorksheet.tables.add(tableRange, true /* hasHeaders */)
  excelTable.name = tableName
  excelTable.getHeaderRowRange().values = [excelHeaders]
  excelTable.rows.add(null, excelData)
} else {
  let actualRange, newDataRange
  const tableRows = excelTable.rows.items.length
  const tableColumns = excelTable.columns.items.length
  const dataRows = excelData.length
  const dataColumns = excelData[0].length

  actualRange = excelTable.getDataBodyRange()

  for (let i = tableRows - 1; i >= 0; i--) {
    // Deletes all table rows
    excelTable.rows.items[i].delete()
  }

  newDataRange = actualRange.getAbsoluteResizedRange(dataRows, tableColumns)

  newDataRange.values = excelData
}

但这种解决方案仍然存在缺陷。

在 Excel 表格中添加/编辑/删除行需要这么难吗?


第二期: 使用同一个表,如果用户决定添加一些“额外”列(例如,使用基于表值的公式),我是否需要用 null 数据填充这些新列?

const tableColumns = excelTable.columns.items.length
const dataRows = excelData.length
const dataColumns = excelData[0].length

if (tableColumns > dataColumns) {
  let diff = tableColumns - dataColumns

  for (let i = 0; i < diff; i++) {
    for (let j = 0; j < dataRows; j++) {
      excelData[j].push(null)
    }
  }
}

Excel API 无法处理这种情况?

拜托,你能帮帮我吗?

提前谢谢你。

【问题讨论】:

  • 它是否公开 Resize 方法,然后向其中写入新数据?应该覆盖现有的。
  • @QHarr 不,只有两个选项:您可以delete() 表格或add() / delete() 单行
  • 我认为上面的 ranges 选项是您最好的选择(创建表,下次删除所有行,获取新数据的范围并插入值)。我同意这有点笨拙,但可以完成工作。您提到这种方法存在缺点 - 除了有点笨拙之外还有其他问题吗?
  • 谢谢@DougMahugh!是的,它非常笨拙,但这不是唯一的问题:如果我正在更新的表下有另一个表,则该表将与我正在添加/删除的行相关地向上或向下移动。几次数据重新加载后,下部表格将与第一个表格重叠。与此问题相关的任何建议?
  • @Michael Zlatkovsky:你对我的问题有什么建议吗?

标签: javascript excel office365 office-js excel-addins


【解决方案1】:

感谢您的报告。 添加表格行 API 只是向表格行添加行,而不是替换它。 更重要的是。我无法重现删除行的问题。你能告诉我更多细节吗?

【讨论】:

  • 好的,明白了。那么,如果我需要用新的行替换表行,我应该怎么做呢?使用 Table API 的唯一解决方案是删除所有行然后添加新行?要删除行,您需要从表数据中加载值,如:excelTable.rows.load("values") excelTable.columns.load("values") 这里有一个Gist_example
猜你喜欢
  • 2016-03-01
  • 1970-01-01
  • 2012-10-13
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多