Select-XLRange.ps1

function Select-XLRange {
[OutputType([XLRange])]
[CmdletBinding()]
param(
    [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline=$true, ParameterSetName = "Range")]
    [XLRange]$Range,

    [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline=$true, ParameterSetName = "SheetAndRC")]
    [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline=$true, ParameterSetName = "SheetAndName")]
    [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline=$true, ParameterSetName = "SheetAndAddress")]    
    [XLSheet]$Sheet,
    
    [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline=$true, ParameterSetName = "FileAndName")]
    [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline=$true, ParameterSetName = "FileAndAddress")]
    [XLFile]$File,

    [Parameter(Mandatory = $true, Position = 1, ParameterSetName = "SheetAndRC")]
    [Alias("Row")]
    [int]$FromRow,

    [Parameter(ParameterSetName = "SheetAndRC")]
    [int]$ToRow = $FromRow,

    [Parameter(Mandatory = $true, Position = 2, ParameterSetName = "SheetAndRC")]
    [Alias("Column")]
    [int]$FromColumn,

    [Parameter(ParameterSetName = "SheetAndRC")]
    [int]$ToColumn = $FromColumn,
    
    [Parameter(ParameterSetName = "SheetAndName")]
    [XLScope]$Scope = [XLScope]::Any,

    [Parameter(Mandatory = $true, ParameterSetName = "FileAndName")]
    [Parameter(Mandatory = $true, ParameterSetName = "SheetAndName")]
    [string]$Name,
    
    [Parameter(Mandatory = $true, ParameterSetName = "FileAndAddress")]
    [Parameter(Mandatory = $true, ParameterSetName = "SheetAndAddress")]
    [string]$Address,
    
    [string[]]$Headers = $null,
    
    [Switch]$HasHeaders = $false
)  
begin{
}
process {
    [void]$PSBoundParameters.Remove('Headers')
    [void]$PSBoundParameters.Remove('HasHeaders')    
    $res = Resolve-XLRange @PSBoundParameters

    [OfficeOpenXml.ExcelRange]$excelRange = $res.Range.Range    
    
    if ($Headers -ne $null -and $Headers.Length -ne $excelRange.Columns) {
        throw "Header contains $($Header.Length) elements but the selection is for $($excelRange.Columns) columns"
    }

    $xlRange = [XLRange]::new($Sheet.Owner, $excelRange)
    # TODO move these to ctor so they're not publically writeable
    $xlRange.Headers = $Headers
    $xlRange.HasHeaders = $HasHeaders.IsPresent
    $PSCmdlet.WriteObject($xlRange, $false)
    
}
end{}
}