Я унаследовал большой проект, который использует 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, а затем значение параметра строки просто перестанет возвращаться.
Может ли кто-нибудь предложить способ обойти это?
РЕДАКТИРОВАТЬ: Хорошо, я попробовал кучу того, что Лазарус предложил ниже, и вот где я сейчас:
Пока данные относительно короткие или типы данных достаточно простые (целые числа и т. д.), все варианты кода работают нормально. Исходное массовое копирование работает нормально, копирование построчно и копирование по ячейкам работает, если набор данных либо небольшой, либо простой.
Однако мой фактический набор данных относительно сложен и содержит несколько типов данных, включая строки.
Он падает после 350-ти рядов. Он падает на стороне кода Excel, поток уходит в Excel и никогда не возвращается.
Итак, есть еще идеи, кто-нибудь?