我一直在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();
答案 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();