使用office-js在Excel表格中删除行

3
我在我的插件中有一个ajax调用,它应该创建或更新Excel表格。如果表格已经存在,它应该删除行并添加新的结果。当在循环中删除行时,它会删除一些行,然后我会收到以下错误信息:Debug info: {"code":"InvalidArgument","message":"The argument is invalid or missing or has an incorrect format.","errorLocation":"TableRowCollection.getItemAt"}。我的Excel Web插件中的ajax调用如下:
$.ajax({
        //....
    }).done(function (data) {
        Excel.run(function (ctx) {
            var odataTable = ctx.workbook.tables.getItemOrNullObject("odataTable");
            //rows items are not available at this point, that is why we need to load them and sync the context
            odataTable.rows.load();

            return ctx.sync().then(function () {
                if (odataTable.rows.items == null) {
                    odataTable.delete();
                    odataTable = ctx.workbook.tables.add('B2:G2', true);
                    odataTable.name = "odataTable";
                } else {
                    console.log("Rows items:" + odataTable.rows.items.length);
                    odataTable.rows.items.forEach(function (item) {
                        console.log("Removing row item: " + item.values);
                        item.delete();
                    });
                    console.log("rows cleaned");
                }
            }).then(function () {
                //add rows to the table
                });
            }).then(ctx.sync);

        }).catch(errorHandler);

    }).fail(function (status) {
        showNotification('Error', 'Could not communicate with the server. ' + JSON.stringify(status));
    }).always(function () {
        $('#refresh-button').prop('disabled', false);
    });
2个回答

3
可迭代集合的概念是由不同的项组成。如果您以不适当的方式从这些项中删除某些内容,则该集合将停止成为集合。这是因为它们被实现为链接列表,其中每个单元仅知道下一个单元。https://en.wikipedia.org/wiki/Linked_list 在您的情况下,您正在使用for-each循环进行删除。在第一次删除后,集合就会中断。因此,您需要另一种方法
另一种方法: 使用正常的for循环开始循环。反向。 例如:
for i = TotalRows to 1 i--
  if row(i) something then delete

好的观点,但我仍然遇到这个问题。使用这种方法,没有任何行被删除。 - undefined
1
实际上,你的方法有效。问题出在零索引上。 - undefined

1

这个问题已经有人回答过了,但我最近自己解决了这个问题,来这里看看是否有人发布了相关问题。

当你删除一行时,Excel会重新排序每一行的索引:即当你删除第一行时,第二行变为第一行,所有其他行向下移动1个索引。因为这些删除被推到一个批处理中完成,当执行第二次删除时,你的第二行已经变成了第一行,所以它实际上跳过了第二行并执行了你认为是第三行的操作。

如果你从最后一行开始倒序工作,这种重新排序不会发生,错误也不会发生。

为了完整起见,上面的示例将变为:

        return ctx.sync().then(function () {
            if (odataTable.rows.items == null) {
                odataTable.delete();
                odataTable = ctx.workbook.tables.add('B2:G2', true);
                odataTable.name = "odataTable";
            } else {
                console.log("Rows items:" + odataTable.rows.items.length);
                for (let i = odataTable.rows.items.length -1; i >= 0; i--) // reverse loop
                    odataTable.rows.items[i].delete();
                }
                console.log("rows cleaned");
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接