【发布时间】: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 taskpane 和 Equivalent 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()
【问题讨论】: