У меня есть следующий пример кода:
// number offsets for the excel worksheet
public static int rowOffset = 2;
public static int colOffset = 2;
// I receive a huge 2d array
object[,] res = anArrayWithHugeDimensions;
// I get its dimensions
int resNbCol = res.GetLength(1);
int resNbRows = res.GetLength(0);
// I output it in excel using ranges, for optimal performance
/*Microsoft.Office.Interop.Excel.*/Range topLeft = (Range) worksheet.Cells[rowOffset, colOffset];
Range bottomRight = (Range)worksheet.Cells[rowOffset + resNbRows - 1, colOffset + resNbCol - 1];
Range rng = worksheet.get_Range(topLeft, bottomRight);
rng.Value = res;
// I insert a column
Range oRng = worksheet.Range["C1"];
oRng.EntireColumn.Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftToRight,
Microsoft.Office.Interop.Excel.XlInsertFormatOrigin.xlFormatFromRightOrBelow);
worksheet.Cells[rowOffset, 1 + colOffset] = "RichKey";
// I write formulas in the columns
for (int i = 1; i < resNbRows; ++i)
{
worksheet.Cells[i + rowOffset, 1 + colOffset] = $"{(worksheet.Cells[i + rowOffset, 4 as Range).Value2]}_" +
$"{(worksheet.Cells[i + rowOffset, 7 as Range).Value2]}_" +
$"{(worksheet.Cells[i + rowOffset, 8 as Range).Value2]}_" +
$"{(worksheet.Cells[i + rowOffset, 10 as Range).Value2]}_" +
$"{10000 * (double) (worksheet.Cells[i + rowOffset, 11] as Range).Value2}";
}
В основном я получаю огромное object[,] res
, я выводю его на лист, используя диапазоны, чтобы получить время, затем я вставляю столбец, и в этом столбцев данной строке формула будет зависеть от клеток в той же строке, но в других столбцах.(См. Цикл for
.)
Проблема в том, что этот цикл for
действительно медленный и полностью убивает факт использования диапазона для печати огромного массива в Excel.
Есть ли лучший способ сделать это?