【问题标题】:Office.js Word Add-In: Performance Issue with Updating Values in Large TablesOffice.js Word 加载项:在大表中更新值的性能问题
【发布时间】:2017-07-18 22:22:13
【问题描述】:

总结:

  • 更新大型 Word 表(大于 10 x 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 行 x 10 列:0.33 秒
  • 4 行 x 10 列:0.52 秒
  • 8行10列:1.5秒
  • 16 行 x 10 列:5.5 秒
  • 32 行 x 10 列:20.8 秒
  • 64 行 x 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()

【问题讨论】:

    标签: ms-word office-js


    【解决方案1】:

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

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

    【讨论】:

    • 在我的测试中,如果表格不可见,它确实会减少大约 30% 的更新时间。但是根据您的想法,我还发现如果未选中“自动调整大小以适应内容”,那么更新时间将减少 80%。因此,对于 32x10 的桌子,它可以从 21 秒减少到 1.7 秒。该选项在 TableTools > Layout > Properties > Table > Options 中设置。不幸的是,我没有看到任何使用 Office.js 将其关闭的方法,因此必须由用户手动将其关闭。
    • 我更新真实客户文件的次数越多,我就越意识到您是正确的。如果我在文档顶部没有可见的大表,Office.js 可以快速更新包含许多表的大型文档。如果我在文档的末尾(即使周围没有桌子),它也会慢一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多