2017-01-05 184 views
1

我的任务是隐藏在一个特定行中是否存在串的基础上的Excel工作簿中/取消隐藏行。我面临的问题是,使用以下代码在1000行上执行此任务需要大约20秒。该文件可能有多达2k-3k行,我想减少这个加载时间。隐藏/取消隐藏列在Excel在VSTO应用程序C#

需要注意的是,当我在代码中注释“隐藏/取消隐藏”整行(currentFind.EntireRow.Hidden =!isShown;)时,那么excel文件只需要4-5秒即可加载。这使我得出这样的结论:它是一个耗时的行隐藏部分,而不是搜索字符串部分。在开始

 Worksheet activeWorksheet= Globals.ThisAddIn.Application.ActiveSheet; 
     Range usedRange = activeWorksheet.UsedRange; 

     Range currentFind = null; 
     Range firstFind = null; 

     currentFind = activeWorksheet.UsedRange.Find(searchInput); 

     while (currentFind != null) 
     { 
      // Keep track of the first range you find. 
      if (firstFind == null) 
      { 
       firstFind = currentFind; 
      } 

      // If you didn't move to a new range, you are done. 
      else if (currentFind.get_Address(XlReferenceStyle.xlA1) 
        == firstFind.get_Address(XlReferenceStyle.xlA1)) 
      { 
       break; 
      } 

      currentFind.EntireRow.Hidden = !isShown; 

      currentFind = usedRange.FindNext(currentFind); 
     } 

回答

0

使用Globals.ThisAddin.Application.ScreeenUpdating =假,并在最后设置为true。 你也可能会引发Globals.ThisAddin.Application.EnableEvents =在启动 假和真底。

+0

没有为您的解决方案的工作?如果是这样,请将其标记为答案 – dgorti

0

我发现做任何事情在当它是一回事时间行(或范围内或细胞)似乎总是比做得在整个范围内一举更长。例如,我曾经写过的东西,删除的是完全空白的所有行,并在眨眼间跑的时候,我做到了为一个语句(Range.Delete)与上一个循环,这花了相当长一段时间。

本着这一精神,如果你重新审视你的代码并聚集包含有问题的字符串中的所有行,然后把它们藏一下子:

Excel.Range hideRange = null; 
Excel.Application xl = Globals.ThisAddIn.Application; 

foreach (Excel.Range row in activeWorksheet.UsedRange.Rows) 
{ 
    if (oApp.WorksheetFunction.CountIf(row, "*" + searchInput + "*") > 0) 
     hideRange = hideRange == null ? row : xl.Union(hideRange, row); 
} 

hideRange.EntireRow.Hidden = true; 

我不能保证这些代码是快,但试试吧,让我们知道它是如何比较的。我非常有信心,最后一行会跑得快。还有待观察的是识别事件的循环是如何运行的。

我测试了一些假的数据,并为数千行的数百行被隐藏,代码的“隐藏”线只用了156毫秒,或0.15秒。