我有一个JavaScript导入外接程序,其中使用TableBinding.addRowsAsync函数将行添加到20列的表中。在桌面客户端中,当添加大量行时,此方法效果很好,但是在Excel Online中,性能却很糟糕。对于100行,平均添加时间为1500ms。对于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秒钟后变得无响应,但这需要很长时间才能完成。

有什么我可以提高浏览器性能的东西吗?

最佳答案

我正在跟踪为什么使用该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(...)
}


希望这可以帮助!

〜MSFT Office可扩展性团队的开发人员Michael Zlatkovsky

10-05 20:44
查看更多