diff --git a/Public/Set-CellComment.ps1 b/Public/Set-CellComment.ps1 index a68cdca..06ab5fb 100644 --- a/Public/Set-CellComment.ps1 +++ b/Public/Set-CellComment.ps1 @@ -2,12 +2,19 @@ param() function Set-CellComment { - [CmdletBinding(DefaultParameterSetName = "ColumnLetter")] + [CmdletBinding(DefaultParameterSetName = "Range")] param( - [Parameter(Mandatory = $True)] + [Parameter(Mandatory = $True, ParameterSetName = "ColumnLetter")] + [Parameter(Mandatory = $True, ParameterSetName = "ColumnNumber")] + [Parameter(Mandatory = $False, ParameterSetName = "Range")] [OfficeOpenXml.ExcelWorkSheet]$Worksheet, - [Parameter(Mandatory = $True)] + [Parameter(Mandatory = $True, ParameterSetName = "Range", ValueFromPipeline = $true,Position=0)] + [Alias("Address")] + $Range, + + [Parameter(Mandatory = $True, ParameterSetName = "ColumnLetter")] + [Parameter(Mandatory = $True, ParameterSetName = "ColumnNumber")] [Int]$Row, [Parameter(Mandatory = $True, ParameterSetName = "ColumnLetter")] @@ -20,12 +27,44 @@ function Set-CellComment { [String]$Text ) - If ($PSCmdlet.ParameterSetName -eq "ColumnNumber") { - $ColumnLetter = (Get-ExcelColumnName -ColumnNumber $ColumnNumber).ColumnName + If ($PSCmdlet.ParameterSetName -eq "Range") { + Write-Verbose "Using 'Range' Parameter Set" + if ($Range -is [Array]) { + $null = $PSBoundParameters.Remove("Range") + $Range | Set-CellComment @PSBoundParameters + } + else { + #We should accept, a worksheet and a name of a range or a cell address; a table; the address of a table; a named range; a row, a column or .Cells[ ] + if ($Range -is [OfficeOpenXml.Table.ExcelTable]) {$Range = $Range.Address} + elseif ($Worksheet -and $Range -is [string]) { + # Convert range as string to OfficeOpenXml.ExcelAddress + $Range = [OfficeOpenXml.ExcelAddress]::new($Range) + } + elseif ($Range -is [string]) {Write-Warning -Message "The range parameter you have specified also needs a worksheet parameter." ;return} + #else we assume $Range is a OfficeOpenXml.ExcelAddress + } + } + ElseIf ($PSCmdlet.ParameterSetName -eq "ColumnNumber") { + $Range = [OfficeOpenXml.ExcelAddress]::new($Row, $ColumnNumber, $Row, $ColumnNumber) + } + ElseIf ($PSCmdlet.ParameterSetName -eq "ColumnLetter") { + $Range = [OfficeOpenXml.ExcelAddress]::new(("{0}{1}" -f $ColumnLetter,$Row)) } - $a = "{0}{1}" -f $ColumnLetter,$Row - $t = $Worksheet.Cells[$a] - [Void]$t.AddComment($Text, "ImportExcel") - $t.Comment.AutoFit = $True + If ($Range -isnot [Array]) { + Foreach ($c in $Worksheet.Cells[$Range]) { + write-verbose $c.address + Try { + If ($Null -eq $c.comment) { + [Void]$c.AddComment($Text, "ImportExcel") + } + Else { + $c.Comment.Text = $Text + $c.Comment.Author = "ImportExcel" + } + $c.Comment.AutoFit = $True + } + Catch { "Could not add comment to cell {0}: {1}" -f $c.Address, $_.ToString() } + } + } } \ No newline at end of file diff --git a/__tests__/Set-CellComment.tests.ps1 b/__tests__/Set-CellComment.tests.ps1 new file mode 100644 index 0000000..5c43ba4 --- /dev/null +++ b/__tests__/Set-CellComment.tests.ps1 @@ -0,0 +1,46 @@ +if (-not (Get-command Import-Excel -ErrorAction SilentlyContinue)) { + Import-Module $PSScriptRoot\..\ImportExcel.psd1 +} + +Describe "Test setting comment on cells in different ways" { + BeforeAll { + $data = ConvertFrom-Csv @" +OrderId,Category,Sales,Quantity,Discount +1,Cosmetics,744.01,07,0.7 +2,Grocery,349.13,25,0.3 +3,Apparels,535.11,88,0.2 +4,Electronics,524.69,60,0.1 +5,Electronics,439.10,41,0.0 +6,Apparels,56.84,54,0.8 +7,Electronics,326.66,97,0.7 +8,Cosmetics,17.25,74,0.6 +9,Grocery,199.96,39,0.4 +10,Grocery,731.77,20,0.3 +"@ + + $Excel = $data | Export-Excel -PassThru + $ws = $Excel.Workbook.Worksheets | Select -First 1 + } + + AfterAll { + Close-ExcelPackage $Excel + } + + It "Should add comments to multiple cells".PadRight(87) { + Set-CellComment -Range "A1" -Worksheet $ws -Text "This was added with a single cell range" + Set-CellComment -Range "A2:C2" -Worksheet $ws -Text "This was added with a multiple cell range" + Set-CellComment -ColumnLetter A -Row 3 -Worksheet $ws -Text "This was added using a column letter and rownumber" + Set-CellComment -ColumnNumber 1 -Row 4 -Worksheet $ws -Text "This was added using a column number and row number" + + Set-CellComment -Range "B2" -Worksheet $ws -Text "This demonstrates an overwrite of a previously set comment" + + $ws.Cells["A1"].Comment.Text | Should -Be "This was added with a single cell range" + $ws.Cells["A2"].Comment.Text | Should -Be "This was added with a multiple cell range" + $ws.Cells["B2"].Comment.Text | Should -Be "This demonstrates an overwrite of a previously set comment" + $ws.Cells["C2"].Comment.Text | Should -Be "This was added with a multiple cell range" + $ws.Cells["A3"].Comment.Text | Should -Be "This was added using a column letter and rownumber" + $ws.Cells["A4"].Comment.Text | Should -Be "This was added using a column number and row number" + + # ($ws.cells | ? { $Null -ne $_.comment }) | %{"{0} --- {1}" -f $_.address, $_.comment.text} + } +} \ No newline at end of file