Microsoft.Office.Interop IndexOutOfRangeException

Приведенное ниже IndexOutOfRangeException не позволяет моему коду работать (он компилируется). Хотя я понимаю такое исключение (индексы массива и т. д.), проблема в том, что я пытаюсь просто обновить подраздел 2 строки значением в ячейке B[excelrow]. По какой-то причине существует исключение индекса за пределами границ, которое для меня не имеет смысла. Ни subsection2, ни excelrow не являются частью массива. Единственный массив, о котором я могу думать, - это массив excel, но excelrow - это целое число со значением 3, оно должно быть обновлено до строки B3 и так далее. (Я даже пытался обновить с помощью B3 напрямую, и я получаю ту же ошибку).

Чтобы помочь вам в дальнейшем с контекстом, этот метод, называемый createsource, принимает в качестве входных данных электронную таблицу Excel и общее количество строк в этом листе. Он выполняет приведенный ниже код для вывода двумерного массива, содержащего в первом измерении индекс Excel для каждого нового заказа (каждого отдельного клиента), а во втором измерении — количество товаров, заказанных одним покупателем.

Метод для кода ниже:

частный интервал [,] createsource (Microsoft.Office.Interop.Excel.Worksheet xlWorksheet, int totalRows) {

        String subsection = "";
        object subsection2 = "";
        int orders = 0;

        //figures out how many different pages there are going to be
        for (int n = 3; n < totalRows + 1; n++)
        {
            if (!(xlWorksheet.get_Range("B" + n.ToString()).Text == subsection))
            {
                subsection = xlWorksheet.get_Range("B" + n.ToString()).Text;
                orders++;
            }
        }
        MessageBox.Show(orders.ToString());
        int[,] source = new int[orders, 2];

        int excelrow = 3;
        subsection2 = xlWorksheet.get_Range("B" + excelrow.ToString()).Text;
        int i;

        for (i = 0; i < orders + 1; i++)
        {
            int j = 1;
            if (excelrow == totalRows + 1)
            {
                break;
            }

 //Out of bounds exception is found in the below if statement updating subsection2:

            if (!(xlWorksheet.get_Range("B" + excelrow.ToString()).Text == subsection2))
            {
                source[i, 0] = excelrow;
                //MessageBox.Show(xlWorksheet.get_Range("B" + excelrow.ToString()).Text.ToString());
                subsection2 = xlWorksheet.get_Range("B" + excelrow.ToString()).Text;
                excelrow++;
            }

            for (int iter = 0; iter < 1;)
            {
                if (excelrow == totalRows + 1)
                {
                    break;
                }
                if (xlWorksheet.get_Range("B" + excelrow.ToString()).Text == subsection2)
                {
                    excelrow++;
                    j++;
                }
                if (!(xlWorksheet.get_Range("C" + excelrow.ToString()).Text == subsection2))
                {
                    subsection2 = xlWorksheet.get_Range("C" + excelrow.ToString()).Text;
                    iter = 1;
                }
            }

            source[i, 1] = j;

        }

        MessageBox.Show(source[2, 0].ToString());
        return source;

    }

person John Nnamchi    schedule 03.08.2017    source источник
comment
Получите значение xlWorksheet.get_Range("B" + excelrow.ToString()).Text в новой переменной. Кроме того, закройте свой код в файле try/catch. В catch получите полное описание ошибки: Пример: catch (Exception ex) { string strError = ex.ToString(); } и отредактируйте свой вопрос с описанием ошибки.   -  person Mauricio Arias Olave    schedule 03.08.2017
comment
Какая точная строка вызывает исключение?   -  person mjwills    schedule 03.08.2017


Ответы (1)


Я вижу проблему. Вы объявляете источник как:

int[,] source = new int[orders, 2];

... хорошо, но посмотрите на свой цикл:

for (i = 0; i < orders + 1; i++)

... который позже вводится в:

source[i, 0] = excelrow;

Итак, если заказы = 100, вы объявили длинный массив из 100, начиная с 0-99. Затем в вашем цикле вы переходите от 0 к «менее 100 + 1», иначе 0-100. Когда вы дойдете до последнего цикла, вы используете значение i=100 и пытаетесь поместить его в место массива, которого не существует.

Вам нужно либо уменьшить цикл на единицу, либо увеличить размер массива на 1.

person Kevin    schedule 03.08.2017