【发布时间】:2015-03-10 18:38:44
【问题描述】:
我在使用 Excel.Application 对象时偶然发现了一些 (DCOM) 问题。因此,我使用AccessDatabaseEngine_x64 中的OleDbConnection 和OleDbCommand 对象重写了读取Excel 文件的函数。所以服务器上不用再安装MS Office了,我觉得也比较靠谱。
它工作得很好,但唯一缺少的是我似乎无法弄清楚如何从函数的输出中删除空行。我知道可以通过使用$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)"
}
}
感谢您的帮助。
【问题讨论】:
标签: excel powershell