vb.net Object (,) Индекс массива не найдет (0,0), даже если это массив 11x37 - PullRequest
1 голос
/ 06 сентября 2011

впервые спрашиваю здесь.Заранее благодарю за любую помощь, которую вы можете оказать.

Я пытаюсь прочитать кучу данных из электронной таблицы, порезать их, а затем выбросить в базу данных.Я бы не стал так поступать, но это основная реальность работы с типами бухгалтеров.К счастью, эти электронные таблицы очень последовательны.В любом случае, я использую LINQ для SQL, чтобы обрабатывать объектные ссылки, и я использую Microsoft.Office.Interop, чтобы получить Excel.

Я читаю каталог, полный .xls идля каждого я открываю файл, получаю пару конкретных данных из определенных ячеек, а затем получаю диапазон ячеек для выбора значений.

Private Sub ProcessAFile(ByVal f As FileInfo)
    thisFile = openApp.Workbooks.Open(f.fullName)
    thisMonth = Split(thisChart.Range("D6").Value, "-").Last.Trim
    thisFY = thisChart.Range("L7").Value
    thisWorkArea = thisChart.Range("A14", "L51").Value2
    openApp.Workbooks.Close()
...

thisWorkArea было затемнено как глобальное:

    Dim thisWorkArea As Object(,)

Я получаю строки и целые числа в моем диапазоне между A14 и L51, поэтому здесь имеет смысл сделать его массивом объектов.Я не хочу просматривать каждую строку и выбирать диапазоны в Excel, я просто хочу прочитать ее один раз, а затем закрыть ее.

Итак, я получаю следующее исключение:

Исключение System.IndexOutOfRangeException не обработано. Message = Индекс находится за пределами массива.

в этой функции:

Private Sub fillCurrMonth()
    Dim theseRows As Integer() = {0, 2, 3, 5}

    For Each i In theseRows
        Dim thisMonth As New Month
        'make sure category is in Database

        thisMonth.Dept = thisDeptName
        thisMonth.FY = thisFY
        thisMonth.Category = thisWorkArea(i, 0)
...

«Месяц» выше относится к сущности LINQ.Ничего особенного.

В этой последней строке я улавливаю исключение.В моих часах я обнаружил, что thisWorkArea имеет длину 456 и (0,0) -> "Стационарный" {String}

Так почему я получаю это исключение?Я положил это в ваши экспертные руки.Я все еще довольно плохо знаком с vb.net, так что, возможно, я просто упускаю что-то фундаментальное.

Ответы [ 2 ]

4 голосов
/ 07 сентября 2011

Excel использует индикаторы на основе 1. Это связано с использованием VB как языка программирования в приложении, в котором традиционно использовались индикаторы на основе 1.

Вы обнаружите, что Excel вернул массив, определенный как thisWorkArea(1 To 11, 1 To 37) As Object

0 голосов
/ 14 сентября 2016
        'Fix excel's 1 based index
        Dim oData(UBound(xData) - 1, UBound(xData, 2) - 1) As Object
        For i As Integer = 1 To UBound(xData)
            For ii As Integer = 1 To UBound(xData, 2)
                oData(i - 1, ii - 1) = xData(i, ii)
            Next
        Next
...