我有一个JavaScript导入加载项,我在其中使用TableBinding.addRowsAsync函数将行添加到20列的表中。在桌面客户端中,这在添加大量行时非常有效,但在Excel中,在线性能很糟糕。对于100行,平均添加时间为1500毫秒。对于300,它上升到大约2100ms。以下是性能测试的实际代码:
//vm.binding is a tableBinding
//vm.testData is an array of twenty string values
vm.binding.addRowsAsync(vm.testData, function (result) {
//...
});
我需要支持导入大量行(平均20000)。目前,此导入以100页为单位添加,以防止加载项在5秒后无响应,但这需要很长时间才能完成。
我有什么遗漏可以用来改善浏览器的性能吗?
答案 0 :(得分:2)
我正在跟进为什么使用该API向表绑定添加行的速度很慢。请继续关注(虽然也意识到任何错误修复都不会立即发生......)
您可以尝试的一件事 - 我不确定它是否会更快 - 是使用此处概述的特定于主机的Excel API:https://github.com/OfficeDev/office-js-docs/tree/master/excel
在您的情况下,代码将类似于:
Excel.run(function (ctx) {
var expenseTable = ctx.workbook.tables.getItem("ExpenseTable");
expenseTable.rows.add(null,[['Rent','$600','Housing']]);
expenseTable.rows.add(null, [["Movie Club", "$75", "Entertainment"]]);
expenseTable.rows.add(null, [["Food", "$450", "Food"]]);
expenseTable.rows.add(null, [["Car", "$150", "Transportation"]]);
expenseTable.rows.add(null, [["Tuition", "$800", "School costs"]]);
expenseTable.rows.add(null, [["Books", "$150", "School costs"]]);
expenseTable.rows.add(null, [["Gift", "$100", "Other"]]);
expenseTable.rows.add(null, [["Loan", "$250", "Loans/Payments"]]);
return ctx.sync();
})
.catch(function (error) {
console.log(JSON.stringify(error));
});
API仅适用于Excel Online或Excel 2016(不是2013)。但是,如果这对您来说是个问题,您仍然可以在桌面上使用当前的方法,并在线使用新方法(假设它更快)。只是做
if (Office.context.requirements.isSetSupported("ExcelApi")) {
Excel.run(...)
} else {
bindings.addRowsAsync(...)
}
希望这有帮助!
~Michael Zlatkovsky,Office Extensibility团队的开发人员,MSFT