我正在尝试导入Excel工作表,但工作正常。但是,不保留列的顺序。例如,第一列中写入的文本将作为第二个Property输出,而不是第一个。
示例输入文件:
ServerName | First name | Last name
C:\Drive | Bob | Johnson
上面的示例将以下输出显示为PSObject
,这是不正确的,因为它与上述文件的顺序不同。它应首先使用ServerName,而不是:
First name : Bob
ServerName : C:\Drive
Last name : Johnson
代码:
Function Import-Excel {
[CmdletBinding()]
Param (
[String]$FileName,
[String]$WorksheetName
)
Process {
$OleDbConnection = New-Object 'System.Data.OleDb.OleDbConnection'
$OleDbCommand = New-Object 'System.Data.OleDb.OleDbCommand'
$OleDbAdapter = New-Object 'System.Data.OleDb.OleDbDataAdapter'
$DataTable = New-Object 'System.Data.DataTable'
$ConnString = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source='
$ConnString += $FileName
$ConnString += ';Extended Properties="Excel 12.0;HDR=YES;IMEX=1";'
$OleDbConnection.ConnectionString = $ConnString
$OleDbConnection.Open()
$OleDbCommand.Connection = $OleDbConnection
$OleDbCommand.CommandText = "SELECT * FROM [$WorksheetName$]"
$OleDbAdapter.SelectCommand = $OleDbCommand
$OleDbAdapter.Fill($DataTable) | Out-Null
$OleDbConnection.Close()
$columnArray = @()
foreach ($Col in $DataTable.Columns.ColumnName) {
$ColumnArray += $Col.toString()
}
$returnObject = @()
foreach ($Ro in $DataTable.Rows) {
$i=0;
$rowObject = @{}
foreach ($colu in $Ro.ItemArray) {
$rowObject += @{$columnArray[$i]=$colu.toString()}
$i++
}
$returnObject += New-Object PSObject -Property $rowObject
}
return $returnObject
}
}
到目前为止,我已尝试使用ArrayList
代替。这可以很好地保持输入的顺序正确,但New-Object PSObject
不接受ArrayList
作为输入。
感谢您的帮助。