我有一个Excel 2016加载项(任务窗格),该插件在工作表中插入了大约92000行和100列。所有数据均在后端的数据包上划分,并按数据包发送到任务窗格页面。在任务窗格页面上,Java脚本使用带有参数{delayForCellEdit:true}的Excel.run,将每个数据包中的数据插入到当前工作表中。
所有要插入的数据都是字符串的双精度数组
[
["a_1_1", "a_1_2", "a_1_3", ..., "a_1_100"],
["a_2_1", "a_2_2", "a_2_3", ..., "a_2_100"],
...
["a_92000_1", "a_92000_2", "a_92000_3", ..., "a_92000_100"],
]
Packet - JavaScript object, for example first packet will be
Packet={
"number": "1of920",
"data":[
["a_1_1", "a_1_2", "a_1_3", ..., "a_1_100"],
["a_2_1", "a_2_2", "a_2_3", ..., "a_2_100"],
...
["a_100_1", "a_100_2", "a_100_3", ..., "a_100_100"],
]
}
插入数据包数据的功能看起来像这样。
function addDataIntoSheet(Packet){
var startindex = 100 * (parseInt(Packet.number.split('of')[0]) - 1 );
var pExRun = Excel.run({ delayForCellEdit: true }, function (context) {
var currwsheet = context.workbook.worksheets.getActiveWorksheet();
Packet.data.forEach(function (row, index, obj) {
var rowsrange = currwsheet.getRangeByIndexes(startindex + index, 1, 1, row.length);
var rangevalues = new Array(1);
rangevalues[0] = row;
rowsrange.values = rangevalues;
});
return context.sync();
});
pExRun.then(function(){
console.log("Packet " + Packet.number + " inserted");
});
pExRun.catch(function (error) {
console.log("Error: " + error);
if (error instanceof OfficeExtension.Error) {
console.log("addRowsAndDataIntoSheet Debug info: " + JSON.stringify(error.debugInfo));
}
});
}
问题: 在测试过程中,我注意到,如果用户开始编辑按下任意Excel按钮的单元格或调整任何行或列的大小,则会引发以下异常: “ code”:“ GeneralException”,“ message”:“等待上一次调用完成” 结果某些数据包没有插入到工作表中。
如果用户正在平静地等待,则数据插入将完成而不会出现任何错误。
问题: 请尽管用户活动,但建议如何克服此问题并插入大量数据。
答案 0 :(得分:0)
能否给我您正在使用的Excel的确切版本(“文件”>“帐户”>“关于Excel”)。在最新版本的Excel中添加了对单元格编辑支持的延迟,但是在您的版本中可能不存在。同时查看代码,您是否仅向Excel发送一个长时间运行的context.sync()调用,还是多次调用addDataIntoSheet?如果发送数千个数据包的速度比Excel可以使用多个context.sync()处理它们的速度快,则从JavaScript到Excel的未处理请求数上限为50。如果延迟,则很可能会遇到此限制,因为请求被暂停,直到用户退出单元格编辑模式,尽管有可能达到该限制而无需进入单元格编辑模式,具体取决于数据包的传输速度。要解决此问题,您可以在收到Excel的先前响应并确保没有50个未完成的请求之后,将数据包添加到要处理的队列中。