PowerShell维护PSObject中DataTable的顺序

时间:2015-03-10 14:27:51

标签: powershell datatable hashtable import-from-excel

我正在尝试导入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作为输入。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

找到我的答案here

似乎可以使用 Ordered 哈希表:

$rowObject = [Ordered]@{}