Complemento de Office.js Word: problema de rendimiento con la actualización de valores en tablas grandes

Resumen:

La actualización de valores en tablas de Word grandes (mayores de 10 por 10) es muy lenta. El rendimiento empeora exponencialmente con el tamaño de la tabla.Estoy usandomyTable.values = arrNewValues. También he intentadomyTable.addRows("end", rows, arrNewValues). Donde arrNewValues es una matriz 2D.También intenté usar la actualización a través de getOoxml () e insertOoxml (), pero me encontré con otros problemas que no he podido resolver, pero que tiene un buen rendimiento.El rendimiento lento parece ser causado por "ScreenUpdating" (el mismo problema existe en VBA y se resuelve a través de ScreenUpdating = false). Creo que es muy importante agregar la capacidad de desactivar temporalmente ScreenUpdating.¿Hay alguna otra forma de mejorar el rendimiento de actualización de la tabla?

Antecedentes:

Mi complemento (https://analysisplace.com/Solutions/Document-Automation) realiza la automatización de documentos (actualiza el contenido en una variedad de documentos de Word). Muchos clientes desean poder actualizar el texto en tablas grandes. Algunos documentos tienen docenas de tablas (apéndices). Me he encontrado con el problema donde la actualización de estos documentos es inaceptablemente lenta (más de un minuto) debido a las actualizaciones de la tabla.

Tiempo de actualización por tamaño de tabla:

2 filas por 10 columnas: .33 segundos4 filas por 10 columnas: .52 segundos8 filas por 10 columnas: 1.5 segundos16 filas por 10 columnas: 5.5 segundos32 filas por 10 columnas: 20.8 segundos64 filas por 10 columnas: 88 segundos

Código de Office.js de muestra (Script Lab):

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);
}

Código de VBA de Word de muestra:

El rendimiento de VBA es similar al rendimiento de Office.js sin ScreenUpdating = False. Con ScreenUpdating = False, el rendimiento es instantáneo.

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

Artículo que explica el rendimiento lento: consulte "Mejora del rendimiento al automatizar tablas":https://msdn.microsoft.com/en-us/library/aa537149(v=office.11).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-3

Publicaciones que indican que no hay "ScreenUpdating = False" en Office.js:ScreenUpdating Office-js taskpane yEquivalente a Application.ScreenUpdating Property en el complemento office-js Excel Parece que no lo veremos pronto.

Publicaciones relacionadas con las tablas de actualización a través de getOoxml () e insertOoxml ():Word Office.js: problemas con la actualización de tablas en ContentControls usando getOoxml () e insertOoxml ()

Respuestas a la pregunta(1)

Su respuesta a la pregunta