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

时间:2017-12-04 09:30:50

标签: excel office365 office-js excel-addins

我在我的添加中有一个ajax调用,它应该在excel中创建或更新表。如果table已存在,则应删除行并添加新结果。 在循环中删除行时,它会删除一些行,然后我收到以下错误:

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 个答案:

答案 0 :(得分:2)

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

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

另一种方法

使用正常for循环开始循环。逆转。 E.g:

if (Optional.ofNullable(per.isRegistered()).orElse(false)) {
  // ...
}

答案 1 :(得分:0)

这个问题已经得到解答,但是我最近亲自解决了这个问题,来到这里看看是否有人对此发表了疑问。

删除行时,Excel将为每行重新排列行索引:即,删除行1时,行2变为行1,而所有其他行下移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");
            }