[DllImport("kernel32", EntryPoint = "CopyMemory", SetLastError = false)]
public static extern void CopyMemory(IntPtr destination, IntPtr source, uint length);
............................
// Циклическая поочерёдная запись столбцов с данными из
// двухмерного массива «DataArray[,]» в Excel файл.
var columnsGroups = columns.ToChunks(100);//список колонок
Parallel.ForEach(columnsGroups, new ParallelOptions { MaxDegreeOfParallelism = 10 },
(group) =>
{
// Циклическая поочерёдная запись столбцов с данными из
// двухмерного массива «DataArray[,]» в Excel файл.
for(var column = 1; column <= group; column++)
{
// Выделяем область (столбец) в Excel документе, куда будет
// записываться один из столбцов с данными, полученный из
// двухмерного массива.
var startCell = (Range)xlWorkSheet.Cells[1, column];
var endCell = (Range)xlWorkSheet.Cells[rows, column];
var writeRange = xlWorkSheet.Range[startCell, endCell];
double number;
// Циклическое (поочерёдное) присваивание данных из
// одного из столбцов двухмерного массива «DataArray[,]»
// в двухмерный массив «oneColumnArray[,]», для дальнейшей
// записи в Excel.
for(var i = 0; i < rows; i++)
// Если получается преобразовать строку к числу типа double,
if(double.TryParse(dataArr[i, column - 1] + "", out number))
// то присваеваем в массив oneColumnArray число.
oneColumnArray[i, 0] = number;
else
// иначе строку DataArray[i, column - 1] оставляем строкой
// и просто присваиваем её ввиде строки в массив oneColumnArray.
oneColumnArray[i, 0] = dataArr[i, column - 1];
// Запись столбца с данными в Excel.
writeRange.Value2 = oneColumnArray;
}
});
// Excel-документ станет видимым,
// после окончания загрузки данных в Excel.
xlApp.Visible = true;