Автоматизация с помощью Microsoft Excel

Существует несколько способов автоматизации работы с Excel в PowerShell:

  • CDO (без внешних библиотек) — это стандартный способ, не требующий дополнительных модулей. Является самым быстрым, однако часто заблокирован политиками безопасности в организациях.
  • ImportExcel — внешний модуль, который работает медленнее, но предоставляет мощные возможности:
    • оформление таблиц в Excel;
    • использование стилей, форматирования;
    • упрощённый экспорт данных;
    • работа без установленного Microsoft Excel.

Выбор подхода зависит от целей: скорость и встроенные средства (CDO) или удобство и визуальное оформление (ImportExcel).

Пример экспорта данных в файл Microsoft Excel с помощью CDO

# Данные для экспорта
$data = @(
    [PSCustomObject]@{Имя='Анна'; Возраст=30; Город='Алматы'},
    [PSCustomObject]@{Имя='Бек'; Возраст=25; Город='Астана'},
    [PSCustomObject]@{Имя='Ирина'; Возраст=40; Город='Шымкент'}
)
 
# Путь к выходному файлу
$excelPath = "C:\Temp\export.xlsx"
 
# Создаём COM-объект Excel
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
 
# Добавляем рабочую книгу и лист
$workbook = $excel.Workbooks.Add()
$sheet = $workbook.Worksheets.Item(1)
$sheet.Name = "Данные"
 
# === Запись заголовков ===
$headers = $data[0].PSObject.Properties.Name
for ($col = 0; $col -lt $headers.Count; $col++) {
    $sheet.Cells.Item(1, $col + 1).Value2 = $headers[$col]
}
 
# === Запись данных ===
for ($row = 0; $row -lt $data.Count; $row++) {
    for ($col = 0; $col -lt $headers.Count; $col++) {
        $value = $data[$row].PSObject.Properties[$headers[$col]].Value
        $sheet.Cells.Item($row + 2, $col + 1).Value2 = $value
    }
}
 
# Автоширина
$usedRange = $sheet.UsedRange
$usedRange.EntireColumn.AutoFit()
 
# Сохраняем и закрываем
$workbook.SaveAs($excelPath)
$workbook.Close($false)
$excel.Quit()
 
# Освобождаем COM-объекты
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
[GC]::Collect()
[GC]::WaitForPendingFinalizers()
 
Write-Host "Excel-файл успешно сохранён: $excelPath"