Загрузка данных


# ==========================================
# НАСТРОЙКИ
# ==========================================

$FilePath = "C:\Temp\Test.xlsx"
$SheetName = "Лист1"

# DataTable для выгрузки
# Например:
# $DataTable = $out_TableAfterFiltr


# ==========================================
# ЗАПУСК EXCEL
# ==========================================

$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $false
$Excel.DisplayAlerts = $false

$Workbook = $null
$Worksheet = $null
$Range = $null

try {

    # Открываем файл
    $Workbook = $Excel.Workbooks.Open($FilePath)

    # Получаем лист
    $Worksheet = $Workbook.Worksheets.Item($SheetName)

    # Очищаем содержимое листа,
    # но сохраняем форматирование
    $Worksheet.Cells.ClearContents()


    # ==========================================
    # РАЗМЕР DATATABLE
    # ==========================================

    $RowCount = $DataTable.Rows.Count
    $ColumnCount = $DataTable.Columns.Count


    if ($RowCount -gt 0 -and $ColumnCount -gt 0) {

        # ==========================================
        # СОЗДАЁМ ДВУМЕРНЫЙ МАССИВ
        # ==========================================

        $Data = New-Object 'object[,]' $RowCount, $ColumnCount


        # ==========================================
        # ЗАПОЛНЯЕМ МАССИВ
        # ==========================================

        for ($i = 0; $i -lt $RowCount; $i++) {

            for ($j = 0; $j -lt $ColumnCount; $j++) {

                $Value = $DataTable.Rows[$i][$j]


                # Пустое значение
                if ($null -eq $Value -or $Value -eq [DBNull]::Value) {

                    $Data[$i, $j] = $null
                    continue
                }


                $Text = $Value.ToString().Trim()


                # Пустая строка
                if ([string]::IsNullOrWhiteSpace($Text)) {

                    $Data[$i, $j] = $null
                    continue
                }


                # ==========================================
                # ЕСЛИ ЗНАЧЕНИЕ УЖЕ ЧИСЛОВОЕ
                # ==========================================

                if ($Value -is [int] -or
                    $Value -is [long] -or
                    $Value -is [decimal] -or
                    $Value -is [double] -or
                    $Value -is [float]) {

                    $Data[$i, $j] = $Value
                    continue
                }


                # ==========================================
                # ЕСЛИ STRING — ПРОБУЕМ ПРЕОБРАЗОВАТЬ В ЧИСЛО
                # ==========================================

                $Number = 0.0

                # Заменяем запятую на точку,
                # чтобы корректно обработать десятичные числа
                $NumberText = $Text.Replace(',', '.')

                if ([double]::TryParse(
                    $NumberText,
                    [System.Globalization.NumberStyles]::Any,
                    [System.Globalization.CultureInfo]::InvariantCulture,
                    [ref]$Number
                )) {

                    # Записываем именно число
                    $Data[$i, $j] = $Number
                }
                else {

                    # Не число — записываем как текст
                    $Data[$i, $j] = $Text
                }
            }
        }


        # ==========================================
        # ДИАПАЗОН
        # ==========================================

        $Range = $Worksheet.Range(
            $Worksheet.Cells.Item(1, 1),
            $Worksheet.Cells.Item($RowCount, $ColumnCount)
        )


        # ==========================================
        # ЗАПИСЫВАЕМ В EXCEL
        # ==========================================

        $Range.Value2 = $Data
    }


    # ==========================================
    # СОХРАНЯЕМ
    # ==========================================

    $Workbook.Save()

}
finally {

    # ==========================================
    # ЗАКРЫВАЕМ
    # ==========================================

    if ($Workbook -ne $null) {
        $Workbook.Close($true)
    }

    if ($Excel -ne $null) {
        $Excel.Quit()
    }


    # ==========================================
    # ОСВОБОЖДАЕМ COM
    # ==========================================

    if ($Range -ne $null) {
        [System.Runtime.InteropServices.Marshal]::ReleaseComObject($Range) | Out-Null
    }

    if ($Worksheet -ne $null) {
        [System.Runtime.InteropServices.Marshal]::ReleaseComObject($Worksheet) | Out-Null
    }

    if ($Workbook -ne $null) {
        [System.Runtime.InteropServices.Marshal]::ReleaseComObject($Workbook) | Out-Null
    }

    if ($Excel -ne $null) {
        [System.Runtime.InteropServices.Marshal]::ReleaseComObject($Excel) | Out-Null
    }

    [GC]::Collect()
    [GC]::WaitForPendingFinalizers()
}