Загрузка данных
# ==========================================
# НАСТРОЙКИ
# ==========================================
$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()
}