Set-XLValue.ps1

# this should probably be implemented as a specialization of Set-XLRange
function Set-XLValue {
[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,

    [Parameter(Mandatory = $true)]
    [object]$Value,

    [ValidateScript({$_ -eq $null -or $_ -is [string] -or $_ -is [XLNumberFormat]})]
    $NumberFormat = $null,

    [Switch]$PassThru = $false
)
begin{}
process {
    [void]$PSBoundParameters.Remove('Value')
    [void]$PSBoundParameters.Remove('NumberFormat')    
    [void]$PSBoundParameters.Remove('PassThru')
    $res = Resolve-XLRange @PSBoundParameters
    $Range = $res.Range
    
    $Range.Range.Value = $Value

    if ($NumberFormat -ne $null) {
        $cellFmt = $Range.Range.Style.Numberformat
        
        if ($NumberFormat -is [string]) {
            $cellFmt.Format = $NumberFormat
        } else {
            # this could very well be wrong
            switch ($NumberFormat.ToString()) {
                "Text" { $cellFmt.Format = "Text" }
                "Date" { $cellFmt.Format = "yyyy-mm-dd" }
                "General" { $cellFmt.Format = "General" }
                "Percent" { $cellFmt.Format = "0.0%"; }
                "DateTime" { $cellFmt.Format = "yyyy-mm-dd h:mm.ss" }
                "Time" { $cellFmt.Format = "h:mm.ss" }
                default { $cellFmt.Format = $NumberFormat }
            }
        }
    }

    $Range.HasHeaders = $false

    if ($PassThru.IsPresent) {
        $PSCmdlet.WriteObject($res.InputObject, $false)
    } else {
        $PSCmdlet.WriteObject($Range, $false)
    }
}
end{}
}