2015-05-28 1 views
0

В настоящее время я использую следующий сегмент кода, чтобы получить строку со значением int в третьем столбце.Excel Interop Efficiency получает номер строки со значением в столбце

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

Проблемы заключаются в том, что это патетически проявляется при большом количестве строк.

Может кто-то предложить лучший способ поиска седловины 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); 
    } 

ответ

1

Вот как я это сделать:

  • Получить диапазон, соответствующий колонке вы заинтересованы в
  • Получить UsedRange листа вы заинтересованы в
  • Получить диапазон, который является пересечением двух вышеуказанных диапазонов
  • Получить значение этого диапазона, который будет массивом значений из столбца вы заинтересованы в

Вы можете итерацию через этот массив, чтобы найти нужное значение, затем используйте его индекс для получения номера строки.

Число вызовов в Excel равно O (1) с помощью вышеуказанного метода, в отличие от O (n) в вашей версии.

+0

Итак, я получил это далеко ... Диапазон colRange = oSheet.Columns [3] as Range; это 1. Следующий диапазон используется = oSheet.UsedRange ;. Теперь я понятия не имею, что делать lol –

+0

@YaWang - ты на правильном пути. Следующим шагом будет вызов метода Application.Intersect для пересечения двух диапазонов. Удачи. – Joe

+0

Получил еще одну проблему с эффективностью. Вам нужно высказать мнение о том, как лучше сместить ячейки вниз. Я поставлю свой текущий код в редакции выше –

0

Вы также можете использовать метод поиска объекта Excel.Range. Этот метод возвращает объект Excel.Range, если совпадение найдено или равно нулю. Следуйте первым трем шагам, которые Джо описал для создания диапазона поиска. Если метод Find возвращает допустимый диапазон, вы можете использовать его свойство Row.

P.S .: Извините, Джо, я хотел поддержать ваш ответ, но пока мне не разрешено это делать.

Смежные вопросы