计算C#

时间:2017-01-19 00:17:54

标签: c# .net excel interop

我一直在c#项目中工作,我想要完成的是计算C#中过滤范围的可见行。

首先,我创建了一个我要过滤的范围。

Range usedRange = sheet.Range[sheet.Cells[7, 1], sheet.UsedRange.SpecialCells(XlCellType.xlCellTypeLastCell)];

然后,我应用了2个过滤器:

  usedRange.AutoFilter(20, "<>RAW", XlAutoFilterOperator.xlFilterValues, "<>AV", true);
  usedRange.AutoFilter(2, "ARG", XlAutoFilterOperator.xlFilterValues, Type.Missing, true);

最后,我使用&#34; XlCellType.xlCellTypeVisible&#34;创建了另一个范围。并尝试计算行数但计数返回1

  argFiltered = usedRange.SpecialCells(XlCellType.xlCellTypeVisible);
  Console.WriteLine("Number of rows: "+ argFiltered.Rows.Count) // the count returns 1.

如果我遍历范围我可以得到计数。但是如果有大量数据,这可能会使这个过程变得很慢:

//this is not effective
foreach (Range area in argFiltered.Areas) {
    foreach (Range areaRow in area) {
      count++;
    }
  }

我的问题是:有没有办法直接获得可见过滤行的数量&#34;?

谢谢大家!

注意: 如果我选择范围,它会选择应在计数中显示的确切行数!。

argFiltered.Select();

2 个答案:

答案 0 :(得分:0)

不理想,但这会更好一点:

foreach (Range area in argFiltered.Areas) {
    count += area.Rows.Count;
}

答案 1 :(得分:0)

你能负担得起将一个公式放在一些计算行数的未使用的单元格中吗?如果您使用代码3的Subtotal函数,则不会计算过滤器隐藏的行数。将公式放入单元格并读取其值,例如

sheet.Cells[1, 255].Formula = "=subtotal(3, A1:A16383)"; //Count all rows that have a non-blank column A and aren't hidden
var count = sheet.Cells[1, 255].Value;
sheet.Cells[1, 255].ClearContents();