【问题标题】:Turn Off Filters关闭过滤器
【发布时间】:2019-05-09 02:25:21
【问题描述】:

所以,我在 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 对象返回并且不能做任何事情,但过滤器关闭时,我得到了我需要的东西。

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

【问题讨论】:

    标签: c# excel


    【解决方案1】:

    我会先测试一下是否应用了过滤器,如果有,则将其停用:

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

    这应该会删除所有已应用的过滤并删除过滤箭头按钮。

    【讨论】:

    • 有什么方法可以避免删除过滤箭头按钮?
    • @Mizmor 是的,一旦您确认AutoFilter 不是null,您就可以显示带有xlSheet.AutoFilter.ShowAllData() 的所有行。这会使过滤箭头保持可见,但会删除任何实际过滤。
    • @Mizmor 没问题。很高兴它有帮助。
    • 这似乎并没有真正删除过滤,还需要应用 AutoFilter.ShowAllData()。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • OMG 感谢您确认 AutoFilter() 方法是一个切换!当我试图将我的自动过滤器从一个范围移动到另一个范围时,我实际上以一种迂回的方式得出了这个结论。当我移动过滤器时,它消失了,但再次移动它后,它又出现了。所以我猜每次调用它都会关闭或打开过滤。
    【解决方案3】:

    我使用了以下代码,因为即使 xlSheet.AutoFilterModetruexlSheet.AutoFilterMode = false 也会为我抛出 COMException。

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

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

    【讨论】:

      【解决方案4】:

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

      注意:我在这里不包括日志依赖项,因此我已将其注释掉。作为记录,我们使用的是 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

      【讨论】:

        猜你喜欢
        • 2011-08-07
        • 2015-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        相关资源
        最近更新 更多