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
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”(不仅仅是第一次)