Автоматизация с помощью 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"