在Excel中在Excel中添加行非常慢

时间:2016-05-18 08:03:47

标签: javascript excel office365 office-js

我有一个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秒后无响应,但这需要很长时间才能完成。

我有什么遗漏可以用来改善浏览器的性能吗?

1 个答案:

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