没有Microsoft Edge DevTools的Office.js Excel性能问题

时间:2018-06-29 11:25:52

标签: office-js

在与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的交互都包括三个部分:

  • 将数字写入一组Excel范围
  • 从另一组Excel范围中读取公式结果
  • 将结果存储在列表中

以下代码给出了一组写入范围,读取范围和迭代次数:

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,我们如何才能达到相同的性能指标?

0 个答案:

没有答案