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

时间:2014-01-23 16:04:43

标签: c# excel interop vsto

我有一个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;

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

为什么不将范围 range.Cells 转换为数组并在内存中处理此问题。 它比迭代每个单元格更快,然后你可以使用Linq的所有内存功能或任何来过滤和更正你的数据...然后你只需发送回excel更新的范围。

这样做的:

var obj = range.Cell

会将您的范围转换为2个维度的object[,]。 我想

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

也可以。

问候。

相关问题