C# Excel Outpmemory Exception, вызванный вставкой в диапазонC#

Место общения программистов C#
Ответить
Anonymous
 C# Excel Outpmemory Exception, вызванный вставкой в диапазон

Сообщение Anonymous »

Я работал над довольно сложным проектом C# VSTO, который делает много разных вещей в Excel. Тем не менее, я недавно наткнулся на проблему, которую я понятия не имею, как решить. Я боюсь, что поставка всего проекта здесь будет преувеличивать мой вопрос и запутать всех, так что это часть с проблемой: < /p>

//this is a simplified version of Range declaration which I am 100% confident in
Range range = worksheet.Range[firstCell, lastCell]

range.Formula = array;
//where array is a object[,] which basically contains only strings and also works perfeclty fine
< /code>

Последняя строка, которая должна вставлять [,] массив в диапазон Excel, используемый для работы в более мелких книгах Excel, но теперь сбои для больших книг с системой. UtofmemoryException: недостаточная память, чтобы продолжить выполнение программы < /code>, и я не знаю, почему она используется с набором. Для массива с менее 400 элементами. Кроме того, использование RAM составляет около 1,2 ГБ в момент сбоя, и я знаю, что этот проект способен работать совершенно нормально с использованием RAM ~ 3GBS. < /P>

Я попробовал следующие вещи: вставка этого ряда по ряду, а затем вставка его сотовой связи, вызывая Gc.collect (). Перед тем, как каждая вставка, но не в атмосфере, но не будет абонент. System.outofmemoryException . < /p>

Поэтому я был бы признателен за любую помощь в решении этой проблемы или в определении того, где ошибка может скрываться, потому что я не могу обернуть голову вокруг того, почему она отказывается работать на массивах с меньшей длиной (но, возможно, с немного большим содержанием) на уровне использования оперативной памяти 1,2 ГБ, что похоже на 1/3 из того, что он используется для управления. Спасибо!List controlsList = new List();
// this list is filled with a quite long method calling a lot of other functions
// if other parts look fine, I guess I'll have to investigate it

int totalRows = 1;

foreach (var control in controlsList)
{
if (control.Length == 0)
continue;

var range = worksheet.GetRange(totalRows + 1, 1, totalRows += control.Length, 11);
//control is an object[n][11] so normally there are no index issues with inserting
range.Formula = control.To2dArray();
}

//GetRange and To2dArray are extension methods
public static Range GetRange(this Worksheet sheet, int firstRow, int firstColumn, int lastRow, int lastColumn)
{
var firstCell = sheet.GetRange(firstRow, firstColumn);
var lastCell = sheet.GetRange(lastRow, lastColumn);

return (Range)sheet.Range[firstCell, lastCell];
}

public static Range GetRange(this Worksheet sheet, int row, int col) => (Range)sheet.CheckIsPositive(row, col).Cells[row, col];

public static T CheckIsPositive(this T returnedValue, params int[] vals)
{
if (vals.Any(x => x

Подробнее здесь: https://stackoverflow.com/questions/604 ... to-a-range
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»