Excel Interop Efficiency在列中获取具有值的行号

目前我正在使用下面的代码段在第三列中获得一个值为int的行。

private int getRowByRDS(int id) { int bestfit = -1; Boolean foundOne = false; for (int i = 2; i < oSheet.Rows.Count; i++) { string val = getValueOfCell(i, 3); if (val == null) continue; int rds = int.Parse(val); if (rds == id) { bestfit = i; foundOne = true; } else if (foundOne) return bestfit; } return bestfit; } 

问题是,这是可悲的显示在大量的行。

有人可以build议一个更好的方法来searchcol 3并返回它所在的最后一行#

对于乔:

 public void inputRowData(string[] data, int rds) { int bestRow = getRowByRDS_a(rds); string[] formatedData = formatOutput(bestRow, data); string val = getValueOfCell(bestRow, 6); if (val != null) { shiftRows(bestRow, data.Length); bestRow++; } else shiftRows(bestRow, data.Length - 1); // transform formated data into string[,] string[][] splitedData = formatedData.Select(s => s.Split('\t')).ToArray(); var colCount = splitedData.Max(r => r.Length); var excelData = new string[splitedData.Length, colCount]; for (int i = 0; i < splitedData.Length; i++) { for (int j = 0; j < splitedData[i].Length; j++) { excelData[i, j] = splitedData[i][j]; } } oSheet.get_Range("A" + bestRow.ToString()).Resize[splitedData.Length, colCount].Value = excelData; MainWindow.mainWindowDispacter.BeginInvoke(new System.Action(() => MainWindow.mainWindow.debugTextBox.AppendText("Done with " + rds + " input!" + Environment.NewLine))); } private void shiftRows(int from, int numberof) { from++; Range r = oXL.get_Range("A" + from.ToString(), "A" + from.ToString()).EntireRow; for (int i = 0; i < numberof; i++) r.Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftDown); } 

以下是我如何做到这一点:

  • 获取对应于您感兴趣的列的范围
  • 获取您感兴趣的工作表的UsedRange
  • 得到一个范围是上述两个范围的交集
  • 获取这个范围的值,它将是您感兴趣的列中的一组值

然后你可以迭代这个数组来find你想要的值,然后使用它的索引来得到行号。

使用上述方法调用Excel的次数是O(1),而不是您的版本中的O(n)。

您也可以使用Excel.Range对象的Find方法。 如果find匹配项,则此方法返回Excel.Range对象或为null。 按照Joe描述的前三个步骤创buildsearch范围。 如果Find方法返回一个有效的Range,那么可以使用它的Row Property。

PS:对不起乔我想upvote你的答案,但我不能这样做呢。