【问题标题】:Excel C# Interop - narrow selected range to populated cells onlyExcel C# 互操作 - 将选定范围缩小到仅填充的单元格
【发布时间】:2014-02-14 07:23:51
【问题描述】:

我有一个 VSTO 解决方案,可以更正突出显示的单元格中的数据。我遇到的问题是,如果用户选择了整个行/列,程序会在最后一个 populated 单元格被处理很久之后循环数以千计的空单元格。

我的代码如下所示:

        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;

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

我知道我遗漏了一些简单的东西,但我的尝试(和搜索)没有得到答案。

【问题讨论】:

    标签: c# excel interop vsto


    【解决方案1】:

    您可以使用工作表上的 Range.SpecialCells 方法来查找最后一个单元格。然后,您可以修改循环以在超出最后一行或最后一列时退出。以下 sn-p 将为您提供最后一个单元格的行号和列号。您可能仍会处理一些空单元格,但不会一直到第 1048574 行。

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

    【讨论】:

    • 我不知道为什么我花了一年的时间才最终承认这一点,但这就是我最终要做的……所以非常迟到的感谢。不管怎样,我花了这么长时间才做我妻子想让我做的事情。
    【解决方案2】:

    您为什么不将您的范围range.Cells 转换为数组并在内存中处理它。 它比遍历每个单元格更快,然后您可以使用 Linq 的所有内存功能或其他任何东西来过滤和更正您的数据......然后您只需将更新的范围发送回 Excel。

    在做:

    var obj = range.Cell
    

    会将您的范围转换为二维的object[,]。 我觉得

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

    也可以。

    问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 2017-09-07
      • 2014-07-10
      相关资源
      最近更新 更多