Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Excel范围。发现速度越来越慢_C#_Excel_Interop - Fatal编程技术网

C# Excel范围。发现速度越来越慢

C# Excel范围。发现速度越来越慢,c#,excel,interop,C#,Excel,Interop,我有一个列如下的文件: K K K SND P P SND K 例如,列的长度为20000。我使用以下C#代码沿着此列移动: while (true) { // Find SND dest_cells = ex_cells.Find("SND", dest_cells, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, Excel.XlSearchOrde

我有一个列如下的文件:

  • K
  • K
  • K
  • SND
  • P
  • P
  • SND
  • K

例如,列的长度为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*/
        }
while(true)
{
//查找SND
dest_cells=ex_cells.Find(“SND”),dest_cells,Excel.XlFindLookIn.xlValues,Excel.XlLookAt.xlother,Excel.XlSearchOrder.xlByColumns,
Excel.XlSearchDirection.xlNext,false,false,false);
//结束?
if(dest_cells.Row
每次搜索的持续时间都在增加。我没有测量时间。但这只是为了解释:第一次发现需要0.1秒,第二次需要0.2秒,第十次需要1秒,第二十次需要2秒,依此类推


为什么??我无法理解

最快的方法取决于您想要执行的操作:但最好的方法可能是将数据列分配给对象数组并进行处理(对Excel对象模型的每次互操作调用都会有很高的开销)。有关各种方法的比较,请参见

当您循环时,您将使用
dest_单元格
作为查找下一个匹配的起点。但是这个变量在查找
K
和查找
SND
之间共享,并且这些变量的分布越分离(在找到匹配项后),代码就越需要在增加的区域中循环。使用不同的变量,例如
matchK
matchSnd

,因为您每次都在范围内搜索得越来越远?是的。。。。但是我是否做错了什么呢?这完全取决于你想要实现什么,如果代码可以工作,并且你对性能没有限制,那么它可能是次优的,但是是正确的。性能是非常重要的。这个函数可以工作很多年。您能告诉我最佳解决方案吗?我的任务是从另一列的单元格中获取信息。此单元格的行是“K”的每个子组中第一个“K”的行。非常感谢您的回答和文章。我认为这是我最好的方式。但我还是不明白为什么第一次搜索持续几毫秒,第一百次搜索持续几秒钟。我尝试手动执行相同的操作并录制宏。在这种情况下我没有遇到这个问题,宏的代码几乎和你说的一样?matchK=ex_cells.Find(“SND”,matchSnd,Excel.XlFindLookIn.xlValues,Excel.XlLookAt.xlWhole,Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlNext,false,false);matchSnd=ex_cells.Find(“SND”,matchK,Excel.XlFindLookIn.xlValues,Excel.XlLookAt.xlWhole,Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlNext,false,false);尝试
matchK=ex_cells.Find(“SND”,matchK…matchSnd=ex_cells.Find(“SND”,matchSnd…
)。阅读,尤其是
之后的参数,但在代码中,您只查找“SND”。如果您的意思是“matchK=ex_cells.Find”(“K”,matchK…matchSnd=ex_cells.Find),“Find”(“SND”,matchSnd…),我会找到子组中的每个“K”(不仅仅是第一次)