【发布时间】: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