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