C#Excel自动化:使用SpecialCells()检索AutoFilter()后的行似乎不能正常工作

第一次海报在这里:)。 从WinForms C#应用程序自动化Excel 2010中遇到以下问题。 我的testing表看起来如下:

Index Value1 Value2 AAA 2 3 AAA 3 4 AAA 3 8 BBB 2 2 BBB 5 6 BBB 3 5 CCC 1 2 CCC 2 2 DDD 2 5 

我成功地打开了工作簿并从我的C#应用​​程序加载工作表。 之后,我运行下面的代码:

  Excel.Range range = xlSheet.UsedRange; range.AutoFilter(1, "AAA", Excel.XlAutoFilterOperator.xlAnd, Type.Missing, true); Excel.Range filteredRange = range.SpecialCells(Excel.XlCellType.xlCellTypeVisible); 

这按预期工作,并且filterRange现在包含我的testing表的前四行(列名称和所有“AAA”行)。 但是,如果我尝试使用AutoFilter来获取所有“BBB”行,就像这样

  range.AutoFilter(1, "BBB", Excel.XlAutoFilterOperator.xlAnd, Type.Missing, true); Excel.Range filteredRange = range.SpecialCells(Excel.XlCellType.xlCellTypeVisible); 

过滤范围内的表格(列名称)只有第一行。 如果我真的在Excel中打开表,我可以看到它被正确过滤(“BBB”行)被过滤,但不知何故Range.SpecialCells()方法不像预期的那样行为,只返回第一行。 我尝试了所有我能想到的,但是因为我是新来的Excel自动化,也许我错过了一些东西,所以我想你们可以帮忙。 唯一让我想到的是,在第一种情况下(“AAA”),所有可见的行是连续的 – 列名在第1行,“AAA”行分别是2,3和4。 在第二种情况下,名称在第一行,但“BBB”行的索引是5,6和7,即表中有一个“洞”。 这可能会影响SpecialCells()方法吗?

预先感谢您的任何input!

好,我解决了我自己的问题,但是我想分享一下,因为有些其他可怜的灵魂有一天可能会遇到同样的问题。 基本上,我的第一个想法,这个问题可能是行不连续导致我正确的答案。 只要所有的过滤值都在表格的第一行下方,SpecialCells()方法就会返回一个单独的区域,因此filteredRange在其Value2成员中显示了所有需要的值(在上面的testing用例中,全部“AAA”)行。 但是,如果过滤的行在表格中更靠后,就像“BBB”一样,SpecialCells()方法返回多个区域,在这种情况下,两个第一个区域只包含列名称行,第二个区域包含三个“BBB”行。 解决scheme是遍历过滤范围中的所有区域,并从中提取/处理值:

  for (int areaId = 1; areaId <= filteredRange.Areas.Count; areaId++) { Excel.Range areaRange = filteredRange.Areas.get_Item(areaId); object[,] areaValues = areaRange.Value2; // Do something with the values here... 

就是这样了。 我希望这有助于别人有一天…

尝试以下操作:

 var rowcount = filteredRange.Count / filteredRange.Columns.Count;