在与Excel循环交互时,使用Office.js api会导致性能问题。我们正在将Windows 10版本1803与Excel 2016版本1805(内部版本9330.2124)一起进行开发。
附加内置的MS Edge DevTools(在Windows 10中为F12 \ IEChooser.exe)可以显着提高迭代速度(它将快3-4倍,并且“更平滑”)。一旦连接了DevTools,即使我们关闭了DevTools,仍然可以保持提高的速度。但是,重新启动Excel之后,迭代速度再次变慢。
在循环的每个周期中,我们与Office.js Excel api的交互都包括三个部分:
以下代码给出了一组写入范围,读取范围和迭代次数:
private init() {
this.writeRanges = ['A1:A1', 'A2:A2', 'A3:A3', 'A4:A4', 'A5:A5', 'A6:A6', 'A7:A7', 'A8:A8', 'A9:A9', 'A10:A10'];
this.readRangeList = ['C1:C1', 'C2:C2', 'C3:C3', 'C4:C4', 'C5:C5', 'C6:C6', 'C7:C7', 'C8:C8', 'C9:C9', 'C10:C10'];
this.numberOfSteps = 100;
const ctx = new Excel.RequestContext();
const self = this;
ctx.sync().then(() => self.step(0, ctx));
}
private step(it: number, ctx: Excel.RequestContext) {
const self = this;
if (it < this.numberOfSteps) {
// write to cells
this.writeRanges.forEach(writeRange => {
let range = ctx.workbook.worksheets.getItem('Sheet1').getRange(writeRange);
range.values = [[it]]; // single value in a matrix
});
ctx.sync().then(() => {
// read from cells
const rangeList = [];
self.readRangeList.forEach(readRange => {
let range = ctx.workbook.worksheets.getItem('Sheet1').getRange(readRange);
range.load('values'); // in order to read it later
rangeList.push(range);
});
ctx.sync().then(() => {
// store result & step
let iterationResult = [];
rangeList.forEach(range => iterationResult.push(range.values[0][0]));
self.results.push(iterationResult);
self.step(it + 1, ctx);
});
});
} else {
console.log('finished');
}
}
以上解决方案使用递归方法调用,但在每次写入/读取操作之前,也使用await
使用for循环对其进行了测试,而速度没有差异。
能否请您帮助我们理解为什么在使用DevTools时会获得性能提升?没有DevTools,我们如何才能达到相同的性能指标?