繁体   English   中英

使用office-js删除excel表中的行

[英]Deleting rows in excel table with office-js

我的添加中有一个 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);
    });

可迭代集合的想法是它们由不同的项目组成。 一旦您以不适当的方式从这些项目中删除某些内容,该集合就不再是一个集合。 这是因为它们被实现为一个链表,其中每个单元只知道下一个单元。 https://en.wikipedia.org/wiki/Linked_list

在您的情况下,您正在删除 for-each 循环。 第一次删除后,集合被破坏。 因此,您需要另一种方法


另一种方法

使用正常的 for 循环开始循环。 反转。 例如:

for i = TotalRows to 1 i--
  if row(i) something then delete

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

当您删除一行时,Excel 将对每一行的行索引重新排序:即,当您删除第 1 行时,第 2 行变为第 1 行,而所有其他行将向下移动 1 个索引。 因为这些删除被推到一个batch待完成,当执行第二次删除时,你的第二行就变成了第一行,所以它实际上跳过了第二行,执行了你认为是你的第三行。

如果您从最后一行开始并向后工作,则不会发生这种重新排序,也不会出现错误。

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

        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");
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM