关闭过滤器

时间:2012-11-02 22:47:03

标签: c# excel

所以,我正在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); 

当过滤器打开时,我得到一个返回的null对象,除了关闭过滤器之外无法做任何事情,我得到了我需要的东西。

关闭过滤器的任何提示?

4 个答案:

答案 0 :(得分:11)

我会首先测试是否已经应用了过滤器,然后在有以下情况时将其停用:

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

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

答案 1 :(得分:3)

您可以通过在没有参数的情况下在范围内调用AutoFilter方法来禁用所有过滤器。

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

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

第一个调用会在AutoFilter打开时关闭,第二个调用会在关闭时将其打开,反之亦然。但在任何一种情况下,由于过滤,都不再有隐藏的单元格。

答案 2 :(得分:2)

我使用以下代码是因为xlSheet.AutoFilterMode = falsexlSheet.AutoFilterMode时,true对我来说是COMException。

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

Sid Holland所述,这将清除所有过滤器,同时还保留过滤器箭头。

答案 3 :(得分: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));
        }
    }
}

参考

Clear filter from Table