[英]Excel C# Interop - narrow selected range to populated cells only
我有一个VSTO解决方案,可以纠正突出显示的单元格中的数据。 我遇到的问题是,如果用户选择整个行/列,则在处理完最后一个填充的单元很长时间之后,该程序将循环遍历数千个空单元格。
我的代码如下所示:
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;
但是,如果选择了除整个行/列以外的内容,则有可能破坏代码(用户选择一个不在填充范围内的单元格,而所有后续填充的单元格都将被忽略)。
我知道我缺少一些简单的东西,但是我的尝试(和搜索)没有给出答案。
您可以在工作表上使用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的所有内存功能或其他任何功能来过滤和更正数据...然后您只需发送回excel至更新范围即可。
这样做:
var obj = range.Cell
会将您的范围转换为2维的object[,]
。 我认为
System.Array myArray = (System.Array)(range.Cells)
也会工作。
问候。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.