Я работал над довольно сложным проектом 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