Excel C#Interop – 将选定的范围仅限于填充的单元格

我有一个VSTO解决scheme,纠正突出显示的单元格中的数据。 我遇到的问题是,如果用户select整个行/列,程序循环通过成千上万的空单元格,处理最后一个填充的单元格很长时间。

我的代码如下所示:

var addIn = Globals.ThisAddIn; Excel.Worksheet sheet = addIn.Application.ActiveSheet; Excel.Range range = addIn.Application.Selection; foreach (Excel.Range cell in range.Cells) { var val = cell.Value2; if (val == null) continue; 

我已经看到如何使用线程:

 AdvancedFilter(Excel.XlFilterAction.xlFilterInPlace, Type.Missing) 

但我似乎无法把两者联系起来。 我希望我的“范围”对象仅限于填充单元格,或者当超过最后一个值时能够将我的foreach循环短路。

我想到做这样的事情:

 if (cell.Row > populatedRange.Row || cell.Column > populatedRange.Column) break; 

但是,如果select了除整行/列以外的其他选项(用户select填充范围之外的单元格,并忽略所有后续填充的单元格),则这可能会破坏代码。

我知道我错过了一些简单的事情,但是我的尝试(和search)还没有得出答案。

您可以使用表单上的Range.SpecialCells方法来查找最后一个单元格。 然后你可以修改你的循环,当你移出最后一行或一列时退出。 以下代码片段将给出最后一个单元格的行号和列号。 你仍然可以处理一些空的单元格,但是你不会一直走到1048574行。

 Excel.Range last = Globals.Sheet1.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing); int lastRowNumber = last.Row; int lastColumnNumber = last.Column; 

你为什么不转换你的范围range.Cells成一个数组,并在内存中处理这个。 它的方式比遍历每个单元格更快,然后您可以使用Linq的所有内存function或其他任何方法来过滤和更正您的数据…然后您只需发回以更新范围。

这样做:

 var obj = range.Cell 

将你的范围投射到2维的object[,]中。 我认为

 System.Array myArray = (System.Array)(range.Cells) 

也会工作。

问候。