Я столкнулся с некоторыми проблемами (DCOM) при использовании объекта Excel.Application
. Поэтому я переписал свою функцию для чтения файлов Excel с помощью объектов OleDbConnection
и OleDbCommand
, доступных в пределах AccessDatabaseEngine_x64. Поэтому нет необходимости устанавливать MS Office на сервере, и я думаю, что это также более надежно.PowerShell DataTable удаляет пустые строки
Это работает отлично, но единственное, чего не хватает, это то, что я не могу понять, как удалить пустые строки с выхода функции. Я знаю, что это можно сделать, используя $DataTable[0].Delete()
, но я не знаю, как определить, является ли полная строка пустой. Поскольку он может варьироваться в зависимости от ввода.
пример XLSX-файла:
Name | Sir name
Bob Lee | Swagger
|
Jake | Thornton
В приведенном выше примере, я хотел бы иметь выход только 2 (или 3 линии в зависимости от переключателя $Header
), но я не хочу видеть пустая строка на выходе.
Я нашел solution на другом языке, но я не могу перевести его в PowerShell.
Код:
Function Import-Excel {
[CmdletBinding()]
Param (
[parameter(Mandatory=$true,Position=0)]
[ValidateScript({Test-Path $_ -PathType Leaf})]
[String]$FileName,
[parameter(Mandatory=$true,Position=1)]
[String]$WorksheetName,
[Switch]$Header
)
Begin {
# We can't read open XLSX-Files
Copy-Item -LiteralPath $FileName -Destination $env:TEMP
}
Process {
$OleDbConnection = New-Object 'System.Data.OleDb.OleDbConnection'
$OleDbCommand = New-Object 'System.Data.OleDb.OleDbCommand'
$ConnString = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source='
$ConnString += "$env:TEMP\$(Split-Path $FileName -Leaf)"
if ($header) {
$ConnString += ';Extended Properties="Excel 12.0;HDR=YES;IMEX=1";'
}
else {
$ConnString += ';Extended Properties="Excel 12.0;HDR=NO;IMEX=1";'
}
$OleDbConnection.ConnectionString = $ConnString
$OleDbConnection.Open()
$OleDbCommand.Connection = $OleDbConnection
$OleDbCommand.CommandText = "SELECT * FROM [$WorksheetName$]"
$OleDbAdapter = New-Object "System.Data.OleDb.OleDbDataAdapter"
$OleDbAdapter.SelectCommand = $OleDbCommand
$DataTable = New-Object "System.Data.DataTable"
$OleDbAdapter.Fill($DataTable)
$OleDbConnection.Close()
Write-Output $DataTable
}
End {
Remove-Item "$env:TEMP\$(Split-Path $FileName -Leaf)"
}
}
Спасибо за вашу помощь.