DBremen
5/31/2016 - 9:09 PM

Convert copied range from excel to an array of PSObjects

Convert copied range from excel to an array of PSObjects

function ConvertFrom-ExcelClipboard {
     <#
        .SYNOPSIS
            Convert copied range from excel to an array of PSObjects
        .DESCRIPTION
            A range of cells copied into the clipboard is converted into PSObject taking the first row (or provided property names via Header parameter) as the properties.
        .EXAMPLE
            #Considering a range of cells including header has been copied to the clipboard
            ConvertFrom-ExcelClipboard
        .EXAMPLE
            #Convert excel range without headers providing property names through argument to the Headers parameter
            ConvertFrom-ExcelClipboard -Header test1,test2,test3
    #>
    [CmdletBinding()]
    [Alias('pasteObject')]
    param(
        #Specifies an alternate column header row. The column header determines the names of the properties of the object(s) created.
        [string[]]$Header,
        #If specified, the content of the clipboard is returned as is.
        [switch]$Raw
    )

    Add-Type -AssemblyName System.Windows.Forms
    $tb = New-Object System.Windows.Forms.TextBox
    $tb.Multiline = $true
    $tb.Paste()
    if ($Raw){
        $tb.Text
    }
    else{
        $ht = $PSBoundParameters
        #compare Header Count to Column count of first row
        if ($Header -and $ht.Header.Count -ne  $tb.Text.Split(@("`r`n"),'None')[0].Split("`t").Count){
            Write-Warning 'Header values do not equal the number of columns copied to the clipboard'
        }
        $tb.Text | ConvertFrom-Csv -Delimiter "`t" @PSBoundParameters
    }
}
pasteObject