Office.js Word加载项:更新大型表中的值的性能问题

时间:2017-07-04 16:14:24

标签: ms-word office-js

要点:

  • 更新大型Word表格中的值(大于10乘10)非常慢。 表大小会使性能呈指数级下降。
  • 我正在使用myTable.values = arrNewValues。我也试过了 myTable.addRows("end", rows, arrNewValues)。其中arrNewValues是一个 二维数组。
  • 我也尝试过使用getOoxml()和更新 insertOoxml(),但遇到了其他我无法解决的问题 解决,但有良好的表现。
  • 性能缓慢似乎是由“ScreenUpdating”引起的(VBA中存在同样的问题,并通过ScreenUpdating = false解决)。我认为添加临时关闭ScreenUpdating的能力至关重要。
  • 是否有其他方法可以提高表格更新性能?

背景

我的加载项(https://analysisplace.com/Solutions/Document-Automation)执行文档自动化(更新各种Word文档中的内容)。许多客户希望能够更新大表中的文本。有些文件有几十个表(附录)。我遇到了由于表更新而导致更新这些文档的速度慢得令人无法接受(一分钟以上)的问题。

按表格大小更新时间:

  • 2行乘10列:.33秒
  • 4行乘10列:.52秒
  • 8行乘10列:1.5秒
  • 16行乘10列:5.5秒
  • 32行乘10列:20.8秒
  • 64行乘10列:88秒

示例Office.js代码(脚本实验室):

function updateTableCells() {
    Word.run(function (context) {   
        var arrValues = context.document.body.tables.getFirst().load("values");
        return context.sync().then(
            function () {
                var rows = arrValues.values.length;
                var cols = arrValues.values[0].length;
                console.log(getTimeElapsed() + "rows " + rows + "cols " + cols);
                var arrNewValues = [];
                for (var row = 0; row < rows; row++) {
                    arrNewValues[row] = [];
                    for (var col = 0; col < cols; col++) {
                        arrNewValues[row][col] = 'r' + row + ':c' + col;
                    }
                }
                console.log(getTimeElapsed() + 'Before setValues ') ;
                context.document.body.tables.getFirst().values = arrNewValues;
                return context.sync().then(
                    function () {
                        console.log(getTimeElapsed() + "Done");
                });
            });
    })
        .catch(OfficeHelpers.Utilities.log);
}

示例Word VBA代码:

VBA性能类似于没有ScreenUpdating = False的Office.js性能。使用ScreenUpdating = False,性能是即时的。

Sub PopulateTable()
   Application.ScreenUpdating = False
    Dim nrRow As Long, nrCol As Long
    Dim tbl As Word.Table
    Set tbl = ThisDocument.Tables(1)
    For nrRow = 1 To 32
        For nrCol = 1 To 10
            tbl.Cell(nrRow, nrCol).Range.Text = "c" & nrRow & ":" & nrCol
        Next nrCol
    Next nrRow
End Sub

解释性能低下的文章:请参阅“自动化表格时提高绩效”:https://msdn.microsoft.com/en-us/library/aa537149(v=office.11).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-3

指示Office.js中没有“ScreenUpdating = False”的帖子:ScreenUpdating Office-js taskpaneEquivalent to Application.ScreenUpdating Property in office-js Excel add-in 听起来我们不会很快就会看到它。

通过getOoxml()和insertOoxml()与更新表相关的帖子:Word Office.js: issues with updating tables in ContentControls using getOoxml() and insertOoxml()

1 个答案:

答案 0 :(得分:1)

这可能不是您正在寻找的答案,但我一直在使用单词添加来验证软件,我们正在谈论更新500-1000行,并进行大量的格式更改。

无论如何,我发现有一件事有帮助,就是在对表格进行更改之前滚动文档中的其他位置。只是看它的行为将减慢10-20倍。它并不总是即时但接近。