查找哪些单元格应用了下拉过滤器 - Interop Excel

Find which cells have a dropdown filter applied - Interop Excel

我正在尝试检查工作表是否有任何过滤器(无论是否应用),如果有,我想找出哪些单元格或行具有过滤器功能。

我试过: var filter = ((dynamic) range.AutoFilter(rowStart, j);

还有这个看整张工作表有没有

var range = workbookWorksheet.UsedRange; 
var sheet= application.ActiveWindow.ActiveSheet;
Range filteredRange = range.SpecialCells(XlCellType.xlCellTypeVisible, XlSpecialCellsValue.xlTextValues);
var sdsds = filteredRange.AutoFilter();

尝试在没有 Plus 或 Interop 以外的其他库的情况下执行此操作。不确定这是否可行,但我们将不胜感激。

您可以使用 AutoFilter 属性 检查 Worksheet 中是否有过滤器。

为了获取地址,您需要遍历过滤器。 使用过滤器的 On 属性 检查是否为 on/off.

    // check if there are filters in the worksheet.
    if (workbookWorksheet.AutoFilter == null ||
        workbookWorksheet.AutoFilter.Filters.Count == 0)
    {
        // no filters
        return;
    }

    // go over the filters and get the addresses
    for (var i = 1; i < ws.AutoFilter.Filters.Count; i++)
    {
        var filter = ws.AutoFilter.Filters[i];
        Console.WriteLine(filter.On); // print/check if the filter is on.

        Range range = ws.AutoFilter.Range[1, i];
        Console.WriteLine(range.Address); // address of the filter cell
    }

更新: 不确定这是最有效的方法,但它可以完成工作。 此函数将范围作为参数并检查它是否具有过滤器,如果过滤器打开,则 returns 为真。

注意:如果您更喜欢使用绝对地址,请将参数更改为字符串地址。

private bool HasFilterOn(Range range)
{       
    // check if there are filters in the worksheet.
    if (workbookWorksheet.AutoFilter == null ||
        workbookWorksheet.AutoFilter.Filters.Count == 0)
    {
        // no filters
        return false;
    }

    // go over the filters and get the addresses
    for (var i = 1; i < workbookWorksheet.AutoFilter.Filters.Count; i++)
    {
        var filter = workbookWorksheet.AutoFilter.Filters[i];

        if (workbookWorksheet.AutoFilter.Range[1, i].Address == range.Address)
            return filter.On;
    }

    return false;
}