11

因此,我在 Excel 文档中进行了一些搜索,但其他人打开过滤器并保持打开状态是很常见的。当这些过滤器打开时,这些单元格不包含在工作表的单元格范围内。

有没有办法关闭这些自定义过滤器,以便我仍然可以访问工作表中的所有单元格?

这是我用来查找方法的方式

Microsoft.Office.Interop.Excel.Range find = sheet.Cells.Find(tapeID, Type.Missing,
Microsoft.Office.Interop.Excel.XlFindLookIn.xlValues, Microsoft.Office.Interop.Excel.XlLookAt.xlPart, 
Microsoft.Office.Interop.Excel.XlSearchOrder.xlByRows, Microsoft.Office.Interop.Excel.XlSearchDirection.xlNext, false, Type.Missing, Type.Missing); 

当过滤器打开时,我会返回一个空对象,并且除了关闭过滤器之外什么也做不了,我得到了我需要的东西。

关于关闭过滤器的任何提示?

4

4 回答 4

13

我将首先测试是否已应用过滤器,然后将其停用:

if (xlSheet.AutoFilter != null)
{
    xlSheet.AutoFilterMode = false;
}

这应该删除已应用的任何过滤并删除过滤箭头按钮。

于 2012-11-03T00:59:31.560 回答
3

您可以通过在不带参数的范围内调用AutoFilter方法两次来禁用所有过滤器。

sheet.Cells.AutoFilter();
sheet.Cells.AutoFilter();

我不是很精通互操作,但您可能需要传递 5Type.MissingMissing.Value作为参数。

如果 AutoFilter 打开,第一个调用将关闭它,如果它关闭,第二个调用将打开它,反之亦然。但无论哪种情况,由于过滤,将不再有隐藏单元格。

于 2012-11-03T00:23:28.473 回答
3

我使用了以下代码,因为xlSheet.AutoFilterMode = false即使xlSheet.AutoFilterModetrue.

if (xlSheet.AutoFilter != null && xlSheet.AutoFilterMode == true)
{
    xlSheet.AutoFilter.ShowAllData();
}

正如Sid Holland所提到的,这会清除所有过滤器,同时还保留过滤器箭头。

于 2018-06-22T11:07:23.233 回答
0

如果您想关闭工作表上的所有过滤器,包括表格,这里有一些代码。似乎没有现成的方法可以清除所有过滤器,包括表格,更糟糕的是,当您尝试清除过滤器并且工作表上有表格时,我们注意到有时会引发异常。所以我们要做的是尝试两种方式——对于表格和常规工作表,并吞下并记录我们发现的任何异常。

注意:我在这里不包括日志依赖项,所以我已经注释掉了。作为记录,我们使用的是 log4net。

using Microsoft.Office.Interop.Excel;

class WorksheetDecoratorImpl
{
    public Worksheet Worksheet { get; private set; }

    public string Name => Worksheet.Name;

    public void TryClearAllFilters()
    {
        try
        {
            if (Worksheet.AutoFilter != null)
            {
                Worksheet.AutoFilterMode = false;
            }
        }
        catch(Exception ex)
        {
            //Log.Error(string.Format("Clear filters encountered an issue. Sheet: {0}", Name));
        }
        try
        {
            ListObjects listObjects = Worksheet.ListObjects;                
            foreach(ListObject listObject in listObjects)
            {
                listObject.AutoFilter.ShowAllData();
            }
        }
        catch (Exception ex)
        {
            //Log.Error(string.Format("Clear table filters encountered an issue. Sheet: {0}", Name));
        }
    }
}

参考

从表中清除过滤器

于 2019-05-08T18:19:37.173 回答