在 MS Word 加载项 Javascript API 中读取 table 边框的颜色和宽度
Read color and width of table border in MS Word add-in Javascript APIs
我正在尝试使用 Word 加载项 Javascript API 来打印文档中所有表格的顶部边框的颜色和宽度。
我正在使用以下代码:
Word.run(function (context) {
var range = context.document.getSelection();
var tables = context.document.body.tables;
context.load(range);
context.load(tables);
return context.sync().then(function () {
for (var i = 0; i < tables.items.length; i++) {
var topBorder = tables.items[i].getBorder("Top");
context.load(topBorder, ['color', 'width']);
var color = "1", width = "1";
context.sync().then(function () {
color = topBorder.color.toString();
width = topBorder.width.toString();
});
range.insertText(color, "End");
range.insertText(width, "End");
}
return context.sync();
});
});
但是当我 运行 这个时,它打印 11 而不是打印正确的值。
我试过在线搜索一些示例代码,但只能找到设置值的代码。我错过了什么?
谢谢!
您的代码中存在一些问题:
- 次要:您不需要加载范围对象,因为您正在写入它,而不是读取它。
- 你在循环中有一个
context.sync
。这很少是个好主意。它会损害性能并使您的代码难以推理。通常的解决方法是循环两次,循环之间有一个 context.sync
。第一个循环填充一个数组(将在第二个循环中循环)并加载将在第二个循环中读取的每个 Office 对象 属性。请参阅下面的代码。
- 你有一个
context.sync().then()
,里面还有一个 context.sync().then()
。如果你把 console.log("outer then")
作为外层 then
的最后一行,把 console.log("inner then")
作为内层 then
的第一行,你会看到你的外层 then
在内部 then
之前完成。这就是为什么你得到“11”。在这些变量已从其初始值更改之前写入文档 运行 的行。
- 我从 运行 在 Script Lab 工具中使用你的代码发现
color = topBorder.color.toString();
行抛出一个错误,指出 color
属性 是未加载。这可能是您的分支 Promise 链的另一个副作用。
以下代码有效、更简单且性能更高,因为无论文档中有多少表,它都只同步 3 次。
Word.run(function (context) {
var range = context.document.getSelection();
var tables = context.document.body.tables.load("items");
var topBorders = [];
return context.sync()
.then(function () {
for (var i = 0; i < tables.items.length; i++) {
topBorders.push(tables.items[i].getBorder("Top").load(['color', 'width']));
}
})
.then(context.sync)
.then(function () {
for (var i = 0; i < topBorders.length; i++) {
range.insertText(topBorders[i].color.toString(), "End");
range.insertText(topBorders[i].width.toString(), "End");
}
})
.then(context.sync)
});
我正在尝试使用 Word 加载项 Javascript API 来打印文档中所有表格的顶部边框的颜色和宽度。
我正在使用以下代码:
Word.run(function (context) {
var range = context.document.getSelection();
var tables = context.document.body.tables;
context.load(range);
context.load(tables);
return context.sync().then(function () {
for (var i = 0; i < tables.items.length; i++) {
var topBorder = tables.items[i].getBorder("Top");
context.load(topBorder, ['color', 'width']);
var color = "1", width = "1";
context.sync().then(function () {
color = topBorder.color.toString();
width = topBorder.width.toString();
});
range.insertText(color, "End");
range.insertText(width, "End");
}
return context.sync();
});
});
但是当我 运行 这个时,它打印 11 而不是打印正确的值。
我试过在线搜索一些示例代码,但只能找到设置值的代码。我错过了什么?
谢谢!
您的代码中存在一些问题:
- 次要:您不需要加载范围对象,因为您正在写入它,而不是读取它。
- 你在循环中有一个
context.sync
。这很少是个好主意。它会损害性能并使您的代码难以推理。通常的解决方法是循环两次,循环之间有一个context.sync
。第一个循环填充一个数组(将在第二个循环中循环)并加载将在第二个循环中读取的每个 Office 对象 属性。请参阅下面的代码。 - 你有一个
context.sync().then()
,里面还有一个context.sync().then()
。如果你把console.log("outer then")
作为外层then
的最后一行,把console.log("inner then")
作为内层then
的第一行,你会看到你的外层then
在内部then
之前完成。这就是为什么你得到“11”。在这些变量已从其初始值更改之前写入文档 运行 的行。 - 我从 运行 在 Script Lab 工具中使用你的代码发现
color = topBorder.color.toString();
行抛出一个错误,指出color
属性 是未加载。这可能是您的分支 Promise 链的另一个副作用。
以下代码有效、更简单且性能更高,因为无论文档中有多少表,它都只同步 3 次。
Word.run(function (context) {
var range = context.document.getSelection();
var tables = context.document.body.tables.load("items");
var topBorders = [];
return context.sync()
.then(function () {
for (var i = 0; i < tables.items.length; i++) {
topBorders.push(tables.items[i].getBorder("Top").load(['color', 'width']));
}
})
.then(context.sync)
.then(function () {
for (var i = 0; i < topBorders.length; i++) {
range.insertText(topBorders[i].color.toString(), "End");
range.insertText(topBorders[i].width.toString(), "End");
}
})
.then(context.sync)
});