获取选定范围内每个单元格的宽度和高度
Getting the width and height of every cell in a selected range
为了给您一些上下文,我正在尝试检索选定范围内每个单元格的 width
和 height
属性。为此,我正在使用 Office Javascript API,到目前为止,我能想到的唯一方法是遍历选定范围内的每个单元格,并为每个单元格检索所述属性。
假设 selectedRange
是用户的选择并且预先加载了适当的属性,这就是我想要的:
for (let r = 0; r < selectedRange.rowCount; r++) {
console.log(selectedRange.getRow(r).height);
for (let c = 0; c < selectedRange.columnCount; c++) {
console.log(selectedRange.getColumn(c).width);
}
}
然而,问题是每个列和行的 width
和 height
属性没有加载,如果我错了请更正我,但它们必须加载到为每一列和每一行循环。这反过来意味着在循环中多次调用 context.sync()
,根据官方文档,这是一个非常糟糕的主意。
那么,是否有另一种方法可以做到这一点,而不需要经常调用 context.sync()
?
我对 Office Js 还是很陌生,所以非常感谢任何帮助。谢谢大家!
如果我对你的场景的理解正确,你想访问每个单元格的高度和宽度。
所以你可以试试 range.format.rowHight
和 range.format.columnWidth
因此您可以使用 range.getCellProperties
,它将 return 一个二维数组,其中包含该范围内每个单元格的宽度和高度信息。
这是 range.getCellProperties
的文档
https://docs.microsoft.com/en-us/javascript/api/excel/excel.range?view=excel-js-preview#getcellproperties-cellpropertiesloadoptions-
一种可能的方法是保留所有范围(单元格)并将它们全部加载到同一个 context.sync() 中,然后输出高度和宽度。您必须调用 range.untrack 以节省内存。
https://docs.microsoft.com/en-us/javascript/api/excel/excel.range?view=excel-js-preview#untrack--
另外,你上面的代码可以做一些优化,不需要是n*m,n+m就够了。
让 selectedRange = context.workbook.getSelectedRange();
selectedRange.load("rowCount,columnCount");
await context.sync();
for (let r = 0; r < selectedRange.rowCount; r++) {
let row = selectedRange.getRow(r);
row.load("height");
await context.sync();
console.log(row.height);
}
for (let c = 0; c < selectedRange.columnCount; c++) {
let column = selectedRange.getColumn(c);
column.load("width");
await context.sync();
console.log(column.width);
}
是的。有一种方法可以在不在循环内调用 context.sync 的情况下执行此操作。您需要使用拆分循环模式。有关详细信息和示例,请参阅 Avoid using the context.sync method in loops 及其链接到的 Stack 答案。
为了给您一些上下文,我正在尝试检索选定范围内每个单元格的 width
和 height
属性。为此,我正在使用 Office Javascript API,到目前为止,我能想到的唯一方法是遍历选定范围内的每个单元格,并为每个单元格检索所述属性。
假设 selectedRange
是用户的选择并且预先加载了适当的属性,这就是我想要的:
for (let r = 0; r < selectedRange.rowCount; r++) {
console.log(selectedRange.getRow(r).height);
for (let c = 0; c < selectedRange.columnCount; c++) {
console.log(selectedRange.getColumn(c).width);
}
}
然而,问题是每个列和行的 width
和 height
属性没有加载,如果我错了请更正我,但它们必须加载到为每一列和每一行循环。这反过来意味着在循环中多次调用 context.sync()
,根据官方文档,这是一个非常糟糕的主意。
那么,是否有另一种方法可以做到这一点,而不需要经常调用 context.sync()
?
我对 Office Js 还是很陌生,所以非常感谢任何帮助。谢谢大家!
如果我对你的场景的理解正确,你想访问每个单元格的高度和宽度。
所以你可以试试 range.format.rowHight
和 range.format.columnWidth
因此您可以使用 range.getCellProperties
,它将 return 一个二维数组,其中包含该范围内每个单元格的宽度和高度信息。
这是 range.getCellProperties
的文档
https://docs.microsoft.com/en-us/javascript/api/excel/excel.range?view=excel-js-preview#getcellproperties-cellpropertiesloadoptions-
一种可能的方法是保留所有范围(单元格)并将它们全部加载到同一个 context.sync() 中,然后输出高度和宽度。您必须调用 range.untrack 以节省内存。
https://docs.microsoft.com/en-us/javascript/api/excel/excel.range?view=excel-js-preview#untrack--
另外,你上面的代码可以做一些优化,不需要是n*m,n+m就够了。
让 selectedRange = context.workbook.getSelectedRange();
selectedRange.load("rowCount,columnCount");
await context.sync();
for (let r = 0; r < selectedRange.rowCount; r++) {
let row = selectedRange.getRow(r);
row.load("height");
await context.sync();
console.log(row.height);
}
for (let c = 0; c < selectedRange.columnCount; c++) {
let column = selectedRange.getColumn(c);
column.load("width");
await context.sync();
console.log(column.width);
}
是的。有一种方法可以在不在循环内调用 context.sync 的情况下执行此操作。您需要使用拆分循环模式。有关详细信息和示例,请参阅 Avoid using the context.sync method in loops 及其链接到的 Stack 答案。