隐藏/取消隐藏VSTO应用程序中的Excel行C#

我的任务是根据string是否存在于特定行中来隐藏/取消隐藏excel工作簿的行。 我面对的问题是,使用下面的代码,我花了20秒左右的时间在1000行上执行这个任务。 该文件可能有多达2k-3k行,我想减less这个加载时间。

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

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); } 

在开始处使用Globals.ThisAddin.Application.ScreeenUpdating = false,并在末尾将其设置为true。 你也可以在开始时抛出Globals.ThisAddin.Application.EnableEvents = false,结束时抛出true。

我发现,在同一个事物中,对任何行(或范围或单元格)做任何事情似乎总是花费更长的时间,而不是在整个范围内一举一动。 例如,我曾经写过一些删除所有完全空白的行的东西,当我把它作为一个语句( Range.Delete )而不是一个循环执行时,它会眨眼间运行,这需要相当长的一段时间。

本着这种精神,如果你重新访问你的代码,并收集包含有问题的string的所有行,然后将它们全部隐藏起来:

 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; 

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

我testing了一些伪造的数据,并且为了隐藏数百行数以千计的行,“隐藏”代码行只花了156毫秒或0.15秒。