From a5b9ddc257386924a2faa27e40fb50e79d304ad9 Mon Sep 17 00:00:00 2001 From: dfinke Date: Fri, 12 Jan 2018 19:32:19 -0500 Subject: [PATCH] Fix 276 and 262 --- Set-Column.ps1 | 64 ++++++++++++------------- Set-Row.ps1 | 82 +++++++++++++++---------------- SetFormat.ps1 | 12 ++--- formatting.ps1 | 128 ++++++++++++++++++++++++------------------------- 4 files changed, 143 insertions(+), 143 deletions(-) diff --git a/Set-Column.ps1 b/Set-Column.ps1 index f195cf8..32da5bb 100644 --- a/Set-Column.ps1 +++ b/Set-Column.ps1 @@ -4,20 +4,20 @@ Adds a column to the existing data area in an Excel sheet, fills values and sets formatting .DESCRIPTION Set-Column takes a value which is either string containing a value or formula or a scriptblock - which evaluates to a string, and optionally a column number and fills that value down the column. - A column name can be specified and the new column can be made a named range. - The column can be formatted. + which evaluates to a string, and optionally a column number and fills that value down the column. + A column name can be specified and the new column can be made a named range. + The column can be formatted. .Example C:> Set-Column -Worksheet $ws -Heading "WinsToFastLaps" -Value {"=E$row/C$row"} -Column 7 -AutoSize -AutoNameRange Here $WS already contains a worksheet which contains counts of races won and fastest laps recorded by racing drivers (in columns C and E) - Set-Column specifies that Column 7 should have a heading of "WinsToFastLaps" and the data cells should contain =E2/C2 , =E3/C3 - the data celss should become a named range, which will also be "WinsToFastLaps" the column width will be set automatically - + Set-Column specifies that Column 7 should have a heading of "WinsToFastLaps" and the data cells should contain =E2/C2 , =E3/C3 + the data celss should become a named range, which will also be "WinsToFastLaps" the column width will be set automatically + #> [cmdletbinding()] Param ( [Parameter(ParameterSetName="Package",Mandatory=$true)] - [OfficeOpenXml.ExcelPackage]$ExcelPackage, + [OfficeOpenXml.ExcelPackage]$ExcelPackage, #Sheet to update [Parameter(ParameterSetName="Package")] $Worksheetname = "Sheet1", @@ -27,7 +27,7 @@ #Column to fill down - first column is 1. 0 will be interpreted as first unused column $Column = 0 , [Int]$StartRow , - #value, formula or script block for to fill in. Script block can use $row, $column [number], $ColumnName [letter(s)], $startRow, $startColumn, $endRow, $endColumn + #value, formula or script block for to fill in. Script block can use $row, $column [number], $ColumnName [letter(s)], $startRow, $startColumn, $endRow, $endColumn [parameter(Mandatory=$true)] $Value , #Optional column heading @@ -80,41 +80,41 @@ [Switch]$AutoNameRange, [switch]$PassThru ) - #if we were passed a package object and a worksheet name , get the worksheet. - if ($ExcelPackage) {$Worksheet = $ExcelPackage.Workbook.Worksheets[$Worksheetname] } - - #In a script block to build a formula, we may want any of corners or the columnname, + #if we were passed a package object and a worksheet name , get the worksheet. + if ($ExcelPackage) {$Worksheet = $ExcelPackage.Workbook.Worksheets[$Worksheetname] } + + #In a script block to build a formula, we may want any of corners or the columnname, #if column and startrow aren't specified, assume first unused column, and first row if (-not $StartRow) {$startRow = $Worksheet.Dimension.Start.Row } - $StartColumn = $Worksheet.Dimension.Start.Column + $StartColumn = $Worksheet.Dimension.Start.Column $endColumn = $Worksheet.Dimension.End.Column - $endRow = $Worksheet.Dimension.End.Row - if ($Column -lt 2 ) {$Column = $endColumn + 1 } + $endRow = $Worksheet.Dimension.End.Row + if ($Column -lt 2 ) {$Column = $endColumn + 1 } $ColumnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1","" - Write-Verbose -Message "Updating Column $ColumnName" + Write-Verbose -Message "Updating Column $ColumnName" #If there is a heading, insert it and use it as the name for a range (if we're creating one) if ($Heading) { - $Worksheet.Cells[$StartRow, $Column].Value = $heading - $startRow ++ + $Worksheet.Cells[$StartRow, $Column].Value = $heading + $startRow ++ if ($AutoNameRange) { $Worksheet.Names.Add( $heading, ($Worksheet.Cells[$startrow, $Column, $endRow, $Column]) ) | Out-Null } - } + } #Fill in the data if ($value) { foreach ($row in ($StartRow.. $endRow)) { - if ($Value -is [scriptblock]) { #re-create the script block otherwise variables from this function are out of scope. - $cellData = & ([scriptblock]::create( $Value )) - Write-Verbose -Message $cellData + if ($Value -is [scriptblock]) { #re-create the script block otherwise variables from this function are out of scope. + $cellData = & ([scriptblock]::create( $Value )) + Write-Verbose -Message $cellData } - else { $cellData = $Value} + else { $cellData = $Value} if ($cellData -match "^=") { $Worksheet.Cells[$Row, $Column].Formula = $cellData } - else { $Worksheet.Cells[$Row, $Column].Value = $cellData } - if ($cellData -is [datetime]) { $Worksheet.Cells[$Row, $Column].Style.Numberformat.Format = 'm/d/yy h:mm' } - }} - #region Apply formatting + else { $Worksheet.Cells[$Row, $Column].Value = $cellData } + if ($cellData -is [datetime]) { $Worksheet.Cells[$Row, $Column].Style.Numberformat.Format = 'm/d/yy h:mm' } + }} + #region Apply formatting if ($Underline) { $Worksheet.Column( $Column).Style.Font.UnderLine = $true $Worksheet.Column( $Column).Style.Font.UnderLineType = $UnderLineType - } + } if ($Bold) { $Worksheet.Column( $Column).Style.Font.Bold = $true } if ($Italic) { $Worksheet.Column( $Column).Style.Font.Italic = $true } if ($StrikeThru) { $Worksheet.Column( $Column).Style.Font.Strike = $true } @@ -123,9 +123,9 @@ if ($TextRotation) { $Worksheet.Column( $Column).Style.TextRotation = $TextRotation } if ($WrapText) { $Worksheet.Column( $Column).Style.WrapText = $true } if ($HorizontalAlignment) { $Worksheet.Column( $Column).Style.HorizontalAlignment = $HorizontalAlignment} - if ($VerticalAlignment) { $Worksheet.Column( $Column).Style.VerticalAlignment = $VerticalAlignment } + if ($VerticalAlignment) { $Worksheet.Column( $Column).Style.VerticalAlignment = $VerticalAlignment } if ($FontColor) { $Worksheet.Column( $Column).Style.Font.Color.SetColor( $FontColor ) } - if ($BorderRound) { $Worksheet.Column( $Column).Style.Border.BorderAround( $BorderAround ) } + if ($BorderAround) { $Worksheet.Column( $Column).Style.Border.BorderAround( $BorderAround ) } if ($BackgroundColor) { $Worksheet.Column( $Column).Style.Fill.PatternType = $BackgroundPattern $Worksheet.Column( $Column).Style.Fill.BackgroundColor.SetColor($BackgroundColor ) @@ -133,7 +133,7 @@ } if ($Autosize) { $Worksheet.Column( $Column).AutoFit() } elseif ($Width) { $Worksheet.Column( $Column).Width = $Width } - #endregion + #endregion #return the new data if -passthru was specified. - if ($passThru) { $Worksheet.Column( $Column)} + if ($passThru) { $Worksheet.Column( $Column)} } \ No newline at end of file diff --git a/Set-Row.ps1 b/Set-Row.ps1 index f1e43be..e66850e 100644 --- a/Set-Row.ps1 +++ b/Set-Row.ps1 @@ -1,40 +1,40 @@ Function Set-Row { <# -.Synopsis +.Synopsis Fills values into a row in a Excel spreadsheet -.Description - Set-Row accepts either a Worksheet object or an Excel package object returned by Export-Excel and the name of a sheet, - and inserts the chosen contents into a row of the sheet. - The contents can be a constant "42" , a formula or a script block which is converted into a constant or formula. - The first cell of the row can optional be given a heading. -.Example - Set-row -Worksheet $ws -Heading Total -Value {"=sum($columnName`2:$columnName$endrow)" } - - $Ws contains a worksheet object, and no Row number is specified so Set-Row will select the next row after the end of the data in the sheet - The first cell will contain "Total", and each other cell will contain - =Sum(xx2:xx99) - where xx is the column name, and 99 is the last row of data. - Note the use of `2 to Prevent 2 becoming part of the variable "ColumnName" - The script block can use $row, $column, $ColumnName, $startRow/Column $endRow/Column +.Description + Set-Row accepts either a Worksheet object or an Excel package object returned by Export-Excel and the name of a sheet, + and inserts the chosen contents into a row of the sheet. + The contents can be a constant "42" , a formula or a script block which is converted into a constant or formula. + The first cell of the row can optional be given a heading. +.Example + Set-row -Worksheet $ws -Heading Total -Value {"=sum($columnName`2:$columnName$endrow)" } + + $Ws contains a worksheet object, and no Row number is specified so Set-Row will select the next row after the end of the data in the sheet + The first cell will contain "Total", and each other cell will contain + =Sum(xx2:xx99) - where xx is the column name, and 99 is the last row of data. + Note the use of `2 to Prevent 2 becoming part of the variable "ColumnName" + The script block can use $row, $column, $ColumnName, $startRow/Column $endRow/Column + - #> [cmdletbinding()] Param ( #An Excel package object - e.g. from Export-Excel -passthru - requires a sheet name [Parameter(ParameterSetName="Package",Mandatory=$true)] - [OfficeOpenXml.ExcelPackage]$ExcelPackage, - #the name to update in the package + [OfficeOpenXml.ExcelPackage]$ExcelPackage, + #the name to update in the package [Parameter(ParameterSetName="Package")] $Worksheetname = "Sheet1", - #A worksheet object + #A worksheet object [Parameter(ParameterSetName="sheet",Mandatory=$true)] [OfficeOpenXml.Excelworksheet] $Worksheet, #Row to fill right - first row is 1. 0 will be interpreted as first unused row $Row = 0 , - #Position in the row to start from + #Position in the row to start from [Int]$StartColumn, - #value, formula or script block for to fill in. Script block can use $row, $column [number], $ColumnName [letter(s)], $startRow, $startColumn, $endRow, $endColumn + #value, formula or script block for to fill in. Script block can use $row, $column [number], $ColumnName [letter(s)], $startRow, $startColumn, $endRow, $endColumn [parameter(Mandatory=$true)] $Value, #Optional Row heading @@ -78,43 +78,43 @@ #Degrees to rotate text. Up to +90 for anti-clockwise ("upwards"), or to -90 for clockwise. [ValidateRange(-90, 90)] [int]$TextRotation , - #Set cells to a fixed hieght + #Set cells to a fixed hieght [float]$Height, [switch]$PassThru ) - #if we were passed a package object and a worksheet name , get the worksheet. - if ($ExcelPackage) {$Worksheet = $ExcelPackage.Workbook.worksheets[$Worksheetname] } + #if we were passed a package object and a worksheet name , get the worksheet. + if ($ExcelPackage) {$Worksheet = $ExcelPackage.Workbook.worksheets[$Worksheetname] } - #In a script block to build a formula, we may want any of corners or the columnname, + #In a script block to build a formula, we may want any of corners or the columnname, #if row and start column aren't specified assume first unused row, and first column if (-not $StartColumn) {$StartColumn = $Worksheet.Dimension.Start.Column } $startRow = $Worksheet.Dimension.Start.Row + 1 $endColumn = $Worksheet.Dimension.End.Column - $endRow = $Worksheet.Dimension.End.Row + $endRow = $Worksheet.Dimension.End.Row if ($Row -lt 2 ) {$Row = $endRow + 1 } - - Write-Verbose -Message "Updating Row $Row" - #Add a row label + + Write-Verbose -Message "Updating Row $Row" + #Add a row label if ($Heading) { - $Worksheet.Cells[$Row, $StartColumn].Value = $Heading - $StartColumn ++ + $Worksheet.Cells[$Row, $StartColumn].Value = $Heading + $StartColumn ++ } #Fill in the data if ($value) {foreach ($column in ($StartColumn..$EndColumn)) { #We might want the column name in a script block $ColumnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1","" if ($Value -is [scriptblock] ) { - #re-create the script block otherwise variables from this function are out of scope. - $cellData = & ([scriptblock]::create( $Value )) - Write-Verbose -Message $cellData + #re-create the script block otherwise variables from this function are out of scope. + $cellData = & ([scriptblock]::create( $Value )) + Write-Verbose -Message $cellData } - else{$cellData = $Value} + else{$cellData = $Value} if ($cellData -match "^=") { $Worksheet.Cells[$Row, $column].Formula = $cellData } - else { $Worksheet.Cells[$Row, $Column].Value = $cellData } - if ($cellData -is [datetime]) { $Worksheet.Cells[$Row, $Column].Style.Numberformat.Format = 'm/d/yy h:mm' } + else { $Worksheet.Cells[$Row, $Column].Value = $cellData } + if ($cellData -is [datetime]) { $Worksheet.Cells[$Row, $Column].Style.Numberformat.Format = 'm/d/yy h:mm' } }} - #region Apply formatting + #region Apply formatting if ($Underline) { $worksheet.row( $Row ).Style.Font.UnderLine = $true $worksheet.row( $Row ).Style.Font.UnderLineType = $UnderLineType @@ -130,13 +130,13 @@ if ($VerticalAlignment) { $worksheet.row( $Row ).Style.VerticalAlignment = $VerticalAlignment } if ($Height) { $worksheet.row( $Row ).Height = $Height } if ($FontColor) { $worksheet.row( $Row ).Style.Font.Color.SetColor( $FontColor ) } - if ($BorderRound) { $worksheet.row( $Row ).Style.Border.BorderAround( $BorderAround ) } + if ($BorderAround) { $worksheet.row( $Row ).Style.Border.BorderAround( $BorderAround ) } if ($BackgroundColor) { $worksheet.row( $Row ).Style.Fill.PatternType = $BackgroundPattern $worksheet.row( $Row ).Style.Fill.BackgroundColor.SetColor($BackgroundColor ) if ($PatternColor) { $worksheet.row( $Row ).Style.Fill.PatternColor.SetColor( $PatternColor ) } - } - #endregion + } + #endregion #return the new data if -passthru was specified. - if ($passThru) {$Worksheet.Row($Row)} + if ($passThru) {$Worksheet.Row($Row)} } \ No newline at end of file diff --git a/SetFormat.ps1 b/SetFormat.ps1 index dfe96ff..ec1cd39 100644 --- a/SetFormat.ps1 +++ b/SetFormat.ps1 @@ -72,22 +72,22 @@ [switch]$Hidden ) begin { - #Allow Set-Format to take Worksheet and range parameters (like Add Contitional formatting) - convert them to an address - if ($WorkSheet -and $Range) {$Address = $WorkSheet.Cells[$Range] } + #Allow Set-Format to take Worksheet and range parameters (like Add Contitional formatting) - convert them to an address + if ($WorkSheet -and $Range) {$Address = $WorkSheet.Cells[$Range] } } process { if ($Address -is [Array]) { - [void]$PSBoundParameters.Remove("Address") + [void]$PSBoundParameters.Remove("Address") $Address | Set-Format @PSBoundParameters - } + } else { if ($ResetFont) { $Address.Style.Font.Color.SetColor("Black") $Address.Style.Font.Bold = $false $Address.Style.Font.Italic = $false $Address.Style.Font.UnderLine = $false - $Address.Style.Font.Strike = $falsee + $Address.Style.Font.Strike = $false } if ($Underline) { $Address.Style.Font.UnderLine = $true @@ -98,7 +98,7 @@ if ($StrikeThru) {$Address.Style.Font.Strike = $true } if ($FontShift) {$Address.Style.Font.VerticalAlign = $FontShift } if ($FontColor) {$Address.Style.Font.Color.SetColor( $FontColor ) } - if ($BorderRound) {$Address.Style.Border.BorderAround( $BorderAround ) } + if ($BorderAround) {$Address.Style.Border.BorderAround( $BorderAround ) } if ($NumberFormat) {$Address.Style.Numberformat.Format = $NumberFormat } if ($TextRotation) {$Address.Style.TextRotation = $TextRotation } if ($WrapText) {$Address.Style.WrapText = $true } diff --git a/formatting.ps1 b/formatting.ps1 index 2ec8b58..efc703e 100644 --- a/formatting.ps1 +++ b/formatting.ps1 @@ -1,58 +1,58 @@ Function Add-ConditionalFormatting { <# -.Synopsis - Adds contitional formatting to worksheet -.Example - $excel = $avdata | Export-Excel -Path (Join-path $FilePath "\Machines.XLSX" ) -WorksheetName "Server Anti-Virus" -AutoSize -FreezeTopRow -AutoFilter -PassThru +.Synopsis + Adds contitional formatting to worksheet +.Example + $excel = $avdata | Export-Excel -Path (Join-path $FilePath "\Machines.XLSX" ) -WorksheetName "Server Anti-Virus" -AutoSize -FreezeTopRow -AutoFilter -PassThru - Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Address "b":b1048576" -ForeGroundColor "RED" -RuleType ContainsText -ConditionValue "2003" - Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Address "i2:i1048576" -ForeGroundColor "RED" -RuleType ContainsText -ConditionValue "Disabled" + Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Address "b":b1048576" -ForeGroundColor "RED" -RuleType ContainsText -ConditionValue "2003" + Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Address "i2:i1048576" -ForeGroundColor "RED" -RuleType ContainsText -ConditionValue "Disabled" $excel.Workbook.Worksheets[1].Cells["D1:G1048576"].Style.Numberformat.Format = [cultureinfo]::CurrentCulture.DateTimeFormat.ShortDatePattern $excel.Workbook.Worksheets[1].Row(1).style.font.bold = $true - $excel.Save() ; $excel.Dispose() + $excel.Save() ; $excel.Dispose() - Here Export-Excel is called with the -passThru parameter so the Excel Package object is stored in $Excel - The desired worksheet is selected and the then columns B and i are conditially formatted (excluding the top row) to show + Here Export-Excel is called with the -passThru parameter so the Excel Package object is stored in $Excel + The desired worksheet is selected and the then columns B and i are conditially formatted (excluding the top row) to show Fixed formats are then applied to dates in columns D..G and the top row is formatted - Finally the workbook is saved and the Excel closed. + Finally the workbook is saved and the Excel closed. #> Param ( - #The worksheet where the format is to be applied + #The worksheet where the format is to be applied [OfficeOpenXml.ExcelWorksheet]$WorkSheet , - #The area of the worksheet where the format is to be applied + #The area of the worksheet where the format is to be applied [OfficeOpenXml.ExcelAddress]$Range , - #One of the standard named rules - Top / Bottom / Less than / Greater than / Contains etc + #One of the standard named rules - Top / Bottom / Less than / Greater than / Contains etc [Parameter(Mandatory=$true,ParameterSetName="NamedRule",Position=3)] [OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType]$RuleType , - #Text colour for matching objects - [Alias("ForeGroundColour")] + #Text colour for matching objects + [Alias("ForeGroundColour")] [System.Drawing.Color]$ForeGroundColor, - #colour for databar type charts - [Parameter(Mandatory=$true,ParameterSetName="DataBar")] - [Alias("DataBarColour")] + #colour for databar type charts + [Parameter(Mandatory=$true,ParameterSetName="DataBar")] + [Alias("DataBarColour")] [System.Drawing.Color]$DataBarColor, #One of the three-icon set types (e.g. Traffic Lights) - [Parameter(Mandatory=$true,ParameterSetName="ThreeIconSet")] + [Parameter(Mandatory=$true,ParameterSetName="ThreeIconSet")] [OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting3IconsSetType]$ThreeIconsSet, #A four-icon set name - [Parameter(Mandatory=$true,ParameterSetName="FourIconSet")] + [Parameter(Mandatory=$true,ParameterSetName="FourIconSet")] [OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting4IconsSetType]$FourIconsSet, #A five-icon set name - [Parameter(Mandatory=$true,ParameterSetName="FiveIconSet")] + [Parameter(Mandatory=$true,ParameterSetName="FiveIconSet")] [OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting5IconsSetType]$FiveIconsSet, - #A value for the condition (e.g. "2000" if the test is 'lessthan 2000') + #A value for the condition (e.g. "2000" if the test is 'lessthan 2000') [string]$ConditionValue, - #A second value for the conditions like between x and Y + #A second value for the conditions like between x and Y [string]$ConditionValue2, #Background colour for matching items [System.Drawing.Color]$BackgroundColor, #Background pattern for matching items - [OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern = [OfficeOpenXml.Style.ExcelFillStyle]::Solid, + [OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern = [OfficeOpenXml.Style.ExcelFillStyle]::Solid, #Secondary colour when a background pattern requires it [System.Drawing.Color]$PatternColor, #Sets the numeric format for matching items - $NumberFormat, + $NumberFormat, #Put matching items in bold face [switch]$Bold, #Put matching items in italic @@ -61,27 +61,27 @@ [switch]$Underline, #Strikethrough text of matching items [switch]$StrikeThru - ) + ) - If ($ThreeIconsSet) {$rule = $WorkSheet.ConditionalFormatting.AddThreeIconSet($Range , $ThreeIconsSet)} + If ($ThreeIconsSet) {$rule = $WorkSheet.ConditionalFormatting.AddThreeIconSet($Range , $ThreeIconsSet)} elseif ($FourIconsSet) {$rule = $WorkSheet.ConditionalFormatting.AddFourIconSet( $Range , $FourIconsSet) } elseif ($FiveIconsSet) {$rule = $WorkSheet.ConditionalFormatting.AddFiveIconSet( $Range , $IconType) } elseif ($DataBarColor) {$rule = $WorkSheet.ConditionalFormatting.AddDatabar( $Range , $DataBarColor) } else { $rule = ($WorkSheet.ConditionalFormatting)."Add$RuleType"($Range)} - - if ($ConditionValue -and $RuleType -match "Top|Botom") {$rule.Rank = $ConditionValue } + + if ($ConditionValue -and $RuleType -match "Top|Botom") {$rule.Rank = $ConditionValue } if ($ConditionValue -and $RuleType -match "StdDev") {$rule.StdDev = $ConditionValue } if ($ConditionValue -and $RuleType -match "Than|Equal|Expression") {$rule.Formula = $ConditionValue } if ($ConditionValue -and $RuleType -match "Text|With") {$rule.Text = $ConditionValue } if ($ConditionValue -and $ConditionValue2 -and $RuleType -match "Between") {$rule.Formula = $ConditionValue $rule.Formula2 = $ConditionValue2} - + if ($NumberFormat) {$rule.Style.NumberFormat.Format = $NumberFormat } - if ($Underline) {$rule.Style.Font.Underline = [OfficeOpenXml.Style.ExcelUnderLineType]::Single } - if ($Bold) {$rule.Style.Font.Bold = $true} + if ($Underline) {$rule.Style.Font.Underline = [OfficeOpenXml.Style.ExcelUnderLineType]::Single } + if ($Bold) {$rule.Style.Font.Bold = $true} if ($Italic) {$rule.Style.Font.Italic = $true} - if ($StrikeThru) {$rule.Style.Font.Strike = $true} + if ($StrikeThru) {$rule.Style.Font.Strike = $true} if ($ForeGroundColor) {$rule.Style.Font.Color.color = $ForeGroundColor } if ($BackgroundColor) {$rule.Style.Fill.BackgroundColor.color = $BackgroundColor } if ($BackgroundPattern) {$rule.Style.Fill.PatternType = $BackgroundPattern } @@ -90,14 +90,14 @@ Function Set-Format { <# -.SYNOPSIS - Applies Number, font, alignment and colour formatting to a range of Excel Cells +.SYNOPSIS + Applies Number, font, alignment and colour formatting to a range of Excel Cells .EXAMPLE $sheet.Column(3) | Set-Format -HorizontalAlignment Right -NumberFormat "#,###" Selects column 3 from a sheet object (within a workbook object, which is a child of the ExcelPackage object) and passes it to Set-Format which formats as an integer with comma seperated groups .EXAMPLE - Set-Format -Address $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NumberFormat "#,###" - Instead of piping the address in this version specifies a block of cells and applies similar formatting + Set-Format -Address $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NumberFormat "#,###" + Instead of piping the address in this version specifies a block of cells and applies similar formatting #> Param ( @@ -105,62 +105,62 @@ Function Set-Format { [Parameter(ValueFromPipeline=$true)] [object[]]$Address , #Number format to apply to cells e.g. "dd/MM/yyyy HH:mm", "£#,##0.00;[Red]-£#,##0.00", "0.00%" , "##/##" , "0.0E+0" etc - [Alias("NFormat")] - $NumberFormat, + [Alias("NFormat")] + $NumberFormat, #Style of border to draw around the range [OfficeOpenXml.Style.ExcelBorderStyle]$BorderAround, - #Colour for the text - if none specified it will be left as it it is + #Colour for the text - if none specified it will be left as it it is [System.Drawing.Color]$FontColor, #Clear Bold, Italic, StrikeThrough and Underline and set colour to black - [switch]$ResetFont, + [switch]$ResetFont, #Make text bold [switch]$Bold, #Make text italic [switch]$Italic, - #Underline the text using the underline style in -underline type + #Underline the text using the underline style in -underline type [switch]$Underline, - #Should Underline use single or double, normal or accounting mode : default is single normal + #Should Underline use single or double, normal or accounting mode : default is single normal [OfficeOpenXml.Style.ExcelUnderLineType]$UnderLineType = [OfficeOpenXml.Style.ExcelUnderLineType]::Single, #StrikeThrough text [switch]$StrikeThru, #Subscript or superscript [OfficeOpenXml.Style.ExcelVerticalAlignmentFont]$FontShift, #Font to use - Excel defaults to Calibri - [String]$FontName, + [String]$FontName, #Point size for the text [float]$FontSize, - #Change background colour + #Change background colour [System.Drawing.Color]$BackgroundColor, #Background pattern - solid by default [OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern =[OfficeOpenXml.Style.ExcelFillStyle]::Solid , - #Secondary colour for background pattern - [Alias("PatternColour")] + #Secondary colour for background pattern + [Alias("PatternColour")] [System.Drawing.Color]$PatternColor, #Turn on text wrapping - [switch]$WrapText, - #Position cell contents to left, right or centre ... + [switch]$WrapText, + #Position cell contents to left, right or centre ... [OfficeOpenXml.Style.ExcelHorizontalAlignment]$HorizontalAlignment, - #Position cell contents to top bottom or centre + #Position cell contents to top bottom or centre [OfficeOpenXml.Style.ExcelVerticalAlignment]$VerticalAlignment, #Degrees to rotate text. Up to +90 for anti-clockwise ("upwards"), or to -90 for clockwise. [ValidateRange(-90,90)] [int]$TextRotation , #Autofit cells to width (columns or ranges only) - [switch]$AutoFit, + [switch]$AutoFit, #Set cells to a fixed width (columns or ranges only), ignored if Autofit is specified [float]$Width, #Set cells to a fixed hieght (rows or ranges only) - [float]$Height, + [float]$Height, #Hide a row or column (not a range) - [switch]$Hidden + [switch]$Hidden ) process { - Foreach ($range in $Address) { + Foreach ($range in $Address) { if ($ResetFont) {$Range.Style.Font.Color.SetColor("Black") $Range.Style.Font.Bold = $false $Range.Style.Font.Italic = $false $Range.Style.Font.UnderLine = $false - $Range.Style.Font.Strike = $falsee + $Range.Style.Font.Strike = $false } if ($Underline) {$Range.Style.Font.UnderLine = $true $Range.Style.Font.UnderLineType =$UnderLineType @@ -170,7 +170,7 @@ Function Set-Format { if ($StrikeThru) {$Range.Style.Font.Strike = $true } if ($FontShift) {$Range.Style.Font.VerticalAlign = $FontShift } if ($FontColor) {$Range.Style.Font.Color.SetColor( $FontColor ) } - if ($BorderRound) {$Range.Style.Border.BorderAround( $BorderAround ) } + if ($BorderAround) {$Range.Style.Border.BorderAround( $BorderAround ) } if ($NumberFormat) {$Range.Style.Numberformat.Format= $NumberFormat } if ($TextRotation) {$Range.Style.TextRotation = $TextRotation } if ($WrapText) {$Range.Style.WrapText = $true } @@ -179,7 +179,7 @@ Function Set-Format { if ($BackgroundColor) { $Range.Style.Fill.PatternType = $BackgroundPattern - $Range.Style.Fill.BackgroundColor.SetColor($BackgroundColor) + $Range.Style.Fill.BackgroundColor.SetColor($BackgroundColor) if ($PatternColor) { $range.Style.Fill.PatternColor.SetColor( $PatternColor) } @@ -191,13 +191,13 @@ Function Set-Format { ($range.Start.Row)..($range.Start.Row + $range.Rows) | ForEach-Object {$ws.Row($_).Height = $Height } } - else {Write-Warning -Message ("Can set the height of a row or a range but not a {0} object" -f ($Range.GetType().name)) } + else {Write-Warning -Message ("Can set the height of a row or a range but not a {0} object" -f ($Range.GetType().name)) } } if ($AutoFit) { if ($Range -is [OfficeOpenXml.ExcelColumn]) {$Range.AutoFit() } - elseif ($Range -is [OfficeOpenXml.ExcelRange] ) {$Range.AutoFitColumns() } - else {Write-Warning -Message ("Can autofit a column or a range but not a {0} object" -f ($Range.GetType().name)) } - + elseif ($Range -is [OfficeOpenXml.ExcelRange] ) {$Range.AutoFitColumns() } + else {Write-Warning -Message ("Can autofit a column or a range but not a {0} object" -f ($Range.GetType().name)) } + } elseif ($Width) { if ($Range -is [OfficeOpenXml.ExcelColumn]) {$Range.Width = $Width} @@ -205,7 +205,7 @@ Function Set-Format { ($range.Start.Column)..($range.Start.Column+ $range.Columns) | ForEach-Object {$ws.Column($_).Width = $Width} } - else {Write-Warning -Message ("Can set the width of a column or a range but not a {0} object" -f ($Range.GetType().name)) } + else {Write-Warning -Message ("Can set the width of a column or a range but not a {0} object" -f ($Range.GetType().name)) } } if ($Hidden) { if ($Range -is [OfficeOpenXml.ExcelRow] -or @@ -216,12 +216,12 @@ Function Set-Format { } } -#Argument completer for colours. If we have PS 5 or Tab expansion++ then we'll register it. Otherwise it does nothing. +#Argument completer for colours. If we have PS 5 or Tab expansion++ then we'll register it. Otherwise it does nothing. Function ColorCompletion{ param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter) [System.Drawing.KnownColor].GetFields() | Where-Object {$_.IsStatic -and $_.name -like "$wordToComplete*" } | Sort-Object name | ForEach-Object {New-CompletionResult $_.name $_.name - } + } } if (Get-Command -Name register-argumentCompleter -ErrorAction SilentlyContinue) {