Excel Range.Find变得越来越慢

时间:2012-12-21 09:05:39

标签: c# excel interop

我有一个像这样的列的文件:

  • ķ
  • ķ
  • ķ
  • SND
  • P
  • P
  • SND
  • ķ

...

列的长度例如是20000.我使用以下C#代码来移动此列:

        while (true)
        {
            // Find SND
            dest_cells = ex_cells.Find("SND", dest_cells, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByColumns,
                                   Excel.XlSearchDirection.xlNext, false, false, false);

            // END?
            if (dest_cells.Row < row)
                return false;

            row = dest_cells.Row;


            // Find K
            dest_cells = ex_cells.Find("K", dest_cells, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByColumns,
                                   Excel.XlSearchDirection.xlNext, false, false, false);

            // END?
            if (dest_cells.Row < row)
                return false;

            row = dest_cells.Row;

            // Some operations
            /*there were some operations, but I commented them. So they don't influence on performance*/
        }

每次连续搜索的持续时间都在增加。我没有测量时间。但只是为了解释让它成为:首先发现需要0.1秒,第二个0.2秒,第十个1秒,二十个二十秒等等。

为什么呢?我无法理解

2 个答案:

答案 0 :(得分:2)

最快的方法取决于你想要做什么操作:但最好的方法是将数据列分配给一个对象数组并进行处理(每个互操作调用的开销都很高) Excel对象模型)。有关各种方法的比较,请参阅http://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance-shootout/

答案 1 :(得分:0)

当您进行循环时,您使用dest_cells作为查找下一个匹配项的起点。但是这个变量在找到K和找到SND之间共享,并且这些变量的分布越多(在找到匹配之后),那么代码越需要在增加的区域中循环。使用不同的变量,例如matchKmatchSnd