Вы обновляете отдельные ячейки. Это будет очень медленно. Если вы подумаете об этом, каждый раз, когда вы обновляете ячейку, вызов RPC будет перенаправляться в процесс Excel.
Это будет намного быстрее, если вы назначите двумерный массив значений для диапазона Excel с одинаковыми измерениями в одном операторе (один межпроцессный вызов) вместо текущих 1200 x 800 = 960 000 межпроцессных вызовов.
Что-то вроде:
// Get dimensions of the 2-d array
int rowCount = indexMatrix.GetLength(0);
int columnCount = indexMatrix.GetLength(1);
// Get an Excel Range of the same dimensions
Excel.Range range = (Excel.Range) xlWorkSheet.Cells[1,1];
range = range.get_Resize(rowCount, columnCount);
// Assign the 2-d array to the Excel Range
range.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, indexMatrix);
На самом деле, чтобы быть педантичным, в приведенном выше коде есть три перекрестных вызова (.Cells, .get_Resize и .set_Value), и в вашем коде есть два вызова на итерацию (.Cells get и неявный .set_Value ) на общую сумму 1200 x 800 x 2 = 1 920 000.
Примечание
range.get_Resize
и range.set_Value
были необходимы для старой версии библиотеки взаимодействия Excel, которую я использовал, когда этот пост был впервые написан. В эти дни вы можете использовать range.Resize
и range.Value
, как отмечено в комментарии @ The1nk.