繁体   English   中英

Excel C#Interop-将选定范围缩小到仅填充的单元格

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM