myWorksheet.Range.Resize.Value = ошибка массива при больших числах строк - PullRequest
0 голосов
/ 04 февраля 2011

Я унаследовал большой проект, который использует Office.Interop.Excel для вставки данных в электронную таблицу.

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

К сожалению, после вставки относительно большого объема данных передача информации в Excel блокируется, и программа не может продолжаться.

Во всяком случае, я провел некоторое исследование и обнаружил следующую строку:

myWorksheet.Range("A" & rowNumber).Resize(dataArray.GetUpperBound(0) + 1, columnCount).Value = dataArray

Это копирует все данные в dataArray непосредственно в группу ячеек на рабочем листе.

Я догадался, чтопроблема может быть вызвана попыткой передать такой большой объем данных за один раз, поэтому я изменил его для копирования данных по строкам:

For horizIndex As Integer = 0 To dataArray.GetUpperBound(0)
    Dim subArr(0, arr.GetUpperBound(1)) As Object
    For columnIndex As Integer = 0 To dataArray.GetUpperBound(1)
        subArr(0, columnIndex) = dataArray(horizIndex, columnIndex)
    Next
    myWorksheet.Range("A" & (rowNumber + horizIndex)).Resize(horizIndex + 1, columnCount).Value = arr
Next

Это скопирует около 350 строк в Excel изатем настройка строки Value просто перестает возвращаться.

Может кто-нибудь предложить способ обойти это?

РЕДАКТИРОВАТЬ: Хорошо, я попробовал кучу того, что предложил Лазарь ниже, и вот где я нахожусьпрямо сейчас:

Пока данные относительно короткие или типы данных довольно простые (целые числа и т. д.), все варианты кода работают нормально.Исходное массовое копирование работает нормально, копирование за строкой и копирование за ячейкой работает, если набор данных либо маленький, либо простой.

Мой фактический набор данных, тем не менее, относительно сложени содержит несколько типов данных, включая Strings.

Он падает после 350-ти строк.Он падает на стороне кода Excel, поток уходит в Excel и никогда не возвращается.

Итак, есть еще идеи, кто-нибудь?

1 Ответ

1 голос
/ 04 февраля 2011

Я думаю, что проблема здесь в том, что вы постоянно расширяете диапазон ячеек.

Я бы переработал строку:

myWorksheet.Range("A" & (rowNumber + horizIndex)).Resize(horizIndex + 1, columnCount).Value = arr

, чтобы прочитать

myWorksheet.Range("A" & (rowNumber + horizIndex)).Resize(1, columnCount).Value = subArr

РЕДАКТИРОВАТЬ

Учитывая, что вы эффективно перебираете каждую ячейку, почему бы не воспользоваться этим:

For horizIndex As Integer = 0 To dataArray.GetUpperBound(0)
    For columnIndex As Integer = 0 To dataArray.GetUpperBound(1)
        myWorksheet.Cells(horizIndex + 1, columnIndex + 1).Value = dataArray(horizIndex, columnIndex)
    Next
Next
...