excel - Excel Javascript (Office.js) - LastRow/LastColumn - 更好的选择?
问题描述
在过去的几年里,我一直是 StackOverflow 的狂热读者,通过搜索和一些调整,我几乎可以解决 VBA Excel 中的所有问题。我以前从未觉得有必要发布任何问题,所以如果这以某种方式重复了其他内容,或者已经有答案但我找不到它,我深表歉意。现在我正在考虑使用 Excel-JS 来创建一个 AddIn(或更多),但不得不说 Javascript 并不完全是我的生计。在使用 VBA 的过程中,我发现最简单和最常见的需求之一是获取工作表或给定范围中的最后一行,并且可能不太经常获取最后一列。
我已经设法在 Javascript 中将一些代码放在一起以获得类似的功能,并且实际上......它可以工作。我发布这个有两个原因
- 希望改进代码和我的知识
- 也许其他人可以同时使用该代码
所以......为了得到我的 lastrow/lastcolumn,我使用全局变量:
var globalLastRow = 0; //Get the last row in used range
var globalLastCol = 0; //Get the last column in used range
使用返回 lastrow/lastcolumn 的函数填充全局变量:
function lastRC(wsName) {
return Excel.run(function (context) {
var wsTarget = context.workbook.worksheets.getItem(wsName);
//Get last row/column from used range
var uRange = wsTarget.getUsedRange();
uRange.load(['rowCount', 'columnCount']);
return context.sync()
.then(function () {
globalLastRow = uRange.rowCount;
globalLastCol = uRange.columnCount;
});
});
}
最后在其他函数中获得我需要它们的值:
var lRow = 0; var lCol = 0;
await lastRC("randomSheetName");
lRow = globalLastRow; lCol = globalLastCol;
我主要感兴趣的是我是否可以直接从函数 lastRC(以及如何...)返回值,而不是使用这个解决方案。
非常感谢任何建议(理想情况下,如果它们不附带石头)。
编辑:
我现在已经放弃了为此使用额外的功能,因为它使用了 extra context.sync
,并且正如我在这篇文章之后所读到的,同步越少越好。
此外,上面的方法只是好的,只要您使用的范围从单元格“A1”开始(或者至少在第一行/列中),否则当您需要索引时,行/列计数并不完全有用。
幸运的是,还有另一种方法可以获取最后一行/列:
var uRowsIndex = ws.getCell(0, 0).getEntireColumn().getUsedRange().getLastCell().load(['rowIndex']);
var uColsIndex = ws.getCell(0, 0).getEntireRow().getUsedRange().getLastCell().load(['columnIndex']);
要分解此示例之一,您是:
- 从单元格“A1”开始
getCell(0, 0)
- 选择整个列“A:A”
getEntireColumn()
- 选择该列中的已用范围
getUsedRange()
(即:“A1:A12”) - 选择使用范围内的最后一个单元格
getLastCell()
(即:“A12”) - 加载行索引
load(['rowIndex'])
(对于“A12”rowIndex = 11)
如果您的数据是恒定的,并且您不需要检查特定列的 lastrow (或特定行的最后一列),那么上面的较短版本是:
uIndex = ws.getUsedRange().getLastCell().load(['rowIndex', 'columnIndex']);
最后,请记住,usedrange 也会考虑格式化,而不仅仅是值,因此如果您在数据下格式化了行,请期待意外。
后期编辑- 您可以指定是否希望您使用的范围仅为值(感谢 Ethan):
getUsedRange(valuesOnly?: boolean): Excel.Range;
我必须非常感谢Michael Zlatkovsky,他在大量文档中投入了大量工作,但我还远远没有读完。
解决方案
推荐阅读
- vim - 如何在多选中替换文本
- c# - 逐行从 7zip 流中读取文本文件
- java - 错误:无法写入 JSON:类 java.util.ArrayList 不是映射的子类型 - Spring 应用程序中的 JSON 序列化
- tensorflow2.0 - 将 tf.data.Dataset 与 tf Hub 模块一起使用
- laravel - 刀片文件的 Laravel 命名约定
- regex - 正则表达式:在降价中抓取段落
- javascript - MongoDB:仅投影数组中查询的项目?
- python - 无法从教科书进入 txt 文件
- c - 如何逐字读取文件?
- css - 当 minmax 为: minmax(auto, auto) 时会发生什么