2017-01-05 4 views
1

Моя задача - скрыть/показать строки книги excel на основе того, существует ли строка в определенной строке или нет. Проблема, с которой я сталкиваюсь, заключается в том, что мне требуется около 20 секунд для выполнения этой задачи на 1000 строк со следующим кодом. Файл может иметь целых 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 = ложь в начале и установить его истинное значение в конце. Также вы можете бросить Globals.ThisAddin.Application.EnableEvents = false при запуске и true в конце.

+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 секунды.