我正在尝试导入Excel工作表,它工作正常。但是,不保留列的顺序。例如,写在第一列中的文本将作为第二个属性而不是第一个属性输出。
示例输入文件:
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
作为输入。谢谢您的帮助。
最佳答案
找到了我的答案here。
似乎有一个有序哈希表:
$rowObject = [Ordered]@{}
关于powershell - PowerShell维护PSObject中DataTable的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28966347/