Excel加载项-向现有表添加行

时间:2018-10-31 14:42:28

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

在使用Javascript Excel API创建Excel加载项时遇到一些麻烦。

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

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

这似乎很简单:表命名空间(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)
}

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


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

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无法处理这种情况?

请,你能帮我吗?

先谢谢您。

1 个答案:

答案 0 :(得分:0)

感谢您的举报。 添加表行API只是将行添加到表行中,而不是替换它。 更重要的是。我无法通过删除行来解决这个问题。你能告诉我更多细节吗?