From b7add5f9e141b0eb42669285904259c37615fc5c Mon Sep 17 00:00:00 2001 From: jhoneill Date: Tue, 9 Oct 2018 23:01:55 +0100 Subject: [PATCH 01/10] Changed color default parameters away from strings --- Merge-worksheet.ps1 | 22 +++++++++++----------- New-ConditionalText.ps1 | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Merge-worksheet.ps1 b/Merge-worksheet.ps1 index cdf1d49..2c321cd 100644 --- a/Merge-worksheet.ps1 +++ b/Merge-worksheet.ps1 @@ -101,13 +101,13 @@ #Name of a column which is unique used to pair up rows from the refence and difference side, default is "Name". $Key = "Name" , #Sets the font color for the "key" field; this means you can filter by color to get only changed rows. - [System.Drawing.Color]$KeyFontColor = "DarkRed", + [System.Drawing.Color]$KeyFontColor = [System.Drawing.Color]::DarkRed , #Sets the background color for changed rows. - [System.Drawing.Color]$ChangeBackgroundColor = "Orange", + [System.Drawing.Color]$ChangeBackgroundColor = [System.Drawing.Color]::Orange, #Sets the background color for rows in the reference but deleted from the difference sheet. - [System.Drawing.Color]$DeleteBackgroundColor = "LightPink", + [System.Drawing.Color]$DeleteBackgroundColor = [System.Drawing.Color]::LightPink, #Sets the background color for rows not in the reference but added to the difference sheet. - [System.Drawing.Color]$AddBackgroundColor = "PaleGreen", + [System.Drawing.Color]$AddBackgroundColor = [System.Drawing.Color]::PaleGreen, #if Specified hides the rows in the spreadsheet that are equal and only shows changes, added or deleted rows. [switch]$HideEqual , #If specified outputs the data to the pipeline (you can add -whatif so it the command only outputs to the pipeline). @@ -229,9 +229,9 @@ foreach ($result in $_.Group) { if ($result.SideIndicator -ne "=>") {$hash["_Row"] = $result._Row } elseif (-not $hash["$DiffPrefix Row"]) {$hash["_Row"] = "" } - #if we have already set the side, this must be the second record, so set side to indicate "changed"; if we got two "Same" indicators we may have a classh of keys + #if we have already set the side, this must be the second record, so set side to indicate "changed"; if we got two "Same" indicators we may have a classh of keys if ($hash.Side) { - if ($hash.Side -eq $result.SideIndicator) {Write-Warning -Message "'$keyval' may be a duplicate."} + if ($hash.Side -eq $result.SideIndicator) {Write-Warning -Message "'$keyval' may be a duplicate."} $hash.Side = "<>" } else {$hash["Side"] = $result.SideIndicator} @@ -259,7 +259,7 @@ elseif ($result.SideIndicator -eq "=>") { $hash[("$DiffPrefix $p")] = $result.$P} } } - + foreach ($k in $hash.keys) {$eDiffProps[$k] = $true} [Pscustomobject]$hash } | Sort-Object -Property "_row" @@ -375,13 +375,13 @@ Function Merge-MultipleSheets { #Name of a column which is unique used to pair up rows from the refence and difference side, default is "Name". $Key = "Name" , #Sets the font color for the "key" field; this means you can filter by color to get only changed rows. - [System.Drawing.Color]$KeyFontColor = "Red", + [System.Drawing.Color]$KeyFontColor = [System.Drawing.Color]::Red, #Sets the background color for changed rows. - [System.Drawing.Color]$ChangeBackgroundColor = "Orange", + [System.Drawing.Color]$ChangeBackgroundColor = [System.Drawing.Color]::Orange, #Sets the background color for rows in the reference but deleted from the difference sheet. - [System.Drawing.Color]$DeleteBackgroundColor = "LightPink", + [System.Drawing.Color]$DeleteBackgroundColor = [System.Drawing.Color]::LightPink, #Sets the background color for rows not in the reference but added to the difference sheet. - [System.Drawing.Color]$AddBackgroundColor = "Orange", + [System.Drawing.Color]$AddBackgroundColor = [System.Drawing.Color]::Orange, #if Specified hides the columns in the spreadsheet that contain the row numbers [switch]$HideRowNumbers , #If specified outputs the data to the pipeline (you can add -whatif so it the command only outputs to the command) diff --git a/New-ConditionalText.ps1 b/New-ConditionalText.ps1 index edbbf06..45e966c 100644 --- a/New-ConditionalText.ps1 +++ b/New-ConditionalText.ps1 @@ -40,8 +40,8 @@ function New-ConditionalText { [Alias("ConditionValue")] $Text, [Alias("ForeGroundColor")] - [System.Drawing.Color]$ConditionalTextColor="DarkRed", - [System.Drawing.Color]$BackgroundColor="LightPink", + [System.Drawing.Color]$ConditionalTextColor=[System.Drawing.Color]::DarkRed, + [System.Drawing.Color]$BackgroundColor=[System.Drawing.Color]::LightPink, [String]$Range, [OfficeOpenXml.Style.ExcelFillStyle]$PatternType=[OfficeOpenXml.Style.ExcelFillStyle]::Solid, [ValidateSet( From 01c58faea8c21081d254c34b3594c9c2322a0e8a Mon Sep 17 00:00:00 2001 From: jhoneill Date: Wed, 10 Oct 2018 10:36:36 +0100 Subject: [PATCH 02/10] Color constants are now [color] objects, not string for V6 compat. --- SetFormat.ps1 | 2 +- __tests__/Compare-WorkSheet.tests.ps1 | 6 ++--- __tests__/Export-Excel.Tests.ps1 | 22 +++++++------------ __tests__/ExtraLongCmd.tests.ps1 | 2 +- __tests__/First10Races.tests.ps1 | 4 ++-- __tests__/Join-Worksheet.tests.ps1 | 2 +- __tests__/RangePassing.ps1 | 6 ++--- .../Set-Row_Set-Column-SetFormat.tests.ps1 | 8 +++---- 8 files changed, 23 insertions(+), 29 deletions(-) diff --git a/SetFormat.ps1 b/SetFormat.ps1 index b342bb6..50b8236 100644 --- a/SetFormat.ps1 +++ b/SetFormat.ps1 @@ -113,7 +113,7 @@ elseif ($Range -is [string]) {Write-Warning -Message "The range pararameter you have specified also needs a worksheet parameter."} if ($ResetFont) { - $Range.Style.Font.Color.SetColor("Black") + $Range.Style.Font.Color.SetColor( ([System.Drawing.Color]::Black)) $Range.Style.Font.Bold = $false $Range.Style.Font.Italic = $false $Range.Style.Font.UnderLine = $false diff --git a/__tests__/Compare-WorkSheet.tests.ps1 b/__tests__/Compare-WorkSheet.tests.ps1 index 1757998..095ee5f 100644 --- a/__tests__/Compare-WorkSheet.tests.ps1 +++ b/__tests__/Compare-WorkSheet.tests.ps1 @@ -51,7 +51,7 @@ Describe "Compare Worksheet" { Context "Setting the background to highlight different rows, use of grid view." { BeforeAll { - Compare-WorkSheet "$env:temp\Server1.xlsx" "$env:temp\Server2.xlsx" -BackgroundColor LightGreen -GridView + Compare-WorkSheet "$env:temp\Server1.xlsx" "$env:temp\Server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView Start-Sleep -sec 5; [System.Windows.Forms.SendKeys]::Sendwait("%{F4}") $xl1 = Open-ExcelPackage -Path "$env:temp\Server1.xlsx" $xl2 = Open-ExcelPackage -Path "$env:temp\Server2.xlsx" @@ -78,7 +78,7 @@ Describe "Compare Worksheet" { Context "Setting the forgound to highlight changed properties" { BeforeAll { - $null = compare-WorkSheet "$env:temp\Server1.xlsx" "$env:temp\Server2.xlsx" -AllDataBackgroundColor white -BackgroundColor LightGreen -FontColor DarkRed + $null = compare-WorkSheet "$env:temp\Server1.xlsx" "$env:temp\Server2.xlsx" -AllDataBackgroundColor([System.Drawing.Color]::white) -BackgroundColor ([System.Drawing.Color]::LightGreen) -FontColor ([System.Drawing.Color]::DarkRed) $xl1 = Open-ExcelPackage -Path "$env:temp\Server1.xlsx" $xl2 = Open-ExcelPackage -Path "$env:temp\Server2.xlsx" $s1Sheet = $xl1.Workbook.Worksheets[1] @@ -121,7 +121,7 @@ Describe "Compare Worksheet" { $s[10].ServiceType = "Changed should not matter" $s | Select-Object -Property ServiceName, DisplayName, StartType, ServiceType | Export-Excel -Path $env:temp\server2.xlsx -WorkSheetname server2 #Assume default worksheet name, (sheet1) and column header for key ("name") - $comp = compare-WorkSheet "$env:temp\Server1.xlsx" "$env:temp\Server2.xlsx" -WorkSheetName Server1,Server2 -Key ServiceName -Property DisplayName,StartType -AllDataBackgroundColor AliceBlue -BackgroundColor White -FontColor Red | Sort-Object _row,_file + $comp = compare-WorkSheet "$env:temp\Server1.xlsx" "$env:temp\Server2.xlsx" -WorkSheetName Server1,Server2 -Key ServiceName -Property DisplayName,StartType -AllDataBackgroundColor ([System.Drawing.Color]::AliceBlue) -BackgroundColor ([System.Drawing.Color]::White) -FontColor ([System.Drawing.Color]::Red) | Sort-Object _row,_file $xl1 = Open-ExcelPackage -Path "$env:temp\Server1.xlsx" $xl2 = Open-ExcelPackage -Path "$env:temp\Server2.xlsx" $s1Sheet = $xl1.Workbook.Worksheets["server1"] diff --git a/__tests__/Export-Excel.Tests.ps1 b/__tests__/Export-Excel.Tests.ps1 index 0a67602..fb15ffe 100644 --- a/__tests__/Export-Excel.Tests.ps1 +++ b/__tests__/Export-Excel.Tests.ps1 @@ -355,13 +355,7 @@ Describe ExportExcel { Context "#Example 5 # Adding a single conditional format " { #Test New-ConditionalText builds correctly - $ct = New-ConditionalText -ConditionalType GreaterThan 525 -ConditionalTextColor DarkRed -BackgroundColor LightPink - it "Created a Conditional format description " { - $ct.BackgroundColor -is [System.Drawing.Color] | Should be $true - $ct.ConditionalTextColor -is [System.Drawing.Color] | Should be $true - $ct.ConditionalType -in [enum]::GetNames( [OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType] ) | - Should be $true - } + $ct = New-ConditionalText -ConditionalType GreaterThan 525 -ConditionalTextColor ([System.Drawing.Color]::DarkRed) -BackgroundColor ([System.Drawing.Color]::LightPink) $path = "$env:TEMP\Test.xlsx" Remove-item -Path $path -ErrorAction SilentlyContinue @@ -398,8 +392,8 @@ Describe ExportExcel { #Testing -Passthrough $Excel = Get-Service | Select-Object Name, Status, DisplayName, ServiceName | Export-Excel $path -PassThru -ConditionalText $( - New-ConditionalText Stop DarkRed LightPink - New-ConditionalText Running Blue Cyan + New-ConditionalText Stop ([System.Drawing.Color]::DarkRed) ([System.Drawing.Color]::LightPink) + New-ConditionalText Running ([System.Drawing.Color]::Blue) ([System.Drawing.Color]::Cyan) ) $ws = $Excel.Workbook.Worksheets[1] it "Added two blocks of conditional formating for the data range " { @@ -649,7 +643,7 @@ Describe ExportExcel { $warnvar = $null #Test create two data pages; as part of adding the second give both their own pivot table, test -autosize switch Get-Service | Select-Object -Property Status, Name, DisplayName, StartType, CanPauseAndContinue | Export-Excel -Path $path -AutoSize -TableName "All Services" -TableStyle Medium1 -WarningAction SilentlyContinue -WarningVariable warnvar - Get-Process | Select-Object -Property Name, Company, Handles, CPU, VM | Export-Excel -Path $path -AutoSize -WorkSheetname 'sheet2' -TableName "Processes" -TableStyle Light1 -Title "Processes" -TitleFillPattern Solid -TitleBackgroundColor AliceBlue -TitleBold -TitleSize 22 -PivotTableDefinition $ptDef + Get-Process | Select-Object -Property Name, Company, Handles, CPU, VM | Export-Excel -Path $path -AutoSize -WorkSheetname 'sheet2' -TableName "Processes" -TableStyle Light1 -Title "Processes" -TitleFillPattern Solid -TitleBackgroundColor ([System.Drawing.Color]::AliceBlue) -TitleBold -TitleSize 22 -PivotTableDefinition $ptDef $Excel = Open-ExcelPackage $path $ws1 = $Excel.Workbook.Worksheets["Sheet1"] $ws2 = $Excel.Workbook.Worksheets["Sheet2"] @@ -722,10 +716,10 @@ Describe ExportExcel { Set-ExcelRange -Address $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NFormat "#,###" Set-ExcelRange -Address $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold Set-ExcelRange -Address $sheet.Row(1) -Bold -HorizontalAlignment Center - Add-ConditionalFormatting -WorkSheet $sheet -Range "D2:D1048576" -DataBarColor Red + Add-ConditionalFormatting -WorkSheet $sheet -Range "D2:D1048576" -DataBarColor ([System.Drawing.Color]::Red) #test Add-ConditionalFormatting -passthru and using a range (and no worksheet) $rule = Add-ConditionalFormatting -passthru -Address $sheet.cells["C:C"] -RuleType TopPercent -ConditionValue 20 -Bold -StrikeThru - Add-ConditionalFormatting -WorkSheet $sheet -Range "G2:G1048576" -RuleType GreaterThan -ConditionValue "104857600" -ForeGroundColor Red -Bold -Italic -Underline -BackgroundColor Beige -BackgroundPattern LightUp -PatternColor Gray + Add-ConditionalFormatting -WorkSheet $sheet -Range "G2:G1048576" -RuleType GreaterThan -ConditionValue "104857600" -ForeGroundColor ([System.Drawing.Color]::Red) -Bold -Italic -Underline -BackgroundColor ([System.Drawing.Color]::Beige) -BackgroundPattern LightUp -PatternColor ([System.Drawing.Color]::Gray) #Test Set-ExcelRange with a column foreach ($c in 5..9) {Set-ExcelRange $sheet.Column($c) -AutoFit } Add-PivotTable -PivotTableName "PT_Procs" -ExcelPackage $excel -SourceWorkSheet 1 -PivotRows Company -PivotData @{'Name' = 'Count'} -IncludePivotChart -ChartType ColumnClustered -NoLegend @@ -857,7 +851,7 @@ Describe ExportExcel { -Column 2 -ColumnOffSetPixels 35 -Width 800 -XAxisTitleText "Degrees" -XAxisTitleBold -XAxisTitleSize 12 -XMajorUnit 30 -XMinorUnit 10 -XMinValue 0 -XMaxValue 361 -XAxisNumberformat "000" ` -YMinValue -1.25 -YMaxValue 1.25 -YMajorUnit 0.25 -YAxisNumberformat "0.00" -YAxisTitleText "Sine" -YAxisTitleBold -YAxisTitleSize 12 ` -LegendSize 8 -legendBold -LegendPosition Bottom - Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets["Sinx"] -Range "B2:B362" -RuleType LessThan -ConditionValue "=B1" -ForeGroundColor Red + Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets["Sinx"] -Range "B2:B362" -RuleType LessThan -ConditionValue "=B1" -ForeGroundColor ([System.Drawing.Color]::Red) $ws = $Excel.Workbook.Worksheets["Sinx"] $d = $ws.Drawings[0] It "Controled the axes and title and legend of the chart " { @@ -916,7 +910,7 @@ Describe ExportExcel { Select-Object -Property Name, @{n="TotalPm";e={($_.group | Measure-Object -sum -Property pm).sum }} | Export-Excel -NoHeader -AutoNameRange -path $path -ReturnRange -PieChart -ShowPercent $Cf = New-ConditionalFormattingIconSet -Range ($range -replace "^.*:","B2:") -ConditionalFormat ThreeIconSet -Reverse -IconType Flags - $ct = New-ConditionalText -Text "Microsoft" -ConditionalTextColor red -BackgroundColor AliceBlue -ConditionalType ContainsText + $ct = New-ConditionalText -Text "Microsoft" -ConditionalTextColor ([System.Drawing.Color]::Red) -BackgroundColor([System.Drawing.Color]::AliceBlue) -ConditionalType ContainsText it "Created the Conditional formatting rules " { $cf.Formatter | Should be "ThreeIconSet" $cf.IconType | Should be "Flags" diff --git a/__tests__/ExtraLongCmd.tests.ps1 b/__tests__/ExtraLongCmd.tests.ps1 index d1fcda7..8dde29a 100644 --- a/__tests__/ExtraLongCmd.tests.ps1 +++ b/__tests__/ExtraLongCmd.tests.ps1 @@ -10,7 +10,7 @@ Banana, London , 300, 200 Orange, Paris, 600, 500 Banana, Paris, 300, 200 Apple, New York, 1200,700 -"@ | Export-Excel -Path $path -TableStyle Medium13 -tablename "RawData" -ConditionalFormat @{Range="C2:C7"; DataBarColor="Green"} -ExcelChartDefinition @{ChartType="Doughnut";XRange="A2:B7"; YRange="C2:C7"; width=800; } -PivotTableDefinition @{Sales=@{ +"@ | Export-Excel -Path $path -TableStyle Medium13 -tablename "RawData" -ConditionalFormat @{Range="C2:C7"; DataBarColor=([System.Drawing.Color]::Green)} -ExcelChartDefinition @{ChartType="Doughnut";XRange="A2:B7"; YRange="C2:C7"; width=800; } -PivotTableDefinition @{Sales=@{ PivotRows="City"; PivotColumns="Product"; PivotData=@{Gross="Sum";Net="Sum"}; PivotNumberFormat="$#,##0.00"; PivotTotals="Both"; PivotTableSyle="Medium12"; Activate=$true PivotChartDefinition=@{Title="Gross and net by city and product"; ChartType="ColumnClustered"; Column=6; Width=600; Height=360; YMajorUnit=500; YMinorUnit=100; YAxisNumberformat="$#,##0"; LegendPosition="Bottom"}}} diff --git a/__tests__/First10Races.tests.ps1 b/__tests__/First10Races.tests.ps1 index c8fd86e..a86754b 100644 --- a/__tests__/First10Races.tests.ps1 +++ b/__tests__/First10Races.tests.ps1 @@ -34,10 +34,10 @@ Describe "Creating small named ranges with hyperlinks" { $cf.Icon2.Type = $cf.Icon3.Type = "Num" $cf.Icon2.Value = 0 $cf.Icon3.Value = 1 - Add-ConditionalFormatting -Address $worksheet.cells["FinishPosition"] -RuleType Equal -ConditionValue 1 -ForeGroundColor Purple -Bold -Priority 1 -StopIfTrue #Test Priority and stopIfTrue and using range name + Add-ConditionalFormatting -Address $worksheet.cells["FinishPosition"] -RuleType Equal -ConditionValue 1 -ForeGroundColor ([System.Drawing.Color]::Purple) -Bold -Priority 1 -StopIfTrue #Test Priority and stopIfTrue and using range name Add-ConditionalFormatting -Address $worksheet.Cells["GridPosition"] -RuleType ThreeColorScale -Reverse #Test Reverse $ct = New-ConditionalText -Text "Ferrari" - $ct2 = New-ConditionalText -Range $worksheet.Names["FinishPosition"].Address -ConditionalType LessThanOrEqual -Text 3 -ConditionalText Red -Background White #Test new-conditionalText in shortest and longest forms. + $ct2 = New-ConditionalText -Range $worksheet.Names["FinishPosition"].Address -ConditionalType LessThanOrEqual -Text 3 -ConditionalText ([System.Drawing.Color]::Red) -Background ([System.Drawing.Color]::White) #Test new-conditionalText in shortest and longest forms. #Create links for each group name (race) and Export them so they start at Cell A1; create a pivot table with definition just created, save the file and open in Excel $results | ForEach-Object {(New-Object -TypeName OfficeOpenXml.ExcelHyperLink -ArgumentList "Sheet1!$($_.Name)" , "$($_.name) GP")} | #Test Exporting Hyperlinks with display property. Export-Excel -ExcelPackage $excel -AutoSize -PivotTableDefinition $pt -Calculate -ConditionalFormat $ct,$ct2 #Test conditional text rules in conditional format (orignally icon sets only ) diff --git a/__tests__/Join-Worksheet.tests.ps1 b/__tests__/Join-Worksheet.tests.ps1 index 5731d7b..01336f3 100644 --- a/__tests__/Join-Worksheet.tests.ps1 +++ b/__tests__/Join-Worksheet.tests.ps1 @@ -30,7 +30,7 @@ Describe "Join Worksheet" { $data2 | Export-Excel -Path $path -WorkSheetname Abingdon $data3 | Export-Excel -Path $path -WorkSheetname Banbury $ptdef = New-PivotTableDefinition -PivotTableName "SummaryPivot" -PivotRows "Store" -PivotColumns "Product" -PivotData @{"Total"="SUM"} -IncludePivotChart -ChartTitle "Sales Breakdown" -ChartType ColumnStacked -ChartColumn 10 - Join-Worksheet -Path $path -WorkSheetName "Total" -Clearsheet -FromLabel "Store" -TableName "SummaryTable" -TableStyle Light1 -AutoSize -BoldTopRow -FreezePane 2,1 -Title "Store Sales Summary" -TitleBold -TitleSize 14 -TitleBackgroundColor AliceBlue -PivotTableDefinition $ptdef + Join-Worksheet -Path $path -WorkSheetName "Total" -Clearsheet -FromLabel "Store" -TableName "SummaryTable" -TableStyle Light1 -AutoSize -BoldTopRow -FreezePane 2,1 -Title "Store Sales Summary" -TitleBold -TitleSize 14 -TitleBackgroundColor ([System.Drawing.Color]::AliceBlue) -PivotTableDefinition $ptdef $excel = Export-Excel -path $path -WorkSheetname SummaryPivot -Activate -NoTotalsInPivot -PivotDataToColumn -HideSheet * -UnHideSheet "Total","SummaryPivot" -PassThru # Open-ExcelPackage -Path $path diff --git a/__tests__/RangePassing.ps1 b/__tests__/RangePassing.ps1 index d71e1b8..1858215 100644 --- a/__tests__/RangePassing.ps1 +++ b/__tests__/RangePassing.ps1 @@ -19,7 +19,7 @@ describe "Consistent passing of ranges." { $warnvar | should beNullOrEmpty $excel.Services.ConditionalFormatting.Count | Should be 3 {Add-ConditionalFormatting "Status" -WorkSheet $excel.Services ` - -ForeGroundColor Green -RuleType ContainsText -ConditionValue "Running"} | Should not throw + -ForeGroundColor ([System.Drawing.Color]::Green) -RuleType ContainsText -ConditionValue "Running"} | Should not throw $excel.Services.ConditionalFormatting.Count | Should be 4 } Close-ExcelPackage -NoSave $excel @@ -32,7 +32,7 @@ describe "Consistent passing of ranges." { -Bold -RuleType ContainsText -ConditionValue "windows" } | Should not throw $excel.Services.ConditionalFormatting.Count | Should be 2 {Add-ConditionalFormatting -WorkSheet $excel.Services -Address "a:a" ` - -RuleType ContainsText -ConditionValue "stopped" -ForeGroundColor Red } | Should not throw + -RuleType ContainsText -ConditionValue "stopped" -ForeGroundColor ([System.Drawing.Color]::Red) } | Should not throw $excel.Services.ConditionalFormatting.Count | Should be 3 } Close-ExcelPackage -NoSave $excel @@ -62,7 +62,7 @@ describe "Consistent passing of ranges." { $excel.Services.cells["C3"].Style.Font.UnderLine | Should be $true {Set-ExcelRange -WorkSheet $excel.Services -Range "Name" -Bold } | Should not throw $excel.Services.cells["B4"].Style.Font.Bold | Should be $true - {$excel.Services.Column(3) | Set-ExcelRange -FontColor red } | Should not throw + {$excel.Services.Column(3) | Set-ExcelRange -FontColor ([System.Drawing.Color]::Red) } | Should not throw $excel.Services.cells["C4"].Style.Font.Color.Rgb | Should be "FFFF0000" } Close-ExcelPackage -NoSave $excel diff --git a/__tests__/Set-Row_Set-Column-SetFormat.tests.ps1 b/__tests__/Set-Row_Set-Column-SetFormat.tests.ps1 index 115027d..2214674 100644 --- a/__tests__/Set-Row_Set-Column-SetFormat.tests.ps1 +++ b/__tests__/Set-Row_Set-Column-SetFormat.tests.ps1 @@ -135,13 +135,13 @@ Describe "Set-ExcelColumn, Set-ExcelRow and Set-ExcelRange" { $excel = $data| Export-Excel -Path $path -AutoNameRange -PassThru $ws = $excel.Workbook.Worksheets["Sheet1"] - $c = Set-ExcelColumn -PassThru -Worksheet $ws -Heading "Total" -Value "=Quantity*Price" -NumberFormat "£#,###.00" -FontColor Blue -Bold -HorizontalAlignment Right -VerticalAlignment Top + $c = Set-ExcelColumn -PassThru -Worksheet $ws -Heading "Total" -Value "=Quantity*Price" -NumberFormat "£#,###.00" -FontColor ([System.Drawing.Color]::Blue) -Bold -HorizontalAlignment Right -VerticalAlignment Top $r = Set-ExcelRow -PassThru -Worksheet $ws -StartColumn 3 -BorderAround Thin -Italic -Underline -FontSize 14 -Value {"=sum($columnName`2:$columnName$endrow)" } -VerticalAlignment Bottom - Set-ExcelRange -Address $excel.Workbook.Worksheets["Sheet1"].Cells["b3"] -HorizontalAlignment Right -VerticalAlignment Center -BorderAround Thick -BorderColor Red -StrikeThru - Set-ExcelRange -Address $excel.Workbook.Worksheets["Sheet1"].Cells["c3"] -BorderColor Red -BorderTop DashDot -BorderLeft DashDotDot -BorderBottom Dashed -BorderRight Dotted + Set-ExcelRange -Address $excel.Workbook.Worksheets["Sheet1"].Cells["b3"] -HorizontalAlignment Right -VerticalAlignment Center -BorderAround Thick -BorderColor ([System.Drawing.Color]::Red) -StrikeThru + Set-ExcelRange -Address $excel.Workbook.Worksheets["Sheet1"].Cells["c3"] -BorderColor ([System.Drawing.Color]::Red) -BorderTop DashDot -BorderLeft DashDotDot -BorderBottom Dashed -BorderRight Dotted Set-ExcelRange -WorkSheet $ws -Range "E3" -Bold:$false -FontShift Superscript -HorizontalAlignment Left Set-ExcelRange -WorkSheet $ws -Range "E1" -ResetFont -HorizontalAlignment General -FontName "Courier New" -fontSize 9 - Set-ExcelRange -Address $ws.Cells["E7"] -ResetFont -WrapText -BackgroundColor AliceBlue -BackgroundPattern DarkTrellis -PatternColor Red -NumberFormat "£#,###.00" + Set-ExcelRange -Address $ws.Cells["E7"] -ResetFont -WrapText -BackgroundColor ([System.Drawing.Color]::AliceBlue) -BackgroundPattern DarkTrellis -PatternColor ([System.Drawing.Color]::Red) -NumberFormat "£#,###.00" Set-ExcelRange -Address $ws.Column(1) -Width 0 Set-ExcelRange -Address $ws.Column(2) -AutoFit Set-ExcelRange -Address $ws.Cells["E:E"] -AutoFit From d26f0c66dd6c1958ee1e09a9b59cf1168374bc53 Mon Sep 17 00:00:00 2001 From: jhoneill Date: Mon, 15 Oct 2018 13:14:14 +0100 Subject: [PATCH 03/10] More PS6 friendly tests. Help and pos param tweaks in Conditional Fmt --- AddConditionalFormatting.ps1 | 86 +++++++++++++++++++-------- Export-Excel.ps1 | 2 +- New-ConditionalFormattingIconSet.ps1 | 3 + New-ConditionalText.ps1 | 4 ++ __tests__/Compare-WorkSheet.tests.ps1 | 10 ++-- __tests__/Join-Worksheet.tests.ps1 | 9 ++- 6 files changed, 80 insertions(+), 34 deletions(-) diff --git a/AddConditionalFormatting.ps1 b/AddConditionalFormatting.ps1 index 8d96383..85bd421 100644 --- a/AddConditionalFormatting.ps1 +++ b/AddConditionalFormatting.ps1 @@ -1,46 +1,82 @@ Function Add-ConditionalFormatting { <# .Synopsis - Adds conditional formatting to worksheet. + Adds conditional formatting to all or part of a worksheet. .Description - Conditional formatting allows excel to - * Mark cells with Icons depending on their value - * Show a databar whose length indicates the value or a 2 or 3 color scale where the color indicate the relative value + Conditional formatting allows Excel to: + * Mark cells with icons depending on their value + * Show a databar whose length indicates the value or a 2 or 3 color scale where the color indicates the relative value * Change the color, font, or number format of cells which meet given criteria - Add-ConditionalFormatting allows these to be set; for fine tuning of the rules you can use the -PassThru switch, - which will return the rule so that you can modify things which are specific to that type of rule, - for example the values which correspond to each icon in an Icon set. + Add-ConditionalFormatting allows these parameters to be set; for fine tuning of the rules the -PassThru switch, + will return the rule so that you can modify things which are specific to that type of rule, + for example the values which correspond to each icon in an Icon-Set. .Example > - PS> $excel = $avdata | Export-Excel -Path (Join-path $FilePath "\Machines.XLSX" ) -WorksheetName "Server Anti-Virus" -AutoSize -FreezeTopRow -AutoFilter -PassThru + $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 "b2: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() - 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 conditionally formatted (excluding the top row) to show red text if - the columns contain "2003" or "Disabled respectively. A fixed date format is then applied to columns D..G, and the top row is formatted. - Finally the workbook is saved and the Excel object closed. + Here Export-Excel is called with the -PassThru parameter so the Excel Package object representing Machines.XLSX is stored in $Excel. + The desired worksheet is selected and then columns" B" and "I" are conditionally formatted (excluding the top row) to show red text if + they contain "2003" or "Disabled" respectively. A fixed date format is then applied to columns D..G, and the top row is formatted. + Finally the workbook is saved and the Excel package object is closed. .Example > - >PS $r = Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Range "B1:B100" -ThreeIconsSet Flags -Passthru + $r = Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Range "B1:B100" -ThreeIconsSet Flags -Passthru $r.Reverse = $true ; $r.Icon1.Type = "Num"; $r.Icon2.Type = "Num" ; $r.Icon2.value = 100 ; $r.Icon3.type = "Num" ;$r.Icon3.value = 1000 - Again Export-Excel has been called with -passthru leaving a package object in $Excel - This time B1:B100 has been conditionally formatted with 3 icons, using the flags icon set. + Again Export-Excel has been called with -Passthru leaving a package object in $Excel + This time B1:B100 has been conditionally formatted with 3 icons, using the "Flags" Icon-Set. Add-ConditionalFormatting does not provide access to every option in the formatting rule, so passthru has been used and the - rule is modified to apply the flags in reverse order, and boundaries for the number which will set the split are set to 100 and 1000 + rule is modified to apply the flags in reverse order, and transitions between flags are set to 100 and 1000 .Example Add-ConditionalFormatting -WorkSheet $sheet -Range "D2:D1048576" -DataBarColor Red - This time $sheet holds an ExcelWorkseet object and databars are add to all of column D except for the tip row. + This time $sheet holds an ExcelWorkseet object and databars are added to column D excluding the top row. .Example Add-ConditionalFormatting -Address $worksheet.cells["FinishPosition"] -RuleType Equal -ConditionValue 1 -ForeGroundColor Purple -Bold -Priority 1 -StopIfTrue - In this example a named range is used to select the cells where the formula should apply. If a cell in the "FinishPosition" range is 1, then the text is turned to Bold & Purple. + In this example a named range is used to select the cells where the condition should apply, + and instead of specifying a sheet and range within the sheet as separate paramters, + the cells where the format should apply are specified directly. + If a cell in the "FinishPosition" range is 1, then the text is turned to Bold & Purple. This rule is moved to first in the priority list, and where cells have a value of 1, no other rules will be processed. + .Example + > + $excel = Get-ChildItem | Select-Object -Property Name,Length,LastWriteTime,CreationTime | Export-Excel "$env:temp\test43.xlsx" -PassThru -AutoSize + $ws = $excel.Workbook.Worksheets["Sheet1"] + $ws.Cells["E1"].Value = "SavedAt" + $ws.Cells["F1"].Value = [datetime]::Now + $ws.Cells["F1"].Style.Numberformat.Format = (Expand-NumberFormat -NumberFormat 'Date-Time') + $lastRow = $ws.Dimension.End.Row + + Add-ConditionalFormatting -WorkSheet $ws -address "A2:A$Lastrow" -RuleType LessThan -ConditionValue "A" -ForeGroundColor Gray + Add-ConditionalFormatting -WorkSheet $ws -address "B2:B$Lastrow" -RuleType GreaterThan -ConditionValue 1000000 -NumberFormat '#,###,,.00"M"' + Add-ConditionalFormatting -WorkSheet $ws -address "C2:C$Lastrow" -RuleType GreaterThan -ConditionValue "=INT($F$1-7)" -ForeGroundColor Green -StopIfTrue + Add-ConditionalFormatting -WorkSheet $ws -address "D2:D$Lastrow" -RuleType Equal -ConditionValue "=C2" -ForeGroundColor Blue -StopIfTrue + + Close-ExcelPackage -Show $excel + + The first few lines of code export a list of file and directory names, sizes and dates to a spreadsheet. It puts the date of the export in Cell F1. + The first Conditional format changes the color of files and folders that begin with a ".", "_" or anything else which sorts before "A" + The second Conditional format changes the Number format of numbers bigger than 1 million for example 1,234,567,890 will dispay as "1,234.57M" + The third looks highlights datestamps of files less than a week old when the export was run. + The = is necessary in the condition value to otherwise the rule will look for the the text INT($F$1-7). + The cell address for the date is fixed using the standard Excel $ notation. + The final Conditional format looks for files which have not changed since they were created. Here the condition value is "=C2". The = Sign means C2 is + treated as a formula, not literal text. Unlike the file age, we want the cell used to change for each cell where the conditional format applies. + The first cell in the conditional format range is D2, which is compared against C2, then D3 is compared against C3 and so on. + A common mistake is to include the title row in the range and accidentally apply conditional formatting to it, + or to begin the range at row 2 but use row 1 as the starting point for comparisons. + .Example + Add-ConditionalFormatting $ws.Cells["B:B"] GreaterThan 10000000 -Fore Red -Stop -Pri 1 + + This version shows the shortest syntax - the Address, Ruletype, and Conditionvalue can be identified from their position, + and ForegroundColor, StopIfTrue and Priority can all be shortend. + #> Param ( #A block of cells to format - you can use a named range with -Address $ws.names[1] or $ws.cells["RangeName"] @@ -54,8 +90,8 @@ [OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType]$RuleType , #Text colour for matching objects [Parameter(ParameterSetName = "NamedRule")] - [Alias("ForeGroundColour")] - [System.Drawing.Color]$ForeGroundColor, + [Alias("ForegroundColour")] + [System.Drawing.Color]$ForegroundColor, #Colour for databar type charts [Parameter(Mandatory = $true, ParameterSetName = "DataBar")] [Alias("DataBarColour")] @@ -69,17 +105,17 @@ #A five-icon set name [Parameter(Mandatory = $true, ParameterSetName = "FiveIconSet")] [OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting5IconsSetType]$FiveIconsSet, - #Use the icon set in reverse order, or reverse the orders of Two- & Three-Color Scales + #Use the Icon-Set in reverse order, or reverse the orders of Two- & Three-Color Scales [Parameter(ParameterSetName = "NamedRule")] [Parameter(ParameterSetName = "ThreeIconSet")] [Parameter(ParameterSetName = "FourIconSet")] [Parameter(ParameterSetName = "FiveIconSet")] [switch]$Reverse, #A value for the condition (for example 2000 if the test is 'lessthan 2000'; Formulas should begin with "=" ) - [Parameter(ParameterSetName = "NamedRule")] + [Parameter(ParameterSetName = "NamedRule",Position = 2)] $ConditionValue, #A second value for the conditions like "between x and Y" - [Parameter(ParameterSetName = "NamedRule")] + [Parameter(ParameterSetName = "NamedRule",Position = 3)] $ConditionValue2, #Background colour for matching items [Parameter(ParameterSetName = "NamedRule")] @@ -111,7 +147,7 @@ #Set the sequence for rule processing [int]$Priority, #If specified pass the rule back to the caller to allow additional customization. - [switch]$Passthru + [switch]$PassThru ) #Allow conditional formatting to work like Set-ExcelRange (with single ADDRESS parameter), split it to get worksheet and range of cells. @@ -141,7 +177,7 @@ #By this point we should have a worksheet object whose ConditionalFormatting collection we will add to. If not, bail. if (-not $worksheet -or $WorkSheet -isnot [OfficeOpenXml.ExcelWorksheet]) {write-warning "You need to provide a worksheet object." ; return} #region create a rule of the right type - if ($RuleType -match 'IconSet$') {Write-warning -Message "You cannot configure a IconSet rule in this way; please use -$RuleType ." ; return} + if ($RuleType -match 'IconSet$') {Write-warning -Message "You cannot configure a Icon-Set rule in this way; please use -$RuleType ." ; return} if ($PSBoundParameters.ContainsKey("ThreeIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddThreeIconSet($Address , $ThreeIconsSet)} elseif ($PSBoundParameters.ContainsKey("FourIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddFourIconSet( $Address , $FourIconsSet )} elseif ($PSBoundParameters.ContainsKey("FiveIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddFiveIconSet( $Address , $FiveIconsSet )} diff --git a/Export-Excel.ps1 b/Export-Excel.ps1 index cea61c2..59d905e 100644 --- a/Export-Excel.ps1 +++ b/Export-Excel.ps1 @@ -729,7 +729,7 @@ foreach ($Name in $script:Header) { try {Add-CellValue -TargetCell $ws.Cells[$Row, $ColumnIndex] -CellValue $TargetData.$Name} - catch {Write-Warning -Message "Could not insert the $Name property at Row $Row, Column $Column"} + catch {Write-Warning -Message "Could not insert the '$Name' property at Row $Row, Column $ColumnIndex"} $ColumnIndex += 1 } $ColumnIndex -= 1 # column index will be the last column whether isDataTypeValueType was true or false diff --git a/New-ConditionalFormattingIconSet.ps1 b/New-ConditionalFormattingIconSet.ps1 index 4d903a1..1b425af 100644 --- a/New-ConditionalFormattingIconSet.ps1 +++ b/New-ConditionalFormattingIconSet.ps1 @@ -21,6 +21,9 @@ function New-ConditionalFormattingIconSet { The first line creates a range - one column wide in the column $column, running from $topRow to $lastDataRow. The second creates a definition object using this range and the third uses Export-Excel with an open package to apply the format and save and open the file. + .Link + Add-Add-ConditionalFormatting + New-ConditionalText #> param( [Parameter(Mandatory=$true)] diff --git a/New-ConditionalText.ps1 b/New-ConditionalText.ps1 index 45e966c..d3f14e2 100644 --- a/New-ConditionalText.ps1 +++ b/New-ConditionalText.ps1 @@ -33,7 +33,11 @@ function New-ConditionalText { This builds on the previous example, and specifies a condition of <=3 with a format of Red text on a white background; this applies to a named range "Finish Position" the range could be written "C:C" to specify a named column, or "C2:C102" to specify certain cells in the column. + .Link + Add-Add-ConditionalFormatting + New-ConditionalFormattingIconSet #> + [cmdletbinding()] param( #[Parameter(Mandatory=$true)] diff --git a/__tests__/Compare-WorkSheet.tests.ps1 b/__tests__/Compare-WorkSheet.tests.ps1 index 095ee5f..7acdfdc 100644 --- a/__tests__/Compare-WorkSheet.tests.ps1 +++ b/__tests__/Compare-WorkSheet.tests.ps1 @@ -1,8 +1,7 @@ #Requires -Modules Pester Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force - -Add-Type -AssemblyName System.Windows.Forms - +if ($PSVersionTable.PSVersion.Major -gt 5) { Write-Warning "Can't test grid view on V6" } +else {Add-Type -AssemblyName System.Windows.Forms } Describe "Compare Worksheet" { Context "Simple comparison output" { BeforeAll { @@ -51,8 +50,9 @@ Describe "Compare Worksheet" { Context "Setting the background to highlight different rows, use of grid view." { BeforeAll { - Compare-WorkSheet "$env:temp\Server1.xlsx" "$env:temp\Server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView - Start-Sleep -sec 5; [System.Windows.Forms.SendKeys]::Sendwait("%{F4}") + $useGrid = ($PSVersionTable.PSVersion.Major -LE 5) + $null = Compare-WorkSheet "$env:temp\Server1.xlsx" "$env:temp\Server2.xlsx" -BackgroundColor ([System.Drawing.Color]::LightGreen) -GridView:$useGrid + if ($useGrid) {Start-Sleep -sec 5; [System.Windows.Forms.SendKeys]::Sendwait("%{F4}") } $xl1 = Open-ExcelPackage -Path "$env:temp\Server1.xlsx" $xl2 = Open-ExcelPackage -Path "$env:temp\Server2.xlsx" $s1Sheet = $xl1.Workbook.Worksheets[1] diff --git a/__tests__/Join-Worksheet.tests.ps1 b/__tests__/Join-Worksheet.tests.ps1 index 01336f3..43ff7ed 100644 --- a/__tests__/Join-Worksheet.tests.ps1 +++ b/__tests__/Join-Worksheet.tests.ps1 @@ -22,7 +22,7 @@ ID,Product,Quantity,Price,Total 12012,Pliers,3,14.99,44.97 "@ -Describe "Join Worksheet" { +Describe "Join Worksheet part 1" { BeforeAll { $path = "$Env:TEMP\test.xlsx" Remove-Item -Path $path -ErrorAction SilentlyContinue @@ -88,8 +88,11 @@ Describe "Join Worksheet" { $pc.Title.text | Should be "Sales Breakdown" } } +} $path = "$env:TEMP\Test.xlsx" Remove-item -Path $path -ErrorAction SilentlyContinue +IF ($PSVersionTable.PSVersion.Major -gt 5) {Write-warning -message "Part 2 Does not run on V6"; return} +Describe "Join Worksheet part 2" { Get-WmiObject -Class win32_logicaldisk | Select-Object -Property DeviceId,VolumeName, Size,Freespace | Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000" @@ -119,6 +122,6 @@ Describe "Join Worksheet" { $ws.Cells["A$NextRow"].Value | Should be $excel.Workbook.Worksheets[2].Cells["A2"].value $ws.Cells["B$NextRow"].Value | Should be $excel.Workbook.Worksheets[2].Cells["B2"].value } - } -} + } +} From 61173d5e408ac952935e2216e9ba7cf6e6af3c1c Mon Sep 17 00:00:00 2001 From: jhoneill Date: Wed, 17 Oct 2018 11:23:15 +0100 Subject: [PATCH 04/10] Updates after proof reading help --- AddConditionalFormatting.ps1 | 89 ++++++++++------- Export-Excel.ps1 | 133 ++++++++++++++----------- Join-Worksheet.ps1 | 59 +++++++----- Merge-worksheet.ps1 | 139 ++++++++++++++++----------- New-ConditionalFormattingIconSet.ps1 | 16 +-- New-ConditionalText.ps1 | 23 +++-- New-ExcelChart.ps1 | 33 ++++--- Open-ExcelPackage.ps1 | 28 +++--- Send-SqlDataToExcel.ps1 | 15 ++- SetFormat.ps1 | 27 ++++-- compare-worksheet.ps1 | 89 ++++++++++------- 11 files changed, 386 insertions(+), 265 deletions(-) diff --git a/AddConditionalFormatting.ps1 b/AddConditionalFormatting.ps1 index 85bd421..e39f3cd 100644 --- a/AddConditionalFormatting.ps1 +++ b/AddConditionalFormatting.ps1 @@ -5,11 +5,12 @@ .Description Conditional formatting allows Excel to: * Mark cells with icons depending on their value - * Show a databar whose length indicates the value or a 2 or 3 color scale where the color indicates the relative value + * Show a databar whose length indicates the value or a two or three color scale where the color indicates the relative value * Change the color, font, or number format of cells which meet given criteria - Add-ConditionalFormatting allows these parameters to be set; for fine tuning of the rules the -PassThru switch, - will return the rule so that you can modify things which are specific to that type of rule, - for example the values which correspond to each icon in an Icon-Set. + Add-ConditionalFormatting allows these parameters to be set; for fine tuning of + the rules, the -PassThru switch will return the rule so that you can modify + things which are specific to that type of rule, example, the values which + correspond to each icon in an Icon-Set. .Example > $excel = $avdata | Export-Excel -Path (Join-path $FilePath "\Machines.XLSX" ) -WorksheetName "Server Anti-Virus" -AutoSize -FreezeTopRow -AutoFilter -PassThru @@ -19,31 +20,37 @@ $excel.Workbook.Worksheets[1].Row(1).style.font.bold = $true $excel.Save() ; $excel.Dispose() - Here Export-Excel is called with the -PassThru parameter so the Excel Package object representing Machines.XLSX is stored in $Excel. - The desired worksheet is selected and then columns" B" and "I" are conditionally formatted (excluding the top row) to show red text if - they contain "2003" or "Disabled" respectively. A fixed date format is then applied to columns D..G, and the top row is formatted. + Here Export-Excel is called with the -PassThru parameter so the ExcelPackage object + representing Machines.XLSX is stored in $Excel.The desired worksheet is selected + and then columns" B" and "I" are conditionally formatted (excluding the top row) + to show red text if they contain "2003" or "Disabled" respectively. + A fixed date format is then applied to columns D to G, and the top row is formatted. Finally the workbook is saved and the Excel package object is closed. .Example > $r = Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Range "B1:B100" -ThreeIconsSet Flags -Passthru $r.Reverse = $true ; $r.Icon1.Type = "Num"; $r.Icon2.Type = "Num" ; $r.Icon2.value = 100 ; $r.Icon3.type = "Num" ;$r.Icon3.value = 1000 - Again Export-Excel has been called with -Passthru leaving a package object in $Excel - This time B1:B100 has been conditionally formatted with 3 icons, using the "Flags" Icon-Set. - Add-ConditionalFormatting does not provide access to every option in the formatting rule, so passthru has been used and the - rule is modified to apply the flags in reverse order, and transitions between flags are set to 100 and 1000 + Again Export-Excel has been called with -PassThru leaving a package object + in $Excel. This time B1:B100 has been conditionally formatted with 3 icons, + using the "Flags" Icon-Set. Add-ConditionalFormatting does not provide access + to every option in the formatting rule, so -PassThru has been used and the + rule is modified to apply the flags in reverse order, and transitions + between flags are set to 100 and 1000. .Example Add-ConditionalFormatting -WorkSheet $sheet -Range "D2:D1048576" -DataBarColor Red - This time $sheet holds an ExcelWorkseet object and databars are added to column D excluding the top row. + This time $sheet holds an ExcelWorkshseet object and databars are added to + column D, excluding the top row. .Example - Add-ConditionalFormatting -Address $worksheet.cells["FinishPosition"] -RuleType Equal -ConditionValue 1 -ForeGroundColor Purple -Bold -Priority 1 -StopIfTrue + Add-ConditionalFormatting -Address $worksheet.cells["FinishPosition"] -RuleType Equal -ConditionValue 1 -ForeGroundColor Purple -Bold -Priority 1 -StopIfTrue - In this example a named range is used to select the cells where the condition should apply, - and instead of specifying a sheet and range within the sheet as separate paramters, - the cells where the format should apply are specified directly. - If a cell in the "FinishPosition" range is 1, then the text is turned to Bold & Purple. - This rule is moved to first in the priority list, and where cells have a value of 1, no other rules will be processed. + In this example a named range is used to select the cells where the condition + should apply, and instead of specifying a sheet and range within the sheet as + separate parameters, the cells where the format should apply are specified + directly. If a cell in the "FinishPosition" range is 1, then the text is + turned to Bold & Purple. This rule is moved to first in the priority list, + and where cells have a value of 1, no other rules will be processed. .Example > $excel = Get-ChildItem | Select-Object -Property Name,Length,LastWriteTime,CreationTime | Export-Excel "$env:temp\test43.xlsx" -PassThru -AutoSize @@ -60,22 +67,30 @@ Close-ExcelPackage -Show $excel - The first few lines of code export a list of file and directory names, sizes and dates to a spreadsheet. It puts the date of the export in Cell F1. - The first Conditional format changes the color of files and folders that begin with a ".", "_" or anything else which sorts before "A" - The second Conditional format changes the Number format of numbers bigger than 1 million for example 1,234,567,890 will dispay as "1,234.57M" - The third looks highlights datestamps of files less than a week old when the export was run. - The = is necessary in the condition value to otherwise the rule will look for the the text INT($F$1-7). - The cell address for the date is fixed using the standard Excel $ notation. - The final Conditional format looks for files which have not changed since they were created. Here the condition value is "=C2". The = Sign means C2 is - treated as a formula, not literal text. Unlike the file age, we want the cell used to change for each cell where the conditional format applies. - The first cell in the conditional format range is D2, which is compared against C2, then D3 is compared against C3 and so on. - A common mistake is to include the title row in the range and accidentally apply conditional formatting to it, - or to begin the range at row 2 but use row 1 as the starting point for comparisons. + The first few lines of code export a list of file and directory names, sizes + and dates to a spreadsheet. It puts the date of the export in cell F1. + The first Conditional format changes the color of files and folders that begin + with a ".", "_" or anything else which sorts before "A". + The second Conditional format changes the Number format of numbers bigger than + 1 million, for example 1,234,567,890 will dispay as "1,234.57M" + The third highlights datestamps of files less than a week old when the export + was run; the = is necessary in the condition value otherwise the rule will + look for the the text INT($F$1-7), and the cell address for the date is fixed + using the standard Excel $ notation. + The final Conditional format looks for files which have not changed since they + were created. Here the condition value is "=C2". The = sign means C2 is treated + as a formula, not literal text. Unlike the file age, we want the cell used to + change for each cell where the conditional format applies. The first cell in + the conditional format range is D2, which is compared against C2, then D3 is + compared against C3 and so on. A common mistake is to include the title row in + the range and accidentally apply conditional formatting to it, or to begin the + range at row 2 but use row 1 as the starting point for comparisons. .Example Add-ConditionalFormatting $ws.Cells["B:B"] GreaterThan 10000000 -Fore Red -Stop -Pri 1 - This version shows the shortest syntax - the Address, Ruletype, and Conditionvalue can be identified from their position, - and ForegroundColor, StopIfTrue and Priority can all be shortend. + This version shows the shortest syntax - the Address, Ruletype, and + Conditionvalue can be identified from their position, and ForegroundColor, + StopIfTrue and Priority can all be shortend. #> Param ( @@ -84,15 +99,15 @@ [Alias("Range")] $Address , #The worksheet where the format is to be applied - [OfficeOpenXml.ExcelWorksheet]$WorkSheet , + [OfficeOpenX1ml.ExcelWorksheet]$WorkSheet , #A standard named-rule - Top / Bottom / Less than / Greater than / Contains etc. [Parameter(Mandatory = $true, ParameterSetName = "NamedRule", Position = 1)] [OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType]$RuleType , - #Text colour for matching objects + #Text color for matching objects [Parameter(ParameterSetName = "NamedRule")] [Alias("ForegroundColour")] [System.Drawing.Color]$ForegroundColor, - #Colour for databar type charts + #Color for databar type charts [Parameter(Mandatory = $true, ParameterSetName = "DataBar")] [Alias("DataBarColour")] [System.Drawing.Color]$DataBarColor, @@ -114,16 +129,16 @@ #A value for the condition (for example 2000 if the test is 'lessthan 2000'; Formulas should begin with "=" ) [Parameter(ParameterSetName = "NamedRule",Position = 2)] $ConditionValue, - #A second value for the conditions like "between x and Y" + #A second value for the conditions like "Between X and Y" [Parameter(ParameterSetName = "NamedRule",Position = 3)] $ConditionValue2, - #Background colour for matching items + #Background color for matching items [Parameter(ParameterSetName = "NamedRule")] [System.Drawing.Color]$BackgroundColor, #Background pattern for matching items [Parameter(ParameterSetName = "NamedRule")] [OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern = [OfficeOpenXml.Style.ExcelFillStyle]::None , - #Secondary colour when a background pattern requires it + #Secondary color when a background pattern requires it [Parameter(ParameterSetName = "NamedRule")] [System.Drawing.Color]$PatternColor, #Sets the numeric format for matching items diff --git a/Export-Excel.ps1 b/Export-Excel.ps1 index 59d905e..586b25b 100644 --- a/Export-Excel.ps1 +++ b/Export-Excel.ps1 @@ -1,21 +1,25 @@ function Export-Excel { <# .SYNOPSIS - Export data to an Excel worksheet. + Exports data to an Excel worksheet. .DESCRIPTION - Export data to an Excel file and where possible try to convert numbers so Excel recognizes them as numbers instead of text. After all. Excel is a spreadsheet program used for number manipulation and calculations. In case the number conversion is not desired, use the parameter '-NoNumberConversion *'. + Exports data to an Excel file and where possible tries to convert numbers + in text fields so Excel recognizes them as numbers instead of text. + After all: Excel is a spreadsheet program used for number manipulation + and calculations. If number conversion is not desired, use the + parameter -NoNumberConversion *. .PARAMETER Path Path to a new or existing .XLSX file. .PARAMETER ExcelPackage - An object representing an Excel Package - usually this is returned by specifying -Passthru allowing multiple commands to work on the same Workbook without saving and reloading each time. + An object representing an Excel Package - usually this is returned by specifying -PassThru allowing multiple commands to work on the same workbook without saving and reloading each time. .PARAMETER WorksheetName The name of a sheet within the workbook - "Sheet1" by default. .PARAMETER ClearSheet If specified Export-Excel will remove any existing worksheet with the selected name. The Default behaviour is to overwrite cells in this sheet as needed (but leaving non-overwritten ones in place). .PARAMETER Append - If specified data will be added to the end of an existing sheet, using the same column headings. + If specified dat,a will be added to the end of an existing sheet, using the same column headings. .PARAMETER TargetData - Data to insert onto the worksheet - this is often provided from the pipeline. + Data to insert onto the worksheet - this is usually provided from the pipeline. .PARAMETER DisplayPropertySet Many (but not all) objects have a hidden property named psStandardmembers with a child property DefaultDisplayPropertySet ; this parameter reduces the properties exported to those in this set. .PARAMETER NoAliasOrScriptPropeties @@ -37,36 +41,36 @@ .PARAMETER Password Sets password protection on the workbook. .PARAMETER IncludePivotTable - Adds a Pivot table using the data in the worksheet. + Adds a PivotTable using the data in the worksheet. .PARAMETER PivotTableName - If a Pivot table is created from command line parameters, specifies the name of the new sheet holding the pivot. Defaults to "WorksheetName-PivotTable" + If a PivotTable is created from command line parameters, specifies the name of the new sheet holding the pivot. Defaults to "WorksheetName-PivotTable". .PARAMETER PivotRows - Name(s) columns from the spreadsheet which will provide the Row name(s) in a pivot table created from command line parameters. + Name(s) of column(s) from the spreadsheet which will provide the Row name(s) in a PivotTable created from command line parameters. .PARAMETER PivotColumns - Name(s) columns from the spreadsheet which will provide the Column name(s) in a pivot table created from command line parameters. + Name(s) of columns from the spreadsheet which will provide the Column name(s) in a PivotTable created from command line parameters. .PARAMETER PivotFilter - Name(s) columns from the spreadsheet which will provide the Filter name(s) in a pivot table created from command line parameters. + Name(s) columns from the spreadsheet which will provide the Filter name(s) in a PivotTable created from command line parameters. .PARAMETER PivotData - In a pivot table created from command line parameters, the fields to use in the table body are given as a Hash table in the form ColumnName = Average|Count|CountNums|Max|Min|Product|None|StdDev|StdDevP|Sum|Var|VarP. + In a PivotTable created from command line parameters, the fields to use in the table body are given as a Hash table in the form ColumnName = Average|Count|CountNums|Max|Min|Product|None|StdDev|StdDevP|Sum|Var|VarP. .PARAMETER PivotDataToColumn If there are multiple datasets in a PivotTable, by default they are shown as separate rows under the given row heading; this switch makes them separate columns. .PARAMETER NoTotalsInPivot - In a pivot table created from command line parameters, prevents the addition of totals to rows and columns. + In a PivotTable created from command line parameters, prevents the addition of totals to rows and columns. .PARAMETER PivotTotals - By default, Pivot tables have totals for each Row (on the right) and for each column at the bottom. This allows just one or neither to be selected. + By default, PivotTables have totals for each row (on the right) and for each column at the bottom. This allows just one or neither to be selected. .PARAMETER PivotTableDefinition - Instead of describing a single pivot table with multiple commandline parameters; you can use a hashTable in the form PivotTableName = Definition; - Definition is itself a hashtable with Sheet, PivotRows, PivotColumns, PivotData, IncludePivotChart and ChartType values. + Instead of describing a single PivotTable with multiple command-line parameters; you can use a HashTable in the form PivotTableName = Definition; + Definition is itself a Hashtable with Sheet, PivotRows, PivotColumns, PivotData, IncludePivotChart and ChartType values. .PARAMETER IncludePivotChart - Include a chart with the Pivot table - implies -IncludePivotTable. + Include a chart with the PivotTable - implies -IncludePivotTable. .PARAMETER ChartType - The type for Pivot chart (one of Excel's defined chart types) + The type for PivotChart (one of Excel's defined chart types). .PARAMETER NoLegend - Exclude the legend from the pivot chart. + Exclude the legend from the PivotChart. .PARAMETER ShowCategory - Add category labels to the pivot chart. + Add category labels to the PivotChart. .PARAMETER ShowPercent - Add Percentage labels to the pivot chart. + Add percentage labels to the PivotChart. .PARAMETER ConditionalFormat One or more conditional formatting rules defined with New-ConditionalFormattingIconSet. .PARAMETER ConditionalText @@ -74,13 +78,13 @@ .PARAMETER NoNumberConversion By default we convert all values to numbers if possible, but this isn't always desirable. NoNumberConversion allows you to add exceptions for the conversion. Wildcards (like '*') are allowed. .PARAMETER BoldTopRow - Makes the top Row boldface. + Makes the top row boldface. .PARAMETER NoHeader Does not put field names at the top of columns. .PARAMETER RangeName Makes the data in the worksheet a named range. .PARAMETER TableName - Makes the data in the worksheet a table with a name applies a style to it. Name must not contain spaces. + Makes the data in the worksheet a table with a name, and applies a style to it. Name must not contain spaces. .PARAMETER TableStyle Selects the style for the named table - defaults to 'Medium6'. .PARAMETER BarChart @@ -92,11 +96,11 @@ .PARAMETER PieChart Creates a "quick" pie chart using the first text column as labels and the first numeric column as values .PARAMETER ExcelChartDefinition - A hash table containing ChartType, Title, NoLegend, ShowCategory, ShowPercent, Yrange, Xrange and SeriesHeader for one or more [non-pivot] charts. + A hash table containing ChartType, Title, NoLegend, ShowCategory, ShowPercent, Yrange, Xrange and SeriesHeader for one or more [non-Pivot] charts. .PARAMETER HideSheet - Name(s) of Sheet(s) to hide in the workbook, supports wildcards. If all sheets would be hidden, the sheet being worked on will be revealed. + Name(s) of Sheet(s) to hide in the workbook, supports wildcards. If the selection would cause all sheets to be hidden, the sheet being worked on will be revealed. .PARAMETER UnHideSheet - Name(s) of Sheet(s) to Reveal in the workbook, supports wildcards. + Name(s) of Sheet(s) to reveal in the workbook, supports wildcards. .PARAMETER MoveToStart If specified, the worksheet will be moved to the start of the workbook. -MoveToStart takes precedence over -MoveToEnd, -Movebefore and -MoveAfter if more than one is specified. @@ -126,13 +130,13 @@ .PARAMETER FreezePane Freezes panes at specified coordinates (in the form RowNumber, ColumnNumber). .PARAMETER AutoFilter - Enables the 'Filter' in Excel on the complete header row, so users can easily sort, filter and/or search the data in the selected column from within Excel. + Enables the Excel filter on the complete header row, so users can easily sort, filter and/or search the data in the selected column. .PARAMETER AutoSize Sizes the width of the Excel column to the maximum width needed to display all the containing data in that cell. .PARAMETER Activate - If there is already content in the workbook, a new sheet will not be active UNLESS Activate is specified; if a Pivot table is included it will be the active sheet + If there is already content in the workbook, a new sheet will not be active UNLESS Activate is specified; if a PivotTable is included it will be the active sheet .PARAMETER Now - The 'Now' switch is a shortcut that creates automatically a temporary file, enables 'AutoSize', 'AutoFiler' and 'Show', and opens the file immediately. + The -Now switch is a shortcut that automatically creates a temporary file, enables "AutoSize", "AutoFiler" and "Show", and opens the file immediately. .PARAMETER NumberFormat Formats all values that can be converted to a number to the format specified. @@ -162,7 +166,7 @@ '[Blue]$#,##0.00;[Red]-$#,##0.00' .PARAMETER ReZip - If specified, Export-Excel will expand the contents of the .XLSX file (which is multiple files in a zip archive) and rebuilt it. + If specified, Export-Excel will expand the contents of the .XLSX file (which is multiple files in a zip archive) and rebuild it. .PARAMETER NoClobber Not used. Left in to avoid problems with older scripts, it may be removed in future versions. .PARAMETER CellStyleSB @@ -171,7 +175,7 @@ .PARAMETER Show Opens the Excel file immediately after creation. Convenient for viewing the results instantly without having to search for the file first. .PARAMETER ReturnRange - If specified, Export-Excel returns the range of added cells in the format "A1:Z100" + If specified, Export-Excel returns the range of added cells in the format "A1:Z100". .PARAMETER PassThru If specified, Export-Excel returns an object representing the Excel package without saving the package first. To save, you need to call Close-ExcelPackage or send the object back to Export-Excel, or use its .Save() or SaveAs() method. @@ -190,7 +194,9 @@ Write-Output -1 668 34 777 860 -0.5 119 -0.1 234 788 | Export-Excel @ExcelParams -NumberFormat '[Blue]$#,##0.00;[Red]-$#,##0.00' - Exports all data to the Excel file 'Excel.xslx' and colors the negative values in 'Red' and the positive values in 'Blue'. It will also add a dollar sign '$' in front of the rounded numbers to two decimal characters behind the comma. + Exports all data to the Excel file 'Excel.xslx' and colors the negative values + in Red and the positive values in Blue. It will also add a dollar sign in front + of the numbers which use a thousand seperator and display to two decimal places. .EXAMPLE > @@ -216,7 +222,9 @@ PhoneNr3 = '+3244444444' } | Export-Excel @ExcelParams -NoNumberConversion IPAddress, Number1 - Exports all data to the Excel file 'Excel.xslx' and tries to convert all values to numbers where possible except for 'IPAddress' and 'Number1'. These are stored in the sheet 'as is', without being converted to a number. + Exports all data to the Excel file "Excel.xlsx" and tries to convert all values + to numbers where possible except for "IPAddress" and "Number1", which are + stored in the sheet 'as is', without being converted to a number. .EXAMPLE > @@ -242,7 +250,9 @@ PhoneNr3 = '+3244444444' } | Export-Excel @ExcelParams -NoNumberConversion * - Exports all data to the Excel file 'Excel.xslx' as is, no number conversion will take place. This means that Excel will show the exact same data that you handed over to the 'Export-Excel' function. + Exports all data to the Excel file 'Excel.xslx' as is, no number conversion + will take place. This means that Excel will show the exact same data that + you handed over to the 'Export-Excel' function. .EXAMPLE > @@ -257,9 +267,11 @@ New-ConditionalText -ConditionalType GreaterThan 525 -ConditionalTextColor DarkRed -BackgroundColor LightPink ) - Exports data that will have a 'Conditional formatting rule' in Excel on these cells that will show the background fill color in - 'LightPink' and the text color in 'DarkRed' when the value is greater than '525'. In case this condition is not met the color will - be the default, black text on a white background. + Exports data that will have a Conditional Formatting rule in Excel + that will show cells with a value is greater than 525, whith a + background fill color of "LightPink" and the text in "DarkRed". + Where condition is not met the color willbe the default, black + text on a white background. .EXAMPLE > @@ -275,7 +287,12 @@ New-ConditionalText Running Blue Cyan ) - Export all services to an Excel sheet where all cells have a 'Conditional formatting rule' in Excel that will show the background fill color in 'LightPink' and the text color in 'DarkRed' when the value contains the word 'Stop'. If the value contains the word 'Running' it will have a background fill color in 'Cyan' and a text color 'Blue'. In case none of these conditions are met the color will be the default, black text on a white background. + Exports all services to an Excel sheet, setting a Conditional formatting rule + that will set the background fill color to "LightPink" and the text color + to "DarkRed" when the value contains the word "Stop". + If the value contains the word "Running" it will have a background fill + color of "Cyan" and text colored 'Blue'. If neither condition is met, the + color will be the default, black text on a white background. .EXAMPLE > @@ -310,7 +327,8 @@ $Array | Out-GridView -Title 'Not showing Member3 and Member4' $Array | Update-FirstObjectProperties | Export-Excel @ExcelParams -WorksheetName Numbers - Updates the first object of the array by adding property 'Member3' and 'Member4'. Afterwards. all objects are exported to an Excel file and all column headers are visible. + Updates the first object of the array by adding property 'Member3' and 'Member4'. + Afterwards. all objects are exported to an Excel file and all column headers are visible. .EXAMPLE Get-Process | Export-Excel .\test.xlsx -WorksheetName Processes -IncludePivotTable -Show -PivotRows Company -PivotData PM @@ -341,10 +359,10 @@ Get-Process | Select-Object -Property Name,Company,Handles,CPU,VM | Export-Excel -Path .\test.xlsx -AutoSize -WorksheetName 'sheet2' Export-Excel -Path .\test.xlsx -PivotTableDefinition $pt -Show - This example defines two pivot tables. Then it puts Service data on Sheet1 with one call to Export-Excel and Process Data on sheet2 with a second call to Export-Excel. - The third and final call adds the two pivot tables and opens the spreadsheet in Excel. - - + This example defines two PivotTables. Then it puts Service data on Sheet1 + with one call to Export-Excel and Process Data on sheet2 with a second + call to Export-Excel. The third and final call adds the two PivotTables + and opens the spreadsheet in Excel. .EXAMPLE > PS> Remove-Item -Path .\test.xlsx @@ -356,8 +374,11 @@ $excel.Dispose() Start-Process .\test.xlsx - This example uses -passthrough. It puts service information into sheet1 of the workbook and saves the ExcelPackageObject in $Excel. - It then uses the package object to apply formatting, and then saves the workbook and disposes of the object before loading the document in Excel. + This example uses -PassThru. It puts service information into sheet1 of the + workbook and saves the ExcelPackage object in $Excel. It then uses the package + object to apply formatting, and then saves the workbook and disposes of the object + before loading the document in Excel. Other commands in the module remove the need + to work directly with the package object in this way. .EXAMPLE > @@ -375,12 +396,13 @@ foreach ($c in 5..9) {Set-ExcelRange -Address $sheet.Column($c) -AutoFit } Export-Excel -ExcelPackage $excel -WorksheetName "Processes" -IncludePivotChart -ChartType ColumnClustered -NoLegend -PivotRows company -PivotData @{'Name'='Count'} -Show - This a more sophisticated version of the previous example showing different ways of using Set-ExcelRange, and also adding conditional formatting. - In the final command a Pivot chart is added and the workbook is opened in Excel. + This a more sophisticated version of the previous example showing different + ways of using Set-ExcelRange, and also adding conditional formatting. + In the final command a PivotChart is added and the workbook is opened in Excel. .EXAMPLE 0..360 | ForEach-Object {[pscustomobject][ordered]@{X=$_; Sinx="=Sin(Radians(x)) "} } | Export-Excel -now -LineChart -AutoNameRange - Creates a line chart showing the value of Sine(x) for values of X between 0 and 360 degrees. + Creates a line chart showing the value of Sine(x) for values of x between 0 and 360 degrees. .LINK https://github.com/dfinke/ImportExcel #> @@ -472,12 +494,12 @@ [Object[]]$ConditionalFormat, [Object[]]$ConditionalText, [ScriptBlock]$CellStyleSB, - #If there is already content in the workbook the sheet with the Pivot table will not be active UNLESS Activate is specified + #If there is already content in the workbook the sheet with the PivotTable will not be active UNLESS Activate is specified [switch]$Activate, [Parameter(ParameterSetName = 'Now')] [Switch]$Now, [Switch]$ReturnRange, - #By default Pivot tables have Totals for each Row (on the right) and for each column at the bottom. This allows just one or neither to be selected. + #By default PivotTables have Totals for each Row (on the right) and for each column at the bottom. This allows just one or neither to be selected. [ValidateSet("Both","Columns","Rows","None")] [String]$PivotTotals = "Both", #Included for compatibility - equivalent to -PivotTotals "None" @@ -823,7 +845,7 @@ 'SourceRange' = $dataRange } if ($PivotTableName -and ($pkg.workbook.worksheets.tables.name -contains $PivotTableName)) { - Write-Warning -Message "The selected Pivot table name '$PivotTableName' is already used as a table name. Adding a suffix of 'Pivot'." + Write-Warning -Message "The selected PivotTable name '$PivotTableName' is already used as a table name. Adding a suffix of 'Pivot'." $PivotTableName += 'Pivot' } @@ -991,7 +1013,7 @@ Write-Verbose -Message "Added conditional formatting to range $($c.range)" } elseif ($c -is [hashtable] -or $c -is[System.Collections.Specialized.OrderedDictionary]) { - if (-not $c.Range) {$c.Range = $ws.Dimension.Address } + if (-not $c.Range -or $c.Address) {$c.Address = $ws.Dimension.Address } Add-ConditionalFormatting -WorkSheet $ws @c } } @@ -1173,7 +1195,7 @@ function Select-Worksheet { Sets the selected tab in an Excel workbook to be the chosen sheet and unselects all the others. .DESCRIPTION Sometimes when a sheet is added we want it to be the active sheet, sometimes we want the active sheet to be left as it was. - Select-Worksheet exists to change the which sheet is the selected tab when Excel opens the file. + Select-Worksheet exists to change which sheet is the selected tab when Excel opens the file. .EXAMPLE Select-Worksheet -ExcelWorkbook $ExcelWorkbook -WorksheetName "NewSheet" $ExcelWorkbook holds a workbook object containing a sheet named "NewSheet"; @@ -1184,10 +1206,11 @@ function Select-Worksheet { This sheet will become the [only] active sheet in the workbook. .EXAMPLE Select-Worksheet -ExcelWorksheet $ws - $ws holds an Excel worksheet which will become the [only] active sheet in the workbook. + $ws holds an Excel worksheet which will become the [only] active sheet + in its workbook. #> param ( - #An object representing an Excel Package. + #An object representing an ExcelPackage. [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'Package', Position = 0)] [OfficeOpenXml.ExcelPackage]$ExcelPackage, #An Excel workbook to which the Worksheet will be added - a package contains one Workbook so you can use workbook or package as it suits. @@ -1195,7 +1218,7 @@ function Select-Worksheet { [OfficeOpenXml.ExcelWorkbook]$ExcelWorkbook, [Parameter(ParameterSetName='Package')] [Parameter(ParameterSetName='Workbook')] - #The name of the worksheet 'Sheet1' by default. + #The name of the worksheet "Sheet1" by default. [string]$WorksheetName, #An object representing an Excel worksheet. [Parameter(ParameterSetName='Sheet',Mandatory=$true)] diff --git a/Join-Worksheet.ps1 b/Join-Worksheet.ps1 index 7a4f92d..8f5d5c5 100644 --- a/Join-Worksheet.ps1 +++ b/Join-Worksheet.ps1 @@ -3,10 +3,13 @@ .SYNOPSIS Combines data on all the sheets in an Excel worksheet onto a single sheet. .DESCRIPTION - Join worksheet can work in two main ways: - Either Combining data which has the same layout from many pages into one, or combining pages which have nothing in common. - In the former case the header row is copied from the first sheet and, by default, each row of data is labelled with the name of the sheet it came from. - In the latter case -NoHeader is specified, and each copied block can have the sheet it came from placed above it as a title. + Join-Worksheet can work in two main ways, either + Combining data which has the same layout from many pages into one, or + combining pages which have nothing in common. + In the former case the header row is copied from the first sheet and, + by default, each row of data is labelled with the name of the sheet it came from. + In the latter case -NoHeader is specified, and each copied block can have the + sheet it came from placed above it as a title. .EXAMPLE > PS> foreach ($computerName in @('Server1', 'Server2', 'Server3', 'Server4')) { @@ -16,11 +19,15 @@ PS> $ptDef =New-PivotTableDefinition -PivotTableName "Pivot1" -SourceWorkSheet "Combined" -PivotRows "Status" -PivotFilter "MachineName" -PivotData @{Status='Count'} -IncludePivotChart -ChartType BarClustered3D PS> Join-Worksheet -Path .\test.xlsx -WorkSheetName combined -FromLabel "MachineName" -HideSource -AutoSize -FreezeTopRow -BoldTopRow -PivotTableDefinition $pt -Show - The foreach command gets the services running on four servers and exports each to its own page in Test.xlsx. - $PtDef= creates a defintion for a PivotTable. - The Join-Worksheet command uses the same file and merges the results onto a sheet named "Combined". It sets a column header of "Machinename", - this column will contain the name of the sheet the data was copied from; after copying the data to the sheet "combined", the other sheets will be hidden. - Join-Worksheet finishes by calling Export-Excel to AutoSize cells, freeze the top row and make it bold and add the Pivot table. + The foreach command gets the services running on four servers and exports each + to its own page in Test.xlsx. + $PtDef= creates a definition for a PivotTable. + The Join-Worksheet command uses the same file and merges the results into a sheet + named "Combined". It sets a column header of "Machinename", this column will + contain the name of the sheet the data was copied from; after copying the data + to the sheet "Combined", the other sheets will be hidden. + Join-Worksheet finishes by calling Export-Excel to AutoSize cells, freeze the + top row and make it bold and add thePivotTable. .EXAMPLE > @@ -30,10 +37,14 @@ Export-Excel -Path "$env:COMPUTERNAME.xlsx" -WorkSheetname NetAdapter PS> Join-Worksheet -Path "$env:COMPUTERNAME.xlsx" -WorkSheetName Summary -Title "Summary" -TitleBold -TitleSize 22 -NoHeader -LabelBlocks -AutoSize -HideSource -show - The first two commands get logical disk and network card information; each type is exported to its own sheet in a workbook. - The Join-Worksheet command copies both onto a page named "Summary". Because the data is disimilar -NoHeader is specified, ensuring the whole of each page is copied. - Specifying -LabelBlocks causes each sheet's name to become a title on the summary page above the copied data. - The source data is hidden, a title is added in 22 point boldface and the columns are sized to fit the data. + The first two commands get logical-disk and network-card information; each type + is exported to its own sheet in a workbook. + The Join-Worksheet command copies both onto a page named "Summary". Because + the data is dissimilar, -NoHeader is specified, ensuring the whole of each + page is copied. Specifying -LabelBlocks causes each sheet's name to become + a title on the summary page above the copied data. The source data is + hidden, a title is added in 22 point boldface and the columns are sized + to fit the data. #> [CmdletBinding(DefaultParameterSetName = 'Default')] param ( @@ -41,21 +52,21 @@ [Parameter(ParameterSetName = "Default", Position = 0)] [Parameter(ParameterSetName = "Table" , Position = 0)] [String]$Path , - # An object representing an Excel Package - usually this is returned by specifying -Passthru allowing multiple commands to work on the same Workbook without saving and reloading each time. + # An object representing an Excel Package - either from Open-Excel Package or specifying -PassThru to Export-Excel. [Parameter(Mandatory = $true, ParameterSetName = "PackageDefault")] [Parameter(Mandatory = $true, ParameterSetName = "PackageTable")] [OfficeOpenXml.ExcelPackage]$ExcelPackage, # The name of a sheet within the workbook where the other sheets will be joined together - "Combined" by default. $WorkSheetName = 'Combined', - # If specified any pre-existing target for the joined data will be deleted and re-created; otherwise data will be appended on this sheet. + # If specified ,any pre-existing target for the joined data will be deleted and re-created; otherwise data will be appended on this sheet. [switch]$Clearsheet, #Join-Worksheet assumes each sheet has identical headers and the headers should be copied to the target sheet, unless -NoHeader is specified. [switch]$NoHeader, - #If -NoHeader is NOT specified, then rows of data will be labeled with the name of the sheet they came, FromLabel is the header for this column. If it is null or empty, the labels will be omitted. + #If -NoHeader is NOT specified, then rows of data will be labeled with the name of the sheet they came from. FromLabel is the header for this column. If it is null or empty, the labels will be omitted. $FromLabel = "From" , #If specified, the copied blocks of data will have the name of the sheet they were copied from inserted above them as a title. [switch]$LabelBlocks, - #Sizes the width of the Excel column to the maximum width needed to display all the containing data in that cell. + #Sets the width of the Excel columns to display all the data in their cells. [Switch]$AutoSize, #Freezes headers etc. in the top row. [Switch]$FreezeTopRow, @@ -65,13 +76,13 @@ [Switch]$FreezeTopRowFirstColumn, # Freezes panes at specified coordinates (in the form RowNumber , ColumnNumber). [Int[]]$FreezePane, - #Enables the 'Filter' in Excel on the complete header row. So users can easily sort, filter and/or search the data in the select column from within Excel. + #Enables the Excel filter on the headers of the combined sheet. [Parameter(ParameterSetName = 'Default')] [Parameter(ParameterSetName = 'PackageDefault')] [Switch]$AutoFilter, - #Makes the top Row boldface. + #Makes the top row boldface. [Switch]$BoldTopRow, - #If Specified hides the sheets that the data is copied from. + #If specified, hides the sheets that the data is copied from. [switch]$HideSource, #Text of a title to be placed in Cell A1. [String]$Title, @@ -83,7 +94,7 @@ [Switch]$TitleBold, #Sets the point size for the title. [Int]$TitleSize = 22, - #Hashtable(s) with Sheet PivotRows, PivotColumns, PivotData, IncludePivotChart and ChartType values to specify a definition for one or more pivot table(s). + #Hashtable(s) with Sheet PivotRows, PivotColumns, PivotData, IncludePivotChart and ChartType values to specify a definition for one or morePivotTable(s). [Hashtable]$PivotTableDefinition, #A hashtable containing ChartType, Title, NoLegend, ShowCategory, ShowPercent, Yrange, Xrange and SeriesHeader for one or more [non-pivot] charts. [Object[]]$ExcelChartDefinition, @@ -107,13 +118,13 @@ })] [Parameter(ParameterSetName = 'Table' , Mandatory = $true)] [Parameter(ParameterSetName = 'PackageTable' , Mandatory = $true)] - # Makes the data in the worksheet a table with a name applies a style to it. Name must not contain spaces. + # Makes the data in the worksheet a table with a name and applies a style to it. Name must not contain spaces. [String]$TableName, [Parameter(ParameterSetName = 'Table')] [Parameter(ParameterSetName = 'PackageTable')] - #Selects the style for the named table - defaults to 'Medium6'. + #Selects the style for the named table - defaults to "Medium6". [OfficeOpenXml.Table.TableStyles]$TableStyle = 'Medium6', - #Selects the style for the named table - defaults to 'Medium6'. + #If specified, returns the range of cells in the combined sheet, in the format "A1:Z100". [switch]$ReturnRange, #Opens the Excel file immediately after creation. Convenient for viewing the results instantly without having to search for the file first. [switch]$Show, diff --git a/Merge-worksheet.ps1 b/Merge-worksheet.ps1 index 2c321cd..9f0129a 100644 --- a/Merge-worksheet.ps1 +++ b/Merge-worksheet.ps1 @@ -4,29 +4,36 @@ Merges two Worksheets (or other objects) into a single Worksheet with differences marked up. .Description The Compare-Worksheet command takes two Worksheets and marks differences in the source document, and optionally outputs a grid showing the changes. - By contrast the Merge-Worksheet command takes the Worksheets and combines them into a single sheet showing the old and new data side by side . - Although it is designed to work with Excel data it can work with arrays of any kind of object; so it can be a merge *of* Worksheets, or a merge *to* Worksheet. + By contrast the Merge-Worksheet command takes the Worksheets and combines them into a single sheet showing the old and new data side by side. + Although it is designed to work with Excel data it can work with arrays of any kind of object; so it can be a merge *of* Worksheets, or a merge *to* a Worksheet. .Example - merge-Worksheet "Server54.xlsx" "Server55.xlsx" -WorksheetName services -OutputFile Services.xlsx -OutputSheetName 54-55 -show - The workbooks contain audit information for two servers, one page contains a list of services. This command creates a Worksheet named 54-55 - in a workbook named services which shows all the services and their differences, and opens it in Excel. + Merge-Worksheet "Server54.xlsx" "Server55.xlsx" -WorksheetName services -OutputFile Services.xlsx -OutputSheetName 54-55 -show + The workbooks contain audit information for two servers, one sheet contains + a list of services. This command creates a worksheet named "54-55" in a + workbook named "services.xlsx" which shows all the services and their + differences, and opens the new workbook in Excel. .Example - merge-Worksheet "Server54.xlsx" "Server55.xlsx" -WorksheetName services -OutputFile Services.xlsx -OutputSheetName 54-55 -HideEqual -AddBackgroundColor LightBlue -show - This modifies the previous command to hide the equal rows in the output sheet and changes the color used to mark rows added to the second file. + Merge-Worksheet "Server54.xlsx" "Server55.xlsx" -WorksheetName services -OutputFile Services.xlsx -OutputSheetName 54-55 -HideEqual -AddBackgroundColor LightBlue -show + This modifies the previous command to hide the equal rows in the output + sheet and changes the color used to mark rows added to the second file. .Example - merge-Worksheet -OutputFile .\j1.xlsx -OutputSheetName test11 -ReferenceObject (dir .\ImportExcel\4.0.7) -DifferenceObject (dir .\ImportExcel\4.0.8) -Property Length -Show + Merge-Worksheet -OutputFile .\j1.xlsx -OutputSheetName test11 -ReferenceObject (dir .\ImportExcel\4.0.7) -DifferenceObject (dir .\ImportExcel\4.0.8) -Property Length -Show This version compares two directories, and marks what has changed. - Because no "Key" property is given, "Name" is assumed to be the key and the only other property examined is length. - Files which are added or deleted or have changed size will be highlighed in the output sheet. Changes to dates or other attributes will be ignored. + Because no "Key" property is given, "Name" is assumed to be the key + and the only other property examined is length. Files which are added + or deleted or have changed size will be highlighed in the output sheet. + Changes to dates or other attributes will be ignored. .Example - merge-Worksheet -RefO (dir .\ImportExcel\4.0.7) -DiffO (dir .\ImportExcel\4.0.8) -Pr Length | Out-GridView - This time no file is written and the results -which include all properties, not just length, are output and sent to Out-Gridview. - This version uses aliases to shorten the parameters, - (OutputFileName can be "outFile" and the sheet "OutSheet" : DifferenceObject & ReferenceObject can be DiffObject & RefObject). + Merge-Worksheet -RefO (dir .\ImportExcel\4.0.7) -DiffO (dir .\ImportExcel\4.0.8) -Pr Length | Out-GridView + This time no file is written and the results - which include all properties, + not just length, are output and sent to Out-Gridview. This version uses + aliases to shorten the parameters, (OutputFileName can be "outFile" and + the Sheet can be"OutSheet"; DifferenceObject & ReferenceObject can be + DiffObject & RefObject respectively). #> [cmdletbinding(SupportsShouldProcess=$true)] Param( - #First Excel file to compare. You can compare two Excel files or two other objects but not one of each. + #First Excel file to compare. You can compare two Excel files or two other objects or a reference obhct against a difference file, but not a reference file against an object. [parameter(ParameterSetName='A',Mandatory=$true,Position=0)] #A = Compare two files default headers [parameter(ParameterSetName='B',Mandatory=$true,Position=0)] #B = Compare two files user supplied headers [parameter(ParameterSetName='C',Mandatory=$true,Position=0)] #C = Compare two files headers P1, P2, P3 etc @@ -36,12 +43,12 @@ [parameter(ParameterSetName='A',Mandatory=$true,Position=1)] [parameter(ParameterSetName='B',Mandatory=$true,Position=1)] [parameter(ParameterSetName='C',Mandatory=$true,Position=1)] - [parameter(ParameterSetName='E',Mandatory=$true,Position=1)] #D Compat two objects; E = Compare one object one file that uses default headers + [parameter(ParameterSetName='E',Mandatory=$true,Position=1)] #D Compare two objects; E = Compare one object one file that uses default headers [parameter(ParameterSetName='F',Mandatory=$true,Position=1)] #F = Compare one object one file that uses user supplied headers [parameter(ParameterSetName='G',Mandatory=$true,Position=1)] #G Compare one object one file that uses headers P1, P2, P3 etc $Differencefile , - #Name(s) of Worksheets to compare, + #Name(s) of Worksheets to compare. [parameter(ParameterSetName='A',Position=2)] #Applies to all sets EXCEPT D which is two objects (no sheets) [parameter(ParameterSetName='B',Position=2)] [parameter(ParameterSetName='C',Position=2)] @@ -59,12 +66,12 @@ [parameter(ParameterSetName='G')] [int]$Startrow = 1, - #Specifies custom property names to use, instead of the values defined in the column headers of the TopRow. + #Specifies custom property names to use, instead of the values defined in the column headers of the Start ROw. [Parameter(ParameterSetName='B',Mandatory=$true)] #Compare object + sheet or 2 sheets with user supplied headers [Parameter(ParameterSetName='F',Mandatory=$true)] [String[]]$Headername, - #Automatically generate property names (P1, P2, P3, ..) instead of the using the values the top row of the sheet. + #Automatically generate property names (P1, P2, P3, ..) instead of using the values the top row of the sheet. [Parameter(ParameterSetName='C',Mandatory=$true)] #Compare object + sheet or 2 sheets with headers of P1, P2, P3 ... [Parameter(ParameterSetName='G',Mandatory=$true)] [switch]$NoHeader, @@ -108,9 +115,9 @@ [System.Drawing.Color]$DeleteBackgroundColor = [System.Drawing.Color]::LightPink, #Sets the background color for rows not in the reference but added to the difference sheet. [System.Drawing.Color]$AddBackgroundColor = [System.Drawing.Color]::PaleGreen, - #if Specified hides the rows in the spreadsheet that are equal and only shows changes, added or deleted rows. + #if specified, hides the rows in the spreadsheet that are equal and only shows changes, added or deleted rows. [switch]$HideEqual , - #If specified outputs the data to the pipeline (you can add -whatif so it the command only outputs to the pipeline). + #If specified, outputs the data to the pipeline (you can add -WhatIf so the command only outputs to the pipeline). [switch]$Passthru , #If specified, opens the output workbook. [Switch]$Show @@ -311,39 +318,59 @@ Function Merge-MultipleSheets { .Synopsis Merges Worksheets into a single Worksheet with differences marked up. .Description - The Merge Worksheet command combines 2 sheets. Merge-MultipleSheets is designed to merge more than 2. - So if asked to merge sheets A,B,C which contain Services, with a Name, Displayname and Start mode, where "name" is treated as the key - Merge-MultipleSheets calls Merge-Worksheet to merge Name, Displayname and Start mode, from sheets A and C - the result has column headings -Row, Name, DisplayName, Startmode, C-DisplayName, C-StartMode C-Is, C-Row - Merge-MultipleSheets then calls Merge-Worsheet with this result and sheet B, comparing 'Name', 'Displayname' and 'Start mode' columns on each side - which outputs _Row, Name, DisplayName, Startmode, B-DisplayName, B-StartMode B-Is, B-Row, C-DisplayName, C-StartMode C-Is, C-Row - Any columns in the "reference" side which are not used in the comparison are appended on the right, which is we compare the sheets in reverse order. + The Merge Worksheet command combines two sheets. Merge-MultipleSheets is + designed to merge more than two. So if asked to merge sheets A,B,C which + contain Services, with a Name, Displayname and Start mode, where "Name" is + treated as the key, Merge-MultipleSheets calls Merge-Worksheet to merge + "Name", "Displayname" and "Startmode" from sheets A and C; the result has + column headings "_Row", "Name", "DisplayName", "Startmode", "C-DisplayName", + "C-StartMode", "C-Is" and "C-Row". + Merge-MultipleSheets then calls Merge-Worksheet again passing it the + intermediate result and sheet B, comparing "Name", "Displayname" and + "Start mode" columns on each side, and gets a result with columns "_Row", + "Name", "DisplayName", "Startmode", "B-DisplayName", "B-StartMode", "B-Is", + "B-Row", "C-DisplayName", "C-StartMode", "C-Is" and "C-Row". Any columns on + the "reference" side which are not used in the comparison are added on the + right, which is why we compare the sheets in reverse order. - The "Is" column holds "Same", "Added", "Removed" or "Changed" and is used for conditional formatting in the output sheet (this is hidden by default), - and when the data is written to Excel the "reference" columns, in this case "DisplayName" and "Start" are renamed to reflect their source, - so become "A-DisplayName" and "A-Start". + The "Is" columns hold "Same", "Added", "Removed" or "Changed" and is used for + conditional formatting in the output sheet (these columns are hidden by default), + and when the data is written to Excel the "reference" columns, in this case + "DisplayName" and "Start" are renamed to reflect their source, so become + "A-DisplayName" and "A-Start". - Conditional formatting is also applied to the "key" column (name in this case) so the view can be filtered to rows with changes by filtering this column on color. + Conditional formatting is also applied to the Key column ("Name" in this + case) so the view can be filtered to rows with changes by filtering this + column on color. - Note: the processing order can affect what is seen as a change. For example if there is an extra item in sheet B in the example above, - Sheet C will be processed and that row and will not be seen to be missing. When sheet B is processed it is marked as an addition, and the conditional formatting marks - the entries from sheet A to show that a values were added in at least one sheet. - However if Sheet B is the reference sheet, A and C will be seen to have an item removed; - and if B is processed before C, the extra item is known when C is processed and so C is considered to be missing that item. + Note: the processing order can affect what is seen as a change. For example + if there is an extra item in sheet B in the example above, Sheet C will be + processed and that row and will not be seen to be missing. When sheet B is + processed it is marked as an addition, and the conditional formatting marks + the entries from sheet A to show that a values were added in at least one + sheet. However if Sheet B is the reference sheet, A and C will be seen to + have an item removed; and if B is processed before C, the extra item is + known when C is processed and so C is considered to be missing that item. .Example dir Server*.xlsx | Merge-MulipleSheets -WorksheetName Services -OutputFile Test2.xlsx -OutputSheetName Services -Show - We are auditing servers and each one has a workbook in the current directory which contains a "Services" Worksheet (the result of - Get-WmiObject -Class win32_service | Select-Object -Property Name, Displayname, Startmode - No key is specified so the key is assumed to be the "Name" column. The files are merged and the result is opened on completion. + Here we are auditing servers and each one has a workbook in the current + directory which contains a "Services" Worksheet (the result of + Get-WmiObject -Class win32_service | Select-Object -Property Name, Displayname, Startmode) + No key is specified so the key is assumed to be the "Name" column. + The files are merged and the result is opened on completion. .Example dir Serv*.xlsx | Merge-MulipleSheets -WorksheetName Software -Key "*" -ExcludeProperty Install* -OutputFile Test2.xlsx -OutputSheetName Software -Show - The server audit files in the previous example also have "Software" Worksheet, but no single field on that sheet works as a key. - Specifying "*" for the key produces a compound key using all non-excluded fields (and the installation date and file location are excluded). + The server audit files in the previous example also have "Software" worksheet, + but no single field on that sheet works as a key. Specifying "*" for the key + produces a compound key using all non-excluded fields (and the installation + date and file location are excluded). .Example Merge-MulipleSheets -Path hotfixes.xlsx -WorksheetName Serv* -Key hotfixid -OutputFile test2.xlsx -OutputSheetName hotfixes -HideRowNumbers -Show - This time all the servers have written their hofix information to their own Worksheets in a shared Excel workbook named "Hotfixes" - (the information was obtained by running Get-Hotfix | Sort-Object -Property description,hotfixid | Select-Object -Property Description,HotfixID) - This ignores any sheets which are not named "Serv*", and uses the HotfixID as the key ; in this version the row numbers are hidden. + This time all the servers have written their hotfix information to their own + worksheets in a shared Excel workbook named "Hotfixes.xlsx" (the information was + obtained by running Get-Hotfix | Sort-Object -Property description,hotfixid | Select-Object -Property Description,HotfixID) + This ignores any sheets which are not named "Serv*", and uses the HotfixID as + the key; in this version the row numbers are hidden. #> [cmdletbinding()] #[Alias("Merge-MulipleSheets")] #There was a spelling error in the first release. This was there to ensure things didn't break but intelisense gave the alias first. @@ -351,30 +378,30 @@ Function Merge-MultipleSheets { #Paths to the files to be merged. [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string[]]$Path , - #The row from where we start to import data, all rows above the StartRow are disregarded. By default this is the first row. + #The row from where we start to import data, all rows above the Start row are disregarded. By default this is the first row. [int]$Startrow = 1, - #Specifies custom property names to use, instead of the values defined in the column headers of the TopRow. + #Specifies custom property names to use, instead of the values defined in the column headers of the Start row. [String[]]$Headername, - #Automatically generate property names (P1, P2, P3, ..) instead of the using the values the top row of the sheet. + #If specified, property names will be automatically generated (P1, P2, P3, ..) instead of using the values from the start row. [switch]$NoHeader, - #Name(s) of Worksheets to compare, + #Name(s) of Worksheets to compare. $WorksheetName = "Sheet1", - #File to write output to + #File to write output to. [Alias('OutFile')] $OutputFile = ".\temp.xlsx", #Name of Worksheet to output - if none specified will use the reference Worksheet name. [Alias('OutSheet')] $OutputSheetName = "Sheet1", - #Properties to include in the DIFF - supports wildcards, default is "*". + #Properties to include in the comparison - supports wildcards, default is "*". $Property = "*" , - #Properties to exclude from the the search - supports wildcards. + #Properties to exclude from the the comparison - supports wildcards. $ExcludeProperty , - #Name of a column which is unique used to pair up rows from the refence and difference side, default is "Name". + #Name of a column which is unique used to pair up rows from the reference and difference sides, default is "Name". $Key = "Name" , - #Sets the font color for the "key" field; this means you can filter by color to get only changed rows. + #Sets the font color for the Key field; this means you can filter by color to get only changed rows. [System.Drawing.Color]$KeyFontColor = [System.Drawing.Color]::Red, #Sets the background color for changed rows. [System.Drawing.Color]$ChangeBackgroundColor = [System.Drawing.Color]::Orange, @@ -382,9 +409,9 @@ Function Merge-MultipleSheets { [System.Drawing.Color]$DeleteBackgroundColor = [System.Drawing.Color]::LightPink, #Sets the background color for rows not in the reference but added to the difference sheet. [System.Drawing.Color]$AddBackgroundColor = [System.Drawing.Color]::Orange, - #if Specified hides the columns in the spreadsheet that contain the row numbers + #If specified, hides the columns in the spreadsheet that contain the row numbers. [switch]$HideRowNumbers , - #If specified outputs the data to the pipeline (you can add -whatif so it the command only outputs to the command) + #If specified, outputs the data to the pipeline (you can add -whatif so it the command only outputs to the pipeline). [switch]$Passthru , #If specified, opens the output workbook. [Switch]$Show diff --git a/New-ConditionalFormattingIconSet.ps1 b/New-ConditionalFormattingIconSet.ps1 index 1b425af..49ad983 100644 --- a/New-ConditionalFormattingIconSet.ps1 +++ b/New-ConditionalFormattingIconSet.ps1 @@ -1,16 +1,16 @@ function New-ConditionalFormattingIconSet { <# .SYNOPSIS - Creates an object which describes a conditional formatting rule a for 3,4 or 5 icon set + Creates an object which describes a conditional formatting rule a for 3,4 or 5 icon set. .DESCRIPTION Export-Excel takes a -ConditionalFormat parameter which can hold one or more descriptions for conditional formats; - this command builds the + this command builds the defintion of a Conditional formatting rule for an icon set. .PARAMETER Range - The range of cells that the conditional format applies to + The range of cells that the conditional format applies to. .PARAMETER ConditionalFormat The type of rule: one of "ThreeIconSet","FourIconSet" or "FiveIconSet" .PARAMETER IconType - The name of an iconSet - different icons are available depending on whether 3,4 or 5 icon set is selected + The name of an iconSet - different icons are available depending on whether 3,4 or 5 icon set is selected. .PARAMETER Reverse Use the icons in the reverse order. .Example @@ -18,9 +18,11 @@ function New-ConditionalFormattingIconSet { $cfdef = New-ConditionalFormattingIconSet -Range $cfrange -ConditionalFormat ThreeIconSet -IconType Arrows Export-Excel -ExcelPackage $excel -ConditionalFormat $cfdef -show - The first line creates a range - one column wide in the column $column, running from $topRow to $lastDataRow. - The second creates a definition object using this range - and the third uses Export-Excel with an open package to apply the format and save and open the file. + The first line creates a range - one column wide in the column $column, running + from $topRow to $lastDataRow. + The second line creates a definition object using this range + and the third uses Export-Excel with an open package to apply the format and + save and open the file. .Link Add-Add-ConditionalFormatting New-ConditionalText diff --git a/New-ConditionalText.ps1 b/New-ConditionalText.ps1 index d3f14e2..e33aa19 100644 --- a/New-ConditionalText.ps1 +++ b/New-ConditionalText.ps1 @@ -5,7 +5,7 @@ function New-ConditionalText { .DESCRIPTION Some Conditional formatting rules don't apply styles to a cell (IconSets and Databars). Some take two parameters (Between). - Some take none (ThisWeek , containsErrors, AboveAverage etc). + Some take none (ThisWeek, ContainsErrors, AboveAverage etc). The others take a single parameter (Top, BottomPercent, GreaterThan, Contains etc). This command creates an object to describe the last two categories, which can then be passed to Export-Excel. .PARAMETER Range @@ -13,26 +13,31 @@ function New-ConditionalText { .PARAMETER ConditionalType One of the supported rules; by default "ContainsText" is selected. .PARAMETER Text - The text (or other value) to use in the rule. Not that Equals, GreaterThan/LessThan rules require text to wrapped in double quotes. + The text (or other value) to use in the rule. Note that Equals, GreaterThan/LessThan rules require text to wrapped in double quotes. .PARAMETER ConditionalTextColor - The font color for the cell - by default: Dark red. + The font color for the cell - by default: "DarkRed". .PARAMETER BackgroundColor - The fill color for the cell - by default: Light pink. + The fill color for the cell - by default: "LightPink". .PARAMETER PatternType - The Background pattern for the cell - by default: Solid + The background pattern for the cell - by default: "Solid" .EXAMPLE + > $ct = New-ConditionalText -Text 'Ferrari' Export-Excel -ExcelPackage $excel -ConditionalTest $ct -show - The first line creates a definition object which will highlight the word "Ferrari" in any cell. - and the second uses Export-Excel with an open package to apply the format and save and open the file. + The first line creates a definition object which will highlight the word + "Ferrari" in any cell. and the second uses Export-Excel with an open package + to apply the format and save and open the file. .EXAMPLE + > $ct = New-ConditionalText -Text "Ferrari" $ct2 = New-ConditionalText -Range $worksheet.Names["FinishPosition"].Address -ConditionalType LessThanOrEqual -Text 3 -ConditionalTextColor Red -BackgroundColor White Export-Excel -ExcelPackage $excel -ConditionalText $ct,$ct2 -show - This builds on the previous example, and specifies a condition of <=3 with a format of Red text on a white background; this applies to a named range "Finish Position" - the range could be written "C:C" to specify a named column, or "C2:C102" to specify certain cells in the column. + This builds on the previous example, and specifies a condition of <=3 with + a format of red text on a white background; this applies to a named range + "Finish Position". The range could be written "C:C" to specify a named + column, or "C2:C102" to specify certain cells in the column. .Link Add-Add-ConditionalFormatting New-ConditionalFormattingIconSet diff --git a/New-ExcelChart.ps1 b/New-ExcelChart.ps1 index 485595a..43b4307 100644 --- a/New-ExcelChart.ps1 +++ b/New-ExcelChart.ps1 @@ -4,8 +4,8 @@ Creates a Definition of a chart which can be added using Export-Excel, or Add-PivotTable .DESCRIPTION All the parameters which are passed to Add-ExcelChart can be added to an object and - passed to Export-Excel with the -ExcelChartDefinition parameter, - or to Add-PivotTable with the -PivotChartDefinition parameter. + passed to Export-Excel with the -ExcelChartDefinition parameter, + or to Add-PivotTable with the -PivotChartDefinition parameter. This command sets up those definitions. .PARAMETER Title The title for the chart. @@ -20,23 +20,23 @@ .PARAMETER YRange The range(s) of cells holding values for the Y-Axis - usually "data". .PARAMETER Width - Width of the chart in Pixels. Defaults to 500. + Width of the chart in pixels. Defaults to 500. .PARAMETER Height - Height of the chart in Pixels. Defaults to 350. + Height of the chart in pixels. Defaults to 350. .PARAMETER Row Row position of the top left corner of the chart. 0 places at the top of the sheet, 1 below row 1 and so on. .PARAMETER RowOffSetPixels - Offset to position the chart by a fraction of of a row. + Offset to position the chart by a fraction of a row. .PARAMETER Column Column position of the top left corner of the chart. 0 places at the edge of the sheet 1 to the right of column A and so on. .PARAMETER ColumnOffSetPixels - Offset to position the chart by a fraction of of a column. + Offset to position the chart by a fraction of a column. .PARAMETER NoLegend - If specified, turns of display of the key. If you only have one data series it may be preferable to use the title to say what the chart is. + If specified, turns off display of the key. If you only have one data series it may be preferable to use the title to say what the chart is. .PARAMETER SeriesHeader - Specify explicit name(s) for the data series, which will appear in the legend/key + Specifies explicit name(s) for the data series, which will appear in the legend/key .PARAMETER LegendPosition - Location of the key, either left, right, top, bottom or TopRight. + Location of the key, either "Left", "Right", "Top", "Bottom" or "TopRight". .PARAMETER LegendSize Font size for the key. .PARAMETER LegendBold @@ -62,7 +62,7 @@ .PARAMETER XMinValue Minimum value for the scale along the X-axis. .PARAMETER xAxisPosition - Postion for the X-axis (Top or Bottom). + Position for the X-axis ("Top" or" Bottom"). .PARAMETER YAxisTitleText Specifies a title for the Y-axis. .PARAMETER YAxisTitleBold @@ -80,7 +80,7 @@ .PARAMETER YMinValue Minimum value on the Y-axis. .PARAMETER YAxisPosition - Postion for the Y-axis (Left or Right). + Position for the Y-axis ("Left" or "Right"). .PARAMETER Header No longer used. This may be removed in future versions. .Example @@ -92,7 +92,8 @@ 0..360 | ForEach-Object {[pscustomobject][ordered]@{x = $_; Sinx = "=Sin(Radians(x)) "}} | Export-Excel -AutoNameRange -now -WorkSheetname SinX -ExcelChartDefinition $cDef -Show - This reworks an example from Add-Excel-Chart but here the chart definition is defined and then it is used in a call to Export-Excel. + This reworks an example from Add-Excel-Chart but here the chart is defined + and the defintion stored in $cDef and then Export-Excel uses $cDef . #> [Alias("New-ExcelChart")] #This was the former name. The new name reflects that we are defining a chart, not making one in the workbook. [cmdletbinding()] @@ -312,15 +313,15 @@ function Add-ExcelChart { -SeriesHeader "Sin(x)" -LegendSize 8 -legendBold -LegendPosition Bottom Close-ExcelPackage $Excel -Show - The first line puts numbers from 0 to 360 into a sheet, as the first column, and + The first line puts numbers from 0 to 360 into a sheet, as the first column, and a formula to calculate the Sine of that number of number of degrees in the second column. It creates named-ranges for the two columns - "X" and "SinX" respectively - The Add-ExcelChart command adds a chart to that worksheet, specifying a line chart + The Add-ExcelChart command adds a chart to that worksheet, specifying a line chart with the X values coming from named-range "X" and the Y values coming from named-range "SinX". The chart has a title, and is positioned to the right of column 2 and sized 800 pixels wide - The X-axis is labelled "Degrees", in bold 12 point type and runs from 0 to 361 with labels every 30, + The X-axis is labelled "Degrees", in bold 12 point type and runs from 0 to 361 with labels every 30, and minor tick marks every 10. Degrees are shown padded to 3 digits. - The Y-axis is labelled "Sine" and to allow some room above and below its scale runs from -1.25 to 1.25, + The Y-axis is labelled "Sine" and to allow some room above and below its scale runs from -1.25 to 1.25, and is marked off in units of 0.25 shown to two decimal places. The key will for the chart will be at the bottom in 8 point bold type and the line will be named "Sin(x)". #> diff --git a/Open-ExcelPackage.ps1 b/Open-ExcelPackage.ps1 index 4b078eb..3c5a7b2 100644 --- a/Open-ExcelPackage.ps1 +++ b/Open-ExcelPackage.ps1 @@ -1,19 +1,22 @@ Function Open-ExcelPackage { <# .Synopsis - Returns an Excel Package Object for the specified XLSX file + Returns an ExcelPackage object for the specified XLSX fil.e .Description Import-Excel and Export-Excel open an Excel file, carry out their tasks and close it again. - Sometimes it is necessary to open a file and do other work on it. Open-Excel package allows the file to be opened for these tasks. - It takes a KillExcel switch to make sure Excel is not holding the file open; a password parameter for existing protected files, - and a create switch to set-up a new file if no file already exists. + Sometimes it is necessary to open a file and do other work on it. + Open-ExcelPackage allows the file to be opened for these tasks. + It takes a -KillExcel switch to make sure Excel is not holding the file open; + a -Password parameter for existing protected files, + and a -Create switch to set-up a new file if no file already exists. .Example > PS> $excel = Open-ExcelPackage -Path "$env:TEMP\test99.xlsx" -Create $ws = Add-WorkSheet -ExcelPackage $excel - This will create a new file in the temp folder if it doesn't already exist. It then adds a worksheet - - because no name is specified it will use the default name of "Sheet1" + This will create a new file in the temp folder if it doesn't already exist. + It then adds a worksheet - because no name is specified it will use the + default name of "Sheet1" .Example > PS> $excel = Open-ExcelPackage -path "$xlPath" -Password $password @@ -21,20 +24,21 @@ Set-ExcelRange -Range $sheet1.Cells["E1:S1048576"], $sheet1.Cells["V1:V1048576"] -NFormat ([cultureinfo]::CurrentCulture.DateTimeFormat.ShortDatePattern) Close-ExcelPackage $excel -Show - This will open the password protected file at $xlPath using the password stored in $Password. - Sheet1 is selected and formatting applied to two blocks of the sheet; then the file is and saved and loaded into Excel. + This will open the password protected file at $xlPath using the password stored + in $Password. Sheet1 is selected and formatting applied to two blocks of the sheet; + then the file is and saved and loaded into Excel. #> [CmdLetBinding()] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword","")] [OutputType([OfficeOpenXml.ExcelPackage])] Param ( - #The Path to the file to open + #The path to the file to open. [Parameter(Mandatory=$true)]$Path, #If specified, any running instances of Excel will be terminated before opening the file. [switch]$KillExcel, - #The password for a protected worksheet, as a [normal] string (not a secure string.) + #The password for a protected worksheet, as a [normal] string (not a secure string). [String]$Password, - #By default open only opens an existing file; -Create instructs it to create a new file if required. + #By default Open-ExcelPackage will only opens an existing file; -Create instructs it to create a new file if required. [switch]$Create ) @@ -75,7 +79,7 @@ Function Close-ExcelPackage { .Description When working with an ExcelPackage object, the Workbook is held in memory and not saved until the .Save() method of the package is called. Close-ExcelPackage saves and disposes of the Package object. It can be called with -NoSave to abandon the file without saving, with a new "SaveAs" filename, - and/or with a password to protect the file. And -Show will open the file in Excel; + and/or with a password to protect the file. And -Show will open the file in Excel; -Calculate will try to update the workbook, although not everything can be recalculated .Example Close-ExcelPackage -show $excel diff --git a/Send-SqlDataToExcel.ps1 b/Send-SqlDataToExcel.ps1 index f487acd..a02e467 100644 --- a/Send-SqlDataToExcel.ps1 +++ b/Send-SqlDataToExcel.ps1 @@ -130,16 +130,27 @@ C:\> Send-SQLDataToExcel -MsSQLserver -Connection localhost -SQL "select name,type,type_desc from [master].[sys].[all_objects]" -Path .\temp.xlsx -WorkSheetname master -AutoSize -FreezeTopRow -AutoFilter -BoldTopRow Connects to the local SQL server and selects 3 columns from [Sys].[all_objects] and exports then to a sheet named master with some basic header management + .EXAMPLE + C:\> $SQL="SELECT top 25 Name,Length From TestData ORDER BY Length DESC" + C:\> $Connection = ' Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:\Users\James\Documents\Database1.accdb;' + + C:\> Send-SQLDataToExcel -Connection $connection -SQL $sql -path .\demo1.xlsx -WorkSheetname "Sizes" -AutoSize + + This declares a SQL statement and creates an ODBC connection string to read from an Access file and extracts data from it and sends it to a new worksheet + .EXAMPLE C:\> $SQL="SELECT top 25 DriverName, Count(RaceDate) as Races, Count(Win) as Wins, Count(Pole) as Poles, Count(FastestLap) as Fastlaps FROM Results GROUP BY DriverName ORDER BY (count(win)) DESC" - C:\> $Connection = 'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DriverId=790;ReadOnly=0;Dbq=C:\users\James\Documents\f1Results.xlsx;' - C:\> Send-SQLDataToExcel -Connection $connection -SQL $sql -path .\demo1.xlsx -WorkSheetname "Winners" -AutoSize -AutoNameRange + C:\> $Connection = 'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Dbq=C:\users\James\Documents\f1Results.xlsx;' + + C:\> Send-SQLDataToExcel -Connection $connection -SQL $sql -path .\demo1.xlsx -WorkSheetname "Winners" -AutoSize -AutoNameRange -ConditionalFormat @{DataBarColor="Blue"; Range="Wins"} This declares a SQL statement and creates an ODBC connection string to read from an Excel file, it then runs the statement and outputs the resulting data to a new spreadsheet. + The spreadsheet is formatted and a data bar added to show make the drivers' wins clearer. (the F1 results database is available from https://1drv.ms/x/s!AhfYu7-CJv4ehNdZWxJE9LMAX_N5sg ) .EXAMPLE C:\> $SQL = "SELECT top 25 DriverName, Count(RaceDate) as Races, Count(Win) as Wins, Count(Pole) as Poles, Count(FastestLap) as Fastlaps FROM Results GROUP BY DriverName ORDER BY (count(win)) DESC" C:\> Get-SQL -Session F1 -excel -Connection "C:\Users\mcp\OneDrive\public\f1\f1Results.xlsx" -sql $sql -OutputVariable Table | out-null + C:\> Send-SQLDataToExcel -DataTable $Table -Path ".\demo3.xlsx" -WorkSheetname Gpwinners -autosize -TableName winners -TableStyle Light6 -show This uses Get-SQL (at least V1.1 - download from the gallery with Install-Module -Name GetSQL - note the function is Get-SQL the module is GetSQL without the "-" ) diff --git a/SetFormat.ps1 b/SetFormat.ps1 index 50b8236..f475bea 100644 --- a/SetFormat.ps1 +++ b/SetFormat.ps1 @@ -291,12 +291,15 @@ if (Get-Command -ErrorAction SilentlyContinue -name Register-ArgumentCompleter) Function Expand-NumberFormat { <# .SYNOPSIS - Converts short names for Number formats to the formatting strings used in Excel + Converts short names for number formats to the formatting strings used in Excel .DESCRIPTION - Where you can type a number format you can write, for example 'Short-Date' and the module will translate it into the format string used by excel - Some formats, like Short-Date change how they are presented when Excel loads. (So date will use the local ordering of year, month and Day) - Other formats change how they appear when loaded with different cultures (depending on the country "," or "." or " " may be the thousand seperator - although excel always stores it as ",") + Where you can type a number format you can write, for example, 'Short-Date' + and the module will translate it into the format string used by Excel. + Some formats, like Short-Date change how they are presented when Excel + loads (so date will use the local ordering of year, month and Day). Other + formats change how they appear when loaded with different cultures + (depending on the country "," or "." or " " may be the thousand seperator + although Excel always stores it as ",") .EXAMPLE Expand-NumberFormat percentage @@ -304,11 +307,15 @@ Function Expand-NumberFormat { .EXAMPLE Expand-NumberFormat Currency - Returns the currency format specified in the local regional settings. This may not be the same as Excel uses - The regional settings set the currency symbol and then whether it is before or after the number and seperated with a space or not; - for negative numbers the number by wrapped in parentheses or a - sign might appear before or after the number and symbol. - So this returns $#,##0.00;($#,##0.00) for English US, #,##0.00 €;€#,##0.00- for French. (Note some Eurozone countries write €1,23 and others 1,23€ ) - In French the decimal point will be rendered as a "," and the thousand seperator as a space. + Returns the currency format specified in the local regional settings. This + may not be the same as Excel uses. The regional settings set the currency + symbol and then whether it is before or after the number and separated with + a space or not; for negative numbers the number may be wrapped in parentheses + or a - sign might appear before or after the number and symbol. + So this returns $#,##0.00;($#,##0.00) for English US, #,##0.00 €;€#,##0.00- + for French. (Note some Eurozone countries write €1,23 and others 1,23€ ) + In French the decimal point will be rendered as a "," and the thousand + separator as a space. #> [cmdletbinding()] [OutputType([String])] diff --git a/compare-worksheet.ps1 b/compare-worksheet.ps1 index 44fefcc..a2430d8 100644 --- a/compare-worksheet.ps1 +++ b/compare-worksheet.ps1 @@ -3,29 +3,37 @@ .Synopsis Compares two worksheets and shows the differences. .Description - This command takes two file names, one or two worksheet name and a name for a key column. - It reads the worksheet from each file and decides the column names. - It builds a hashtable of the key-column values and the rows in which they appear. - It then uses PowerShell's compare object command to compare the sheets (explicity checking - all the column names which have not been excluded). For the difference rows it adds the - row number for the key of that row - we have to add the key after doing the comparison, - otherwise identical rows at diffeent positions in the file will not will be considered to match. + This command takes two file names, one or two worksheet names and a name + for a "key" column. It reads the worksheet from each file and decides the + column names and builds a hashtable of the key-column values and the + rows in which they appear. + It then uses PowerShell's Compare-Object command to compare the sheets + (explicitly checkingall the column names which have not been excluded). + For the difference rows it adds the row number for the key of that row - + we have to add the key after doing the comparison, otherwise identical + rows at different positions in the file will not be considered a match. We also add the name of the file and sheet in which the difference occurs. - If -BackgroundColor is specified the difference rows will be changed to that background in the orginal file. + If -BackgroundColor is specified the difference rows will be changed to + that background in the orginal file. .Example Compare-WorkSheet -Referencefile 'Server56.xlsx' -Differencefile 'Server57.xlsx' -WorkSheetName Products -key IdentifyingNumber -ExcludeProperty Install* | Format-Table - The two workbooks in this example contain the result of redirecting a subset of properties from Get-WmiObject -Class win32_product to Export-Excel. - The command compares the "Products" pages in the two workbooks, but we don't want to register a difference if the software was installed on a - different date or from a different place, and excluding Install* removes InstallDate and InstallSource. - This data doesn't have a "Name" column" so we specify the "IdentifyingNumber" column as the key. + The two workbooks in this example contain the result of redirecting a subset + of properties from Get-WmiObject -Class win32_product to Export-Excel. + The command compares the "Products" pages in the two workbooks, but we + don't want to register a difference if the software was installed on a + different date or from a different place, and excluding Install* removes + InstallDate and InstallSource. This data doesn't have a "Name" column, so + we specify the "IdentifyingNumber" column as the key. The results will be presented as a table. .Example - compare-WorkSheet "Server54.xlsx" "Server55.xlsx" -WorkSheetName Services -GridView + Compare-WorkSheet "Server54.xlsx" "Server55.xlsx" -WorkSheetName Services -GridView - This time two workbooks contain the result of redirecting Get-WmiObject -Class win32_service to Export-Excel. - Here the -Differencefile and -Referencefile parameter switches are assumed , and the default setting for -key ("Name") works for services - This will display the differences between the "Services" sheets using a grid view + This time two workbooks contain the result of redirecting the command + Get-WmiObject -Class win32_service to Export-Excel. Here the -Differencefile + and -Referencefile parameter switches are assumed and the default setting for + -Key ("Name") works for services. This will display the differences between + the "Services" sheets using a grid view .Example Compare-WorkSheet 'Server54.xlsx' 'Server55.xlsx' -WorkSheetName Services -BackgroundColor lightGreen @@ -33,25 +41,32 @@ .Example Compare-WorkSheet 'Server54.xlsx' 'Server55.xlsx' -WorkSheetName Services -BackgroundColor lightGreen -FontColor Red -Show - This example builds on the previous one: this time where two changed rows have the value in the "Name" column (the default value for -Key), - this version adds highlighting of the changed cells in red; and then opens the Excel file. + This example builds on the previous one: this time where two changed rows have + the value in the "Name" column (the default value for -Key), this version adds + highlighting of the changed cells in red; and then opens the Excel file. .Example Compare-WorkSheet 'Pester-tests.xlsx' 'Pester-tests.xlsx' -WorkSheetName 'Server1','Server2' -Property "full Description","Executed","Result" -Key "full Description" - This time the reference file and the difference file are the same file and two different sheets are used. Because the tests include the - machine name and time the test was run the command specifies that a limited set of columns should be used. + This time the reference file and the difference file are the same file and + two different sheets are used. Because the tests include the machine name + and time the test was run, the command specifies that a limited set of + columns should be used. .Example Compare-WorkSheet 'Server54.xlsx' 'Server55.xlsx' -WorkSheetName general -Startrow 2 -Headername Label,value -Key Label -GridView -ExcludeDifferent - The "General" page in the two workbooks has a title and two unlabelled columns with a row each for CPU, Memory, Domain, Disk and so on; - so the command is instructed to start at row 2 in order to skip the title and given names for the columns: the first is "label" and the Second "Value"; - the label acts as the key. This time we interested the rows which are the same in both sheets, - and the result is displayed using grid view. Note that grid view works best when the number of columns is small. + The "General" page in the two workbooks has a title and two unlabelled columns + with a row each for CPU, Memory, Domain, Disk and so on. So the command is + told to start at row 2 in order to skip the title and given names for the + columns: the first is "label" and the second "Value"; the label acts as the key. + This time we are interested in those rows which are the same in both sheets, + and the result is displayed using grid view. + Note that grid view works best when the number of columns is small. .Example Compare-WorkSheet 'Server1.xlsx' 'Server2.xlsx' -WorkSheetName general -Startrow 2 -Headername Label,value -Key Label -BackgroundColor White -Show -AllDataBackgroundColor LightGray - This version of the previous command highlights all the cells in lightgray and then sets the changed rows back to white; - only the unchanged rows are highlighted + This version of the previous command highlights all the cells in LightGray + and then sets the changed rows back to white. + Only the unchanged rows are highlighted. #> [cmdletbinding(DefaultParameterSetName)] Param( @@ -63,9 +78,9 @@ $Differencefile , #Name(s) of worksheets to compare. $WorkSheetName = "Sheet1", - #Properties to include in the DIFF - supports wildcards, default is "*". + #Properties to include in the comparison - supports wildcards, default is "*". $Property = "*" , - #Properties to exclude from the search - supports wildcards. + #Properties to exclude from the comparison - supports wildcards. $ExcludeProperty , #Specifies custom property names to use, instead of the values defined in the starting row of the sheet. [Parameter(ParameterSetName='B', Mandatory)] @@ -75,25 +90,25 @@ [switch]$NoHeader, #The row from where we start to import data: all rows above the start row are disregarded. By default, this is the first row. [int]$Startrow = 1, - #If specified, highlights all the cells - so you can make Equal cells one colour, and Diff cells another. + #If specified, highlights all the cells - so you can make Equal cells one color, and Different cells another. [System.Drawing.Color]$AllDataBackgroundColor, - #If specified, highlights the DIFF rows. + #If specified, highlights the rows with differences. [System.Drawing.Color]$BackgroundColor, - #If specified identifies the tabs which contain DIFF rows (ignored if -BackgroundColor is omitted). + #If specified identifies the tabs which contain difference rows (ignored if -BackgroundColor is omitted). [System.Drawing.Color]$TabColor, #Name of a column which is unique and will be used to add a row to the DIFF object, defaults to "Name". $Key = "Name" , #If specified, highlights the DIFF columns in rows which have the same key. [System.Drawing.Color]$FontColor, - #If specified opens the Excel workbooks instead of outputting the diff to the console (unless -Passthru is also specified). + #If specified, opens the Excel workbooks instead of outputting the diff to the console (unless -PassThru is also specified). [Switch]$Show, - #If specified, the command tries to the show the DIFF in a Grid-View and not on the console. (unless-Passthru is also specified). This Works best with few columns selected, and requires a key. + #If specified, the command tries to the show the DIFF in a Grid-View and not on the console. (unless-PassThru is also specified). This works best with few columns selected, and requires a key. [switch]$GridView, - #If specified -Passthrough a full set of diff data is returned without filtering to the specified properties. + #If specifieda full set of DIFF data is returned without filtering to the specified properties. [Switch]$PassThru, - #If specified the result will include Equal rows as well. By default only Different rows are returned. + #If specified the result will include equal rows as well. By default only different rows are returned. [Switch]$IncludeEqual, - #If Specified the result includes only the rows where both are equal. + #If specified, the result includes only the rows where both are equal. [Switch]$ExcludeDifferent ) @@ -174,7 +189,7 @@ $xl.save() ; $xl.Stream.Close() ; $xl.Dispose() } } - #if font colour was specified, set it on changed properties where the same key appears in both sheets. + #if font color was specified, set it on changed properties where the same key appears in both sheets. if ($diff -and $FontColor -and ($propList -contains $Key) ) { $updates = $diff.where({$_.SideIndicator -ne "=="}) | Group-object -Property $Key | Where-Object {$_.count -eq 2} if ($updates) { From 0fdaeb977bc2bc4e7cb8f1688a1a887880db2c6a Mon Sep 17 00:00:00 2001 From: jhoneill Date: Fri, 19 Oct 2018 11:12:46 +0100 Subject: [PATCH 05/10] Help updates after more proof-reading --- Set-Column.ps1 | 60 +++++++++++++++++++++++++++++--------------------- Set-Row.ps1 | 60 ++++++++++++++++++++++++++++---------------------- SetFormat.ps1 | 43 +++++++++++++++++++++--------------- 3 files changed, 94 insertions(+), 69 deletions(-) diff --git a/Set-Column.ps1 b/Set-Column.ps1 index 2ed2157..0779ef4 100644 --- a/Set-Column.ps1 +++ b/Set-Column.ps1 @@ -1,47 +1,57 @@ Function Set-ExcelColumn { <# .SYNOPSIS - Adds or modifies a column in an Excel sheet, filling values, settings formatting and/or creating named ranges. + Adds or modifies a column in an Excel worksheet, filling values, setting formatting and/or creating named ranges. .DESCRIPTION - Set-ExcelColumn can take a value which is either a 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. + Set-ExcelColumn can take a value which is either a 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 heading can be specified, and the column can be made a named range. The column can be formatted in the same operation. .EXAMPLE Set-ExcelColumn -Worksheet $ws -Column 5 -NumberFormat 'Currency' - $ws contains a worksheet object - and column E is set to use the local currency format. - Intelisense will complete predefined number formats. You can see how currency is interpreted on the local computer with the command + $ws contains a worksheet object - and column "E" is set to use the + local currency format. Intelisense will complete the names of predefined + number formats. You can see how currency is interpreted on the + local computer with the command Expand-NumberFormat currency .EXAMPLE Set-ExcelColumn -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-ExcelColumn specifies that Column 7 should have a heading of "WinsToFastLaps" and the data cells should contain =E2/C2 , =E3/C3 etc - the new data cells should become a named range, which will also be named "WinsToFastLaps" the column width will be set automatically. - .EXAMPLE. + Here, $WS already contains a worksheet which holds counts of races won + and fastest laps recorded by racing drivers (in columns C and E). + Set-ExcelColumn specifies that Column 7 should have a heading of + "WinsToFastLaps" and the data cells should contain =E2/C2 , =E3/C3 etc + the new data cells should become a named range, which will also be + named "WinsToFastLaps" and the column width will be set automatically. + .EXAMPLE Set-ExcelColumn -Worksheet $ws -Heading "Link" -Value {"https://en.wikipedia.org" + $worksheet.cells["B$Row"].value } -AutoSize - In this example, the worksheet in $ws has partial links to wikipedia pages in column B. - The -Value parameter is is a script block and it outputs a string which begins https... and ends with the value of cell at - column B in the current row. When given a valid URI, Set-ExcelColumn makes it a hyperlink. The column will be autosized to fit the links. + In this example, the worksheet in $ws has partial links to Wikipedia + pages in column B. The -Value parameter is a script block which + outputs a string beginning "https..." and ending with the value of + the cell at column B in the current row. + When given a valid URI, Set-ExcelColumn makes it a hyperlink. + The column will be autosized to fit the links. .EXAMPLE 4..6 | Set-ExcelColumn -Worksheet $ws -AutoNameRange - Again $ws contains a worksheet. Here columns 4 to 6 are made into named ranges, row 1 is used for the range name + Again $ws contains a worksheet. Here columns 4 to 6 are made into + named ranges, row 1 is used for the range name and the rest of the column becomes the range. #> [cmdletbinding()] [Alias("Set-Column")] [OutputType([OfficeOpenXml.ExcelColumn],[String])] Param ( - #If specifying the worksheet by name, the ExcelPackage object which contains the Sheet also needs to be passed. + #If specifying the worksheet by name, the ExcelPackage object which contains the worksheet also needs to be passed. [Parameter(ParameterSetName="Package",Mandatory=$true)] [OfficeOpenXml.ExcelPackage]$ExcelPackage, - #The sheet to update can be a given as a name or an Excel Worksheet object - this sets it by name. + #The sheet to update can be given as a name or an Excel Worksheet object - this sets it by name. [Parameter(ParameterSetName="Package")] [String]$Worksheetname = "Sheet1", - #This passes the worksheet object instead of passing a sheet name and a package. + #This passes the worksheet object instead of passing a sheet name and an Excelpackage object. [Parameter(ParameterSetName="sheet",Mandatory=$true)] [OfficeOpenXml.ExcelWorksheet]$Worksheet, #Column to fill down - the first column is 1. 0 will be interpreted as first empty column. @@ -68,9 +78,9 @@ [Switch]$Italic, #Underline the text using the underline style in -UnderlineType; use -Underline:$false to remove underlining. [Switch]$Underline, - #Should Underline use single or double, normal or accounting mode ? the default is single normal. + #Specifies whether underlining should be single or double, normal or accounting mode. The default is "Single". [OfficeOpenXml.Style.ExcelUnderLineType]$UnderLineType = [OfficeOpenXml.Style.ExcelUnderLineType]::Single, - #Strike through text; use -Strikethru:$false to remove Strike through. + #Strike through text; use -StrikeThru:$false to remove strike through. [Switch]$StrikeThru, #Subscript or Superscript (or None). [OfficeOpenXml.Style.ExcelVerticalAlignmentFont]$FontShift, @@ -80,32 +90,32 @@ [float]$FontSize, #Change background color. [System.Drawing.Color]$BackgroundColor, - #Background pattern - Solid by default. + #Background pattern - "Solid" by default. [OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern = [OfficeOpenXml.Style.ExcelFillStyle]::Solid , #Secondary color for background pattern. [Alias("PatternColour")] [System.Drawing.Color]$PatternColor, - #Turn on text wrapping; use -WrapText:$false to turn off word wrapping. + #Turn on Text-Wrapping; use -WrapText:$false to turn off wrapping. [Switch]$WrapText, - #Position cell contents to Left, Right, Center etc. Default is 'General'. + #Position cell contents to Left, Right, Center etc. Default is "General". [OfficeOpenXml.Style.ExcelHorizontalAlignment]$HorizontalAlignment, #Position cell contents to Top, Bottom or Center. [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. + #Attempt to auto-fit cells to the width their contents. [Alias("AutoFit")] [Switch]$AutoSize, - #Set cells to a fixed width, ignored if -Autosize is specified. + #Set cells to a fixed width, ignored if -AutoSize is specified. [float]$Width, #Set the inserted data to be a named range. [Switch]$AutoNameRange, #Hide the column. [Switch]$Hide, - #If Sepecified, returns the range of cells which were affected. + #If specified, returns the range of cells which were affected. [Switch]$Specified, - #If Specified, return the Column to allow further work to be done on it. + #If specified, return an object representing the Column, to allow further work to be done on it. [Switch]$PassThru ) diff --git a/Set-Row.ps1 b/Set-Row.ps1 index 76e761d..e8b4392 100644 --- a/Set-Row.ps1 +++ b/Set-Row.ps1 @@ -1,32 +1,40 @@ Function Set-ExcelRow { <# .Synopsis - Fills values into a [new] row in an Excel spreadsheet. And sets row formats. + Fills values into a [new] row in an Excel spreadsheet, and sets row formats. .Description - Set-ExcelRow 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 e.g. "42", a formula or a script block which is converted into a constant or a formula. + Set-ExcelRow accepts either a Worksheet object or an ExcelPackage 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, + like "42", a formula or a script block which is converted into a + constant or a formula. The first cell of the row can optionally be given a heading. .Example - Set-ExcelRow -Worksheet $ws -Heading Total -Value {"=sum($columnName`2:$columnName$endrow)" } + Set-ExcelRow -Worksheet $ws -Heading Total -Value {"=sum($columnName`2:$columnName$endrow)" } - $Ws contains a worksheet object, and no Row number is specified so Set-ExcelRow will select the next row after the end - of the data in the sheet. The first cell in the row 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 $Worksheet, $Row, $Column (number), $ColumnName (letter), $StartRow/Column and $EndRow/Column + $Ws contains a worksheet object, and no Row number is specified so + Set-ExcelRow will select the next row after the endof the data in + the sheet. The first cell in the row will contain "Total", and + each of the other cells 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 $Worksheet, $Row, $Column (number), + $ColumnName (letter), $StartRow/Column and $EndRow/Column. .Example Set-ExcelRow -Worksheet $ws -Heading Total -HeadingBold -Value {"=sum($columnName`2:$columnName$endrow)" } -NumberFormat 'Currency' -StartColumn 2 -Bold -BorderTop Double -BorderBottom Thin - This builds on the previous example, but this time the label "Total" appears in column 2 and the formula fills from column 3 onwards; - the formula and heading are set in bold face, and the formula is formatted for the local currency, - and given a double line border above and single line border below. + This builds on the previous example, but this time the label "Total" + appears in column 2 and the formula fills from column 3 onwards. + The formula and heading are set in bold face, and the formula is + formatted for the local currency, and given a double line border + above and single line border below. #> [cmdletbinding()] [Alias("Set-Row")] [OutputType([OfficeOpenXml.ExcelRow],[String])] Param ( - #An Excel package object - e.g. from Export-Excel -passthru - requires a sheet name. + #An Excel package object - e.g. from Export-Excel -PassThru - requires a sheet name. [Parameter(ParameterSetName="Package",Mandatory=$true)] [OfficeOpenXml.ExcelPackage]$ExcelPackage, #The name of the sheet to update in the package. @@ -40,20 +48,20 @@ $Row = 0 , #Position in the row to start from. [int]$StartColumn, - #Value, formula or script block to fill in. Script block can use $worksheet, $row, $Column [number], $ColumnName [letter(s)], $startRow, $startColumn, $endRow, $endColumn + #Value, Formula or ScriptBlock to fill in. A ScriptBlock can use $worksheet, $row, $Column [number], $ColumnName [letter(s)], $startRow, $startColumn, $endRow, $endColumn. $Value, - #Optional Row heading. + #Optional row-heading. $Heading , #Set the heading in bold type. [Switch]$HeadingBold, - #Change the size of the heading type. + #Change the font-size of the heading. [Int]$HeadingSize , #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, #Style of border to draw around the row. [OfficeOpenXml.Style.ExcelBorderStyle]$BorderAround, - #Color of the border + #Color of the border. [System.Drawing.Color]$BorderColor=[System.Drawing.Color]::Black, #Style for the bottom border. [OfficeOpenXml.Style.ExcelBorderStyle]$BorderBottom, @@ -63,7 +71,7 @@ [OfficeOpenXml.Style.ExcelBorderStyle]$BorderLeft, #Style for the right border. [OfficeOpenXml.Style.ExcelBorderStyle]$BorderRight, - #Colour for the text - if none specified it will be left as it it is. + #Color for the text - if none specified it will be left as it it is. [System.Drawing.Color]$FontColor, #Make text bold; use -Bold:$false to remove bold. [Switch]$Bold, @@ -71,9 +79,9 @@ [Switch]$Italic, #Underline the text using the underline style in -UnderlineType; use -Underline:$false to remove underlining. [Switch]$Underline, - #Should Underline use single or double, normal or accounting mode : default is single normal. + #Specifies whether underlining should be single or double, normal or accounting mode. The default is "Single". [OfficeOpenXml.Style.ExcelUnderLineType]$UnderLineType = [OfficeOpenXml.Style.ExcelUnderLineType]::Single, - #Strike through text; use -Strikethru:$false to remove Strike through. + #Strike through text; use -StrikeThru:$false to remove strike through. [Switch]$StrikeThru, #Subscript or Superscript (or none). [OfficeOpenXml.Style.ExcelVerticalAlignmentFont]$FontShift, @@ -88,20 +96,20 @@ #Secondary color for background pattern. [Alias("PatternColour")] [System.Drawing.Color]$PatternColor, - #Turn on text wrapping; use -WrapText:$false to turn off word wrapping. + #Turn on Text-Wrapping; use -WrapText:$false to turn off wrapping. [Switch]$WrapText, #Position cell contents to Left, Right, Center etc. default is 'General'. [OfficeOpenXml.Style.ExcelHorizontalAlignment]$HorizontalAlignment, - #Position cell contents to Top Bottom or Center. + #Position cell contents to Top, Bottom or Center. [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 , - #Set cells to a fixed hieght. + #Set cells to a fixed height. [float]$Height, - #Hide the Row. + #Hide the row. [Switch]$Hide, - #If Sepecified returns the range of cells which were affected. + #If sepecified, returns the range of cells which were affected. [Switch]$ReturnRange, #If Specified, return a row object to allow further work to be done. [Switch]$PassThru diff --git a/SetFormat.ps1 b/SetFormat.ps1 index f475bea..b6a3c55 100644 --- a/SetFormat.ps1 +++ b/SetFormat.ps1 @@ -1,27 +1,34 @@ Function Set-ExcelRange { <# .SYNOPSIS - Applies Number, font, alignment and color formatting, values or formulas to a range of Excel Cells. + Applies number, font, alignment and/or color formatting, values or formulas to a range of Excel cells. .DESCRIPTION - Set-ExcelRange was created to set the style elements for a range of cells, this includes - auto-sizing and hiding, setting font elements (Name, Size, Bold, Italic, Underline & UnderlineStyle and Subscript & SuperScript), - font and background colors, borders, text wrapping, rotation, aliginment within cells, and number format. - It was orignally named "Set-Format",but it has been extended to set Values, Formulas and - ArrayFormulas (sometimes called Ctrl-shift-Enter [CSE] formulas); because of this - The name has become Set-ExcelRange - but the old name of Set-Format is preserved as an alias name. + Set-ExcelRange was created to set the style elements for a range of cells, + this includes auto-sizing and hiding, setting font elements (Name, Size, + Bold, Italic, Underline & UnderlineStyle and Subscript & SuperScript), + font and background colors, borders, text wrapping, rotation, alignment + within cells, and number format. + It was orignally named "Set-Format", but it has been extended to set + Values, Formulas and ArrayFormulas (sometimes called Ctrl-shift-Enter + [CSE] formulas); because of this, the name has become Set-ExcelRange + but the old name of Set-Format is preserved as an alias. .EXAMPLE $sheet.Column(3) | Set-ExcelRange -HorizontalAlignment Right -NumberFormat "#,###" -AutoFit - Selects column 3 from a sheet object (within a workbook object, which is a child of the ExcelPackage object) and passes it to Set-ExcelRange - which formats as an integer with comma-separated groups, aligns it right, and auto-fits the column to the contents. + Selects column 3 from a sheet object (within a workbook object, which + is a child of the ExcelPackage object) and passes it to Set-ExcelRange + which formats numbers as a integers with comma-separated groups, + aligns it right, and auto-fits the column to the contents. .EXAMPLE Set-ExcelRange -Range $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NumberFormat "#,###" - Instead of piping the address, this version specifies a block of cells and applies similar formatting. + Instead of piping the address, this version specifies a block of cells + and applies similar formatting. .EXAMPLE Set-ExcelRange $excel.Workbook.Worksheets[1].Tables["Processes"] -Italic - This time instead of specifying a range of cells, a table is selected by name and formatted as italic. + This time instead of specifying a range of cells, a table is selected + by name and formatted as italic. #> [cmdletbinding()] [Alias("Set-Format")] @@ -55,16 +62,16 @@ $Formula, #Specifies formula should be an array formula (a.k.a CSE [ctrl-shift-enter] formula). [Switch]$ArrayFormula, - #Clear Bold, Italic, StrikeThrough and Underline and set colour to black. + #Clear Bold, Italic, StrikeThrough and Underline and set color to Black. [Switch]$ResetFont, #Make text bold; use -Bold:$false to remove bold. [Switch]$Bold, #Make text italic; use -Italic:$false to remove italic. [Switch]$Italic, - #Underline the text using the underline style in -underline type; use -Underline:$false to remove underlining. + #Underline the text using the underline style in -UnderlineType; use -Underline:$false to remove underlining. [Switch]$Underline, - #Should Underline use single or double, normal or accounting mode: the default is single normal. - [OfficeOpenXml.Style.ExcelUnderLineType]$UnderLineType = [OfficeOpenXml.Style.ExcelUnderLineType]::Single, + #Specifies whether underlining should be single or double, normal or accounting mode. The default is "Single". + [OfficeOpenXml.Style.ExcelUnderLineType]$UnderLineType = [OfficeOpenXml.Style.ExcelUnderLineType]::Single, #Strike through text; use -Strikethru:$false to remove Strike through [Switch]$StrikeThru, #Subscript or Superscript (or none). @@ -80,11 +87,11 @@ #Secondary color for background pattern. [Alias("PatternColour")] [System.Drawing.Color]$PatternColor, - #Turn on text wrapping; use -WrapText:$false to turn off word wrapping. + #Turn on Text-Wrapping; use -WrapText:$false to turn off wrapping. [Switch]$WrapText, #Position cell contents to Left, Right, Center etc. default is 'General'. [OfficeOpenXml.Style.ExcelHorizontalAlignment]$HorizontalAlignment, - #Position cell contents to Top Bottom or Center. + #Position cell contents to Top, Bottom or Center. [OfficeOpenXml.Style.ExcelVerticalAlignment]$VerticalAlignment, #Degrees to rotate text. Up to +90 for anti-clockwise ("upwards"), or to -90 for clockwise. [ValidateRange(-90, 90)] @@ -94,7 +101,7 @@ [Switch]$AutoSize, #Set cells to a fixed width (columns or ranges only), ignored if Autosize is specified. [float]$Width, - #Set cells to a fixed hieght (rows or ranges only). + #Set cells to a fixed height (rows or ranges only). [float]$Height, #Hide a row or column (not a range); use -Hidden:$false to unhide. [Switch]$Hidden From dcd730a4d1ccdf892545b65a1d8b76e840f899a6 Mon Sep 17 00:00:00 2001 From: jhoneill Date: Sun, 21 Oct 2018 22:33:59 +0100 Subject: [PATCH 06/10] Fixed stray char in addConditional formatting --- AddConditionalFormatting.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AddConditionalFormatting.ps1 b/AddConditionalFormatting.ps1 index e39f3cd..93fc1ca 100644 --- a/AddConditionalFormatting.ps1 +++ b/AddConditionalFormatting.ps1 @@ -99,7 +99,7 @@ [Alias("Range")] $Address , #The worksheet where the format is to be applied - [OfficeOpenX1ml.ExcelWorksheet]$WorkSheet , + [OfficeOpenXml.ExcelWorksheet]$WorkSheet , #A standard named-rule - Top / Bottom / Less than / Greater than / Contains etc. [Parameter(Mandatory = $true, ParameterSetName = "NamedRule", Position = 1)] [OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType]$RuleType , From c38648a654f05a7bc92319739cff682251d42397 Mon Sep 17 00:00:00 2001 From: jhoneill Date: Mon, 22 Oct 2018 17:21:09 +0100 Subject: [PATCH 07/10] Fix for color not casting strings in PS Core --- AddConditionalFormatting.ps1 | 23 ++++++++++++++--------- Export-Excel.ps1 | 3 ++- Join-Worksheet.ps1 | 3 ++- Merge-worksheet.ps1 | 16 ++++++++-------- New-ConditionalText.ps1 | 4 ++-- Send-SqlDataToExcel.ps1 | 2 +- Set-CellStyle.ps1 | 4 ++-- Set-Column.ps1 | 6 +++--- Set-Row.ps1 | 8 ++++---- SetFormat.ps1 | 14 +++++++++----- compare-worksheet.ps1 | 9 +++++---- 11 files changed, 52 insertions(+), 40 deletions(-) diff --git a/AddConditionalFormatting.ps1 b/AddConditionalFormatting.ps1 index 93fc1ca..05a04d4 100644 --- a/AddConditionalFormatting.ps1 +++ b/AddConditionalFormatting.ps1 @@ -106,11 +106,11 @@ #Text color for matching objects [Parameter(ParameterSetName = "NamedRule")] [Alias("ForegroundColour")] - [System.Drawing.Color]$ForegroundColor, + $ForegroundColor, #Color for databar type charts [Parameter(Mandatory = $true, ParameterSetName = "DataBar")] [Alias("DataBarColour")] - [System.Drawing.Color]$DataBarColor, + $DataBarColor, #One of the three-icon set types (e.g. Traffic Lights) [Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSet")] [OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting3IconsSetType]$ThreeIconsSet, @@ -134,13 +134,13 @@ $ConditionValue2, #Background color for matching items [Parameter(ParameterSetName = "NamedRule")] - [System.Drawing.Color]$BackgroundColor, + $BackgroundColor, #Background pattern for matching items [Parameter(ParameterSetName = "NamedRule")] [OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern = [OfficeOpenXml.Style.ExcelFillStyle]::None , #Secondary color when a background pattern requires it [Parameter(ParameterSetName = "NamedRule")] - [System.Drawing.Color]$PatternColor, + $PatternColor, #Sets the numeric format for matching items [Parameter(ParameterSetName = "NamedRule")] $NumberFormat, @@ -193,10 +193,12 @@ if (-not $worksheet -or $WorkSheet -isnot [OfficeOpenXml.ExcelWorksheet]) {write-warning "You need to provide a worksheet object." ; return} #region create a rule of the right type if ($RuleType -match 'IconSet$') {Write-warning -Message "You cannot configure a Icon-Set rule in this way; please use -$RuleType ." ; return} - if ($PSBoundParameters.ContainsKey("ThreeIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddThreeIconSet($Address , $ThreeIconsSet)} + if ($PSBoundParameters.ContainsKey("DataBarColor" ) ) {if ($DataBarColor -is [string]) {$DataBarColor = [System.Drawing.Color]::$DataBarColor } + $rule = $WorkSheet.ConditionalFormatting.AddDatabar( $Address , $DataBarColor ) + } + elseif ($PSBoundParameters.ContainsKey("ThreeIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddThreeIconSet($Address , $ThreeIconsSet)} elseif ($PSBoundParameters.ContainsKey("FourIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddFourIconSet( $Address , $FourIconsSet )} elseif ($PSBoundParameters.ContainsKey("FiveIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddFiveIconSet( $Address , $FiveIconsSet )} - elseif ($PSBoundParameters.ContainsKey("DataBarColor" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddDatabar( $Address , $DataBarColor )} else {$rule = ($WorkSheet.ConditionalFormatting)."Add$RuleType"($Address ) } if ($Reverse) { if ($rule.type -match 'IconSet$' ) {$rule.reverse = $true} @@ -255,10 +257,13 @@ if ($PSBoundParameters.ContainsKey("Bold" ) ) {$rule.Style.Font.Bold = [boolean]$Bold } if ($PSBoundParameters.ContainsKey("Italic" ) ) {$rule.Style.Font.Italic = [boolean]$Italic } if ($PSBoundParameters.ContainsKey("StrikeThru" ) ) {$rule.Style.Font.Strike = [boolean]$StrikeThru } - if ($PSBoundParameters.ContainsKey("ForeGroundColor" ) ) {$rule.Style.Font.Color.color = $ForeGroundColor } - if ($PSBoundParameters.ContainsKey("BackgroundColor" ) ) {$rule.Style.Fill.BackgroundColor.color = $BackgroundColor } + if ($PSBoundParameters.ContainsKey("ForeGroundColor" ) ) {if ($ForeGroundColor -is [string]) {$ForeGroundColor = [System.Drawing.Color]::$ForeGroundColor } + $rule.Style.Font.Color.color = $ForeGroundColor } + if ($PSBoundParameters.ContainsKey("BackgroundColor" ) ) {if ($BackgroundColor -is [string]) {$BackgroundColor = [System.Drawing.Color]::$BackgroundColor } + $rule.Style.Fill.BackgroundColor.color = $BackgroundColor } if ($PSBoundParameters.ContainsKey("BackgroundPattern") ) {$rule.Style.Fill.PatternType = $BackgroundPattern } - if ($PSBoundParameters.ContainsKey("PatternColor" ) ) {$rule.Style.Fill.PatternColor.color = $PatternColor } + if ($PSBoundParameters.ContainsKey("PatternColor" ) ) {if ($PatternColor -is [string]) {$PatternColor = [System.Drawing.Color]::$PatternColor } + $rule.Style.Fill.PatternColor.color = $PatternColor } #endregion #Allow further tweaking by returning the rule, if passthru specified if ($Passthru) {$rule} diff --git a/Export-Excel.ps1 b/Export-Excel.ps1 index 586b25b..e778fc8 100644 --- a/Export-Excel.ps1 +++ b/Export-Excel.ps1 @@ -428,7 +428,7 @@ [OfficeOpenXml.Style.ExcelFillStyle]$TitleFillPattern = 'Solid', [Switch]$TitleBold, [Int]$TitleSize = 22, - [System.Drawing.Color]$TitleBackgroundColor, + $TitleBackgroundColor, [Switch]$IncludePivotTable, [String]$PivotTableName, [String[]]$PivotRows, @@ -677,6 +677,7 @@ $ws.Cells[$Row, $StartColumn].Style.Font.Bold = $True } if ($TitleBackgroundColor ) { + if ($TitleBackgroundColor -is [string]) {$TitleBackgroundColor = [System.Drawing.Color]::$TitleBackgroundColor } $ws.Cells[$Row, $StartColumn].Style.Fill.PatternType = $TitleFillPattern $ws.Cells[$Row, $StartColumn].Style.Fill.BackgroundColor.SetColor($TitleBackgroundColor) } diff --git a/Join-Worksheet.ps1 b/Join-Worksheet.ps1 index 8f5d5c5..bea36db 100644 --- a/Join-Worksheet.ps1 +++ b/Join-Worksheet.ps1 @@ -89,7 +89,7 @@ #Sets the fill pattern for the title cell. [OfficeOpenXml.Style.ExcelFillStyle]$TitleFillPattern = 'Solid', #Sets the cell background color for the title cell. - [System.Drawing.Color]$TitleBackgroundColor, + $TitleBackgroundColor, #Sets the title in boldface type. [Switch]$TitleBold, #Sets the point size for the title. @@ -149,6 +149,7 @@ if ($TitleBold) {$destinationSheet.Cells[1, 1].Style.Font.Bold = $True } #Can only set TitleBackgroundColor if TitleFillPattern is something other than None. if ($TitleBackgroundColor -AND ($TitleFillPattern -ne 'None')) { + if ($TitleBackgroundColor -is [string]) {$TitleBackgroundColor = [System.Drawing.Color]::$TitleBackgroundColor } $destinationSheet.Cells[1, 1].Style.Fill.PatternType = $TitleFillPattern $destinationSheet.Cells[1, 1].Style.Fill.BackgroundColor.SetColor($TitleBackgroundColor) } diff --git a/Merge-worksheet.ps1 b/Merge-worksheet.ps1 index 9f0129a..d733e8a 100644 --- a/Merge-worksheet.ps1 +++ b/Merge-worksheet.ps1 @@ -108,13 +108,13 @@ #Name of a column which is unique used to pair up rows from the refence and difference side, default is "Name". $Key = "Name" , #Sets the font color for the "key" field; this means you can filter by color to get only changed rows. - [System.Drawing.Color]$KeyFontColor = [System.Drawing.Color]::DarkRed , + $KeyFontColor = [System.Drawing.Color]::DarkRed , #Sets the background color for changed rows. - [System.Drawing.Color]$ChangeBackgroundColor = [System.Drawing.Color]::Orange, + $ChangeBackgroundColor = [System.Drawing.Color]::Orange, #Sets the background color for rows in the reference but deleted from the difference sheet. - [System.Drawing.Color]$DeleteBackgroundColor = [System.Drawing.Color]::LightPink, + $DeleteBackgroundColor = [System.Drawing.Color]::LightPink, #Sets the background color for rows not in the reference but added to the difference sheet. - [System.Drawing.Color]$AddBackgroundColor = [System.Drawing.Color]::PaleGreen, + $AddBackgroundColor = [System.Drawing.Color]::PaleGreen, #if specified, hides the rows in the spreadsheet that are equal and only shows changes, added or deleted rows. [switch]$HideEqual , #If specified, outputs the data to the pipeline (you can add -WhatIf so the command only outputs to the pipeline). @@ -402,13 +402,13 @@ Function Merge-MultipleSheets { #Name of a column which is unique used to pair up rows from the reference and difference sides, default is "Name". $Key = "Name" , #Sets the font color for the Key field; this means you can filter by color to get only changed rows. - [System.Drawing.Color]$KeyFontColor = [System.Drawing.Color]::Red, + $KeyFontColor = [System.Drawing.Color]::Red, #Sets the background color for changed rows. - [System.Drawing.Color]$ChangeBackgroundColor = [System.Drawing.Color]::Orange, + $ChangeBackgroundColor = [System.Drawing.Color]::Orange, #Sets the background color for rows in the reference but deleted from the difference sheet. - [System.Drawing.Color]$DeleteBackgroundColor = [System.Drawing.Color]::LightPink, + $DeleteBackgroundColor = [System.Drawing.Color]::LightPink, #Sets the background color for rows not in the reference but added to the difference sheet. - [System.Drawing.Color]$AddBackgroundColor = [System.Drawing.Color]::Orange, + $AddBackgroundColor = [System.Drawing.Color]::Orange, #If specified, hides the columns in the spreadsheet that contain the row numbers. [switch]$HideRowNumbers , #If specified, outputs the data to the pipeline (you can add -whatif so it the command only outputs to the pipeline). diff --git a/New-ConditionalText.ps1 b/New-ConditionalText.ps1 index e33aa19..29d58fe 100644 --- a/New-ConditionalText.ps1 +++ b/New-ConditionalText.ps1 @@ -49,8 +49,8 @@ function New-ConditionalText { [Alias("ConditionValue")] $Text, [Alias("ForeGroundColor")] - [System.Drawing.Color]$ConditionalTextColor=[System.Drawing.Color]::DarkRed, - [System.Drawing.Color]$BackgroundColor=[System.Drawing.Color]::LightPink, + $ConditionalTextColor=[System.Drawing.Color]::DarkRed, + $BackgroundColor=[System.Drawing.Color]::LightPink, [String]$Range, [OfficeOpenXml.Style.ExcelFillStyle]$PatternType=[OfficeOpenXml.Style.ExcelFillStyle]::Solid, [ValidateSet( diff --git a/Send-SqlDataToExcel.ps1 b/Send-SqlDataToExcel.ps1 index a02e467..603de6a 100644 --- a/Send-SqlDataToExcel.ps1 +++ b/Send-SqlDataToExcel.ps1 @@ -196,7 +196,7 @@ [OfficeOpenXml.Style.ExcelFillStyle]$TitleFillPattern = 'None', [Switch]$TitleBold, [Int]$TitleSize = 22, - [System.Drawing.Color]$TitleBackgroundColor, + $TitleBackgroundColor, [String]$Password, [Hashtable]$PivotTableDefinition, [Switch]$IncludePivotTable, diff --git a/Set-CellStyle.ps1 b/Set-CellStyle.ps1 index 43cef70..a99d9be 100644 --- a/Set-CellStyle.ps1 +++ b/Set-CellStyle.ps1 @@ -4,9 +4,9 @@ $Row, $LastColumn, [OfficeOpenXml.Style.ExcelFillStyle]$Pattern, - [System.Drawing.Color]$Color + $Color ) - + if ($Color -is [string]) {$Color = [System.Drawing.Color]::$Color } $t=$WorkSheet.Cells["A$($Row):$($LastColumn)$($Row)"] $t.Style.Fill.PatternType=$Pattern $t.Style.Fill.BackgroundColor.SetColor($Color) diff --git a/Set-Column.ps1 b/Set-Column.ps1 index 0779ef4..d1f3590 100644 --- a/Set-Column.ps1 +++ b/Set-Column.ps1 @@ -71,7 +71,7 @@ #Style of border to draw around the row. [OfficeOpenXml.Style.ExcelBorderStyle]$BorderAround, #Colour for the text - if none specified it will be left as it it is. - [System.Drawing.Color]$FontColor, + $FontColor, #Make text bold; use -Bold:$false to remove bold. [Switch]$Bold, #Make text italic; use -Italic:$false to remove italic. @@ -89,12 +89,12 @@ #Point size for the text. [float]$FontSize, #Change background color. - [System.Drawing.Color]$BackgroundColor, + $BackgroundColor, #Background pattern - "Solid" by default. [OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern = [OfficeOpenXml.Style.ExcelFillStyle]::Solid , #Secondary color for background pattern. [Alias("PatternColour")] - [System.Drawing.Color]$PatternColor, + $PatternColor, #Turn on Text-Wrapping; use -WrapText:$false to turn off wrapping. [Switch]$WrapText, #Position cell contents to Left, Right, Center etc. Default is "General". diff --git a/Set-Row.ps1 b/Set-Row.ps1 index e8b4392..d286090 100644 --- a/Set-Row.ps1 +++ b/Set-Row.ps1 @@ -62,7 +62,7 @@ #Style of border to draw around the row. [OfficeOpenXml.Style.ExcelBorderStyle]$BorderAround, #Color of the border. - [System.Drawing.Color]$BorderColor=[System.Drawing.Color]::Black, + $BorderColor=[System.Drawing.Color]::Black, #Style for the bottom border. [OfficeOpenXml.Style.ExcelBorderStyle]$BorderBottom, #Style for the top border. @@ -72,7 +72,7 @@ #Style for the right border. [OfficeOpenXml.Style.ExcelBorderStyle]$BorderRight, #Color for the text - if none specified it will be left as it it is. - [System.Drawing.Color]$FontColor, + $FontColor, #Make text bold; use -Bold:$false to remove bold. [Switch]$Bold, #Make text italic; use -Italic:$false to remove italic. @@ -90,12 +90,12 @@ #Point size for the text. [float]$FontSize, #Change background color. - [System.Drawing.Color]$BackgroundColor, + $BackgroundColor, #Background pattern - solid by default. [OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern = [OfficeOpenXml.Style.ExcelFillStyle]::Solid , #Secondary color for background pattern. [Alias("PatternColour")] - [System.Drawing.Color]$PatternColor, + $PatternColor, #Turn on Text-Wrapping; use -WrapText:$false to turn off wrapping. [Switch]$WrapText, #Position cell contents to Left, Right, Center etc. default is 'General'. diff --git a/SetFormat.ps1 b/SetFormat.ps1 index b6a3c55..4a3487a 100644 --- a/SetFormat.ps1 +++ b/SetFormat.ps1 @@ -45,7 +45,7 @@ #Style of border to draw around the range. [OfficeOpenXml.Style.ExcelBorderStyle]$BorderAround, #Color of the border. - [System.Drawing.Color]$BorderColor=[System.Drawing.Color]::Black, + $BorderColor=[System.Drawing.Color]::Black, #Style for the bottom border. [OfficeOpenXml.Style.ExcelBorderStyle]$BorderBottom, #Style for the top border. @@ -55,7 +55,7 @@ #Style for the right border. [OfficeOpenXml.Style.ExcelBorderStyle]$BorderRight, #Colour for the text - if none is specified it will be left as it is. - [System.Drawing.Color]$FontColor, + $FontColor, #Value for the cell. $Value, #Formula for the cell. @@ -71,7 +71,7 @@ #Underline the text using the underline style in -UnderlineType; use -Underline:$false to remove underlining. [Switch]$Underline, #Specifies whether underlining should be single or double, normal or accounting mode. The default is "Single". - [OfficeOpenXml.Style.ExcelUnderLineType]$UnderLineType = [OfficeOpenXml.Style.ExcelUnderLineType]::Single, + [OfficeOpenXml.Style.ExcelUnderLineType]$UnderLineType = [OfficeOpenXml.Style.ExcelUnderLineType]::Single, #Strike through text; use -Strikethru:$false to remove Strike through [Switch]$StrikeThru, #Subscript or Superscript (or none). @@ -81,12 +81,12 @@ #Point size for the text. [float]$FontSize, #Change background color. - [System.Drawing.Color]$BackgroundColor, + $BackgroundColor, #Background pattern - Solid by default. [OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern = [OfficeOpenXml.Style.ExcelFillStyle]::Solid , #Secondary color for background pattern. [Alias("PatternColour")] - [System.Drawing.Color]$PatternColor, + $PatternColor, #Turn on Text-Wrapping; use -WrapText:$false to turn off wrapping. [Switch]$WrapText, #Position cell contents to Left, Right, Center etc. default is 'General'. @@ -150,6 +150,7 @@ $Range.Style.Font.VerticalAlign = $FontShift } if ($PSBoundParameters.ContainsKey('FontColor')){ + if ($FontColor -is [string]) {$FontColor = [System.Drawing.Color]::$FontColor } $Range.Style.Font.Color.SetColor( $FontColor) } if ($PSBoundParameters.ContainsKey('TextRotation')) { @@ -179,6 +180,7 @@ if ($PSBoundParameters.ContainsKey('NumberFormat')) { $Range.Style.Numberformat.Format = (Expand-NumberFormat $NumberFormat) } + if ($BorderColor -is [string]) {$BorderColor = [System.Drawing.Color]::$BorderColor } if ($PSBoundParameters.ContainsKey('BorderAround')) { $Range.Style.Border.BorderAround($BorderAround, $BorderColor) } @@ -200,8 +202,10 @@ } if ($PSBoundParameters.ContainsKey('BackgroundColor')) { $Range.Style.Fill.PatternType = $BackgroundPattern + if ($BackgroundColor -is [string]) {$BackgroundColor = [System.Drawing.Color]::$BackgroundColor } $Range.Style.Fill.BackgroundColor.SetColor($BackgroundColor) if ($PatternColor) { + if ($PatternColor -is [string]) {$PatternColor = [System.Drawing.Color]::$PatternColor } $Range.Style.Fill.PatternColor.SetColor( $PatternColor) } } diff --git a/compare-worksheet.ps1 b/compare-worksheet.ps1 index a2430d8..e43cb93 100644 --- a/compare-worksheet.ps1 +++ b/compare-worksheet.ps1 @@ -91,15 +91,15 @@ #The row from where we start to import data: all rows above the start row are disregarded. By default, this is the first row. [int]$Startrow = 1, #If specified, highlights all the cells - so you can make Equal cells one color, and Different cells another. - [System.Drawing.Color]$AllDataBackgroundColor, + $AllDataBackgroundColor, #If specified, highlights the rows with differences. - [System.Drawing.Color]$BackgroundColor, + $BackgroundColor, #If specified identifies the tabs which contain difference rows (ignored if -BackgroundColor is omitted). - [System.Drawing.Color]$TabColor, + $TabColor, #Name of a column which is unique and will be used to add a row to the DIFF object, defaults to "Name". $Key = "Name" , #If specified, highlights the DIFF columns in rows which have the same key. - [System.Drawing.Color]$FontColor, + $FontColor, #If specified, opens the Excel workbooks instead of outputting the diff to the console (unless -PassThru is also specified). [Switch]$Show, #If specified, the command tries to the show the DIFF in a Grid-View and not on the console. (unless-PassThru is also specified). This works best with few columns selected, and requires a key. @@ -182,6 +182,7 @@ Set-Format -WorkSheet $ws -Range $range -BackgroundColor $BackgroundColor } if ($TabColor) { + if ($TabColor -is [string]) {$TabColor = [System.Drawing.Color]::$TabColor } foreach ($tab in ($file.group._sheet | Select-Object -Unique)) { $xl.Workbook.Worksheets[$tab].TabColor = $TabColor } From 1d5ec26b040241907071ca8d04336f42d85cd271 Mon Sep 17 00:00:00 2001 From: jhoneill Date: Wed, 24 Oct 2018 17:14:33 +0100 Subject: [PATCH 08/10] Trap set row and column on empty shet --- .gitignore | 4 ++++ Set-Column.ps1 | 1 + Set-Row.ps1 | 1 + __tests__/AllFour.xlsx | Bin 0 -> 24172 bytes __tests__/PS5-And-4.0.5.0.xlsx | Bin 0 -> 13369 bytes __tests__/PS5-And-4.5.2.1.xlsx | Bin 0 -> 20991 bytes __tests__/PS6-And-4.0.5.0.xlsx | Bin 0 -> 23112 bytes __tests__/PS6-And-4.5.2.1.xlsx | Bin 0 -> 20802 bytes __tests__/Test Summary.xlsx | Bin 0 -> 37526 bytes 9 files changed, 6 insertions(+) create mode 100644 __tests__/AllFour.xlsx create mode 100644 __tests__/PS5-And-4.0.5.0.xlsx create mode 100644 __tests__/PS5-And-4.5.2.1.xlsx create mode 100644 __tests__/PS6-And-4.0.5.0.xlsx create mode 100644 __tests__/PS6-And-4.5.2.1.xlsx create mode 100644 __tests__/Test Summary.xlsx diff --git a/.gitignore b/.gitignore index bf41cac..39a724a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ Thumbs.db ehthumbs.db +*.gitignore + # Folder config file Desktop.ini @@ -14,6 +16,8 @@ $RECYCLE.BIN/ *.msm *.msp +*.dll + # Windows shortcuts *.lnk diff --git a/Set-Column.ps1 b/Set-Column.ps1 index d1f3590..36eb2eb 100644 --- a/Set-Column.ps1 +++ b/Set-Column.ps1 @@ -131,6 +131,7 @@ $endRow = $Worksheet.Dimension.End.Row } process { + if ($null -eq $workSheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return} if ($Column -eq 0 ) {$Column = $endColumn + 1 } $columnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1","" Write-Verbose -Message "Updating Column $columnName" diff --git a/Set-Row.ps1 b/Set-Row.ps1 index d286090..8896d25 100644 --- a/Set-Row.ps1 +++ b/Set-Row.ps1 @@ -126,6 +126,7 @@ $endRow = $Worksheet.Dimension.End.Row } process { + if ($null -eq $workSheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return} if ($Row -eq 0 ) {$Row = $endRow + 1 } Write-Verbose -Message "Updating Row $Row" #Add a row label diff --git a/__tests__/AllFour.xlsx b/__tests__/AllFour.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f9ea4eeafa8ec3e999539214848055bb45b32b25 GIT binary patch literal 24172 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 M4*`RCN(_hx06PqB&j0`b literal 0 HcmV?d00001 diff --git a/__tests__/PS5-And-4.0.5.0.xlsx b/__tests__/PS5-And-4.0.5.0.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cfc1fc84ff5d89b04f32583bf2a0376df4d91f58 GIT binary patch literal 13369 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%0D!M-$hw&Ut;F3e%(61 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 literal 0 HcmV?d00001 diff --git a/__tests__/PS6-And-4.0.5.0.xlsx b/__tests__/PS6-And-4.0.5.0.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9aa43a07993d76277cb20a8cbbf38eaa17727478 GIT binary patch literal 23112 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 Jj~O5T`akkqe$@Z~ literal 0 HcmV?d00001 diff --git a/__tests__/PS6-And-4.5.2.1.xlsx b/__tests__/PS6-And-4.5.2.1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0d4e73c397870bb0940150a1b39e9c76aa516746 GIT binary patch literal 20802 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 Y&|);en-v(l3=CXA*Z{28*Z6^W0HVP@vj6}9 literal 0 HcmV?d00001 diff --git a/__tests__/Test Summary.xlsx b/__tests__/Test Summary.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..dbed340ca03344259f1527e0cdf3fc85fc59e381 GIT binary patch literal 37526 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 z

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 GIQu^nAXz*B literal 0 HcmV?d00001 From 80c1a945f057b9d3e33ba5ab5b215bc9a9742e15 Mon Sep 17 00:00:00 2001 From: jhoneill Date: Wed, 24 Oct 2018 17:18:59 +0100 Subject: [PATCH 09/10] Revert "Trap set row and column on empty shet" This reverts commit 1d5ec26b040241907071ca8d04336f42d85cd271. --- Set-Column.ps1 | 1 - Set-Row.ps1 | 1 - __tests__/AllFour.xlsx | Bin 24172 -> 0 bytes __tests__/PS5-And-4.0.5.0.xlsx | Bin 13369 -> 0 bytes __tests__/PS5-And-4.5.2.1.xlsx | Bin 20991 -> 0 bytes __tests__/PS6-And-4.0.5.0.xlsx | Bin 23112 -> 0 bytes __tests__/PS6-And-4.5.2.1.xlsx | Bin 20802 -> 0 bytes __tests__/Test Summary.xlsx | Bin 37526 -> 0 bytes 8 files changed, 2 deletions(-) delete mode 100644 __tests__/AllFour.xlsx delete mode 100644 __tests__/PS5-And-4.0.5.0.xlsx delete mode 100644 __tests__/PS5-And-4.5.2.1.xlsx delete mode 100644 __tests__/PS6-And-4.0.5.0.xlsx delete mode 100644 __tests__/PS6-And-4.5.2.1.xlsx delete mode 100644 __tests__/Test Summary.xlsx diff --git a/Set-Column.ps1 b/Set-Column.ps1 index 36eb2eb..d1f3590 100644 --- a/Set-Column.ps1 +++ b/Set-Column.ps1 @@ -131,7 +131,6 @@ $endRow = $Worksheet.Dimension.End.Row } process { - if ($null -eq $workSheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return} if ($Column -eq 0 ) {$Column = $endColumn + 1 } $columnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1","" Write-Verbose -Message "Updating Column $columnName" diff --git a/Set-Row.ps1 b/Set-Row.ps1 index 8896d25..d286090 100644 --- a/Set-Row.ps1 +++ b/Set-Row.ps1 @@ -126,7 +126,6 @@ $endRow = $Worksheet.Dimension.End.Row } process { - if ($null -eq $workSheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return} if ($Row -eq 0 ) {$Row = $endRow + 1 } Write-Verbose -Message "Updating Row $Row" #Add a row label diff --git a/__tests__/AllFour.xlsx b/__tests__/AllFour.xlsx deleted file mode 100644 index f9ea4eeafa8ec3e999539214848055bb45b32b25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24172 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 M4*`RCN(_hx06PqB&j0`b diff --git a/__tests__/PS5-And-4.0.5.0.xlsx b/__tests__/PS5-And-4.0.5.0.xlsx deleted file mode 100644 index cfc1fc84ff5d89b04f32583bf2a0376df4d91f58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13369 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%0D!M-$hw&Ut;F3e%(61 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 diff --git a/__tests__/PS6-And-4.0.5.0.xlsx b/__tests__/PS6-And-4.0.5.0.xlsx deleted file mode 100644 index 9aa43a07993d76277cb20a8cbbf38eaa17727478..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23112 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 Jj~O5T`akkqe$@Z~ diff --git a/__tests__/PS6-And-4.5.2.1.xlsx b/__tests__/PS6-And-4.5.2.1.xlsx deleted file mode 100644 index 0d4e73c397870bb0940150a1b39e9c76aa516746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20802 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 Y&|);en-v(l3=CXA*Z{28*Z6^W0HVP@vj6}9 diff --git a/__tests__/Test Summary.xlsx b/__tests__/Test Summary.xlsx deleted file mode 100644 index dbed340ca03344259f1527e0cdf3fc85fc59e381..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37526 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 z

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 GIQu^nAXz*B From 04e8faaccc51dbaa26dc3e741ea7a20e8354eda6 Mon Sep 17 00:00:00 2001 From: jhoneill Date: Wed, 24 Oct 2018 17:45:51 +0100 Subject: [PATCH 10/10] Re-instated trap for empty sheet in set row/col --- Set-Column.ps1 | 1 + Set-Row.ps1 | 1 + 2 files changed, 2 insertions(+) diff --git a/Set-Column.ps1 b/Set-Column.ps1 index d1f3590..36eb2eb 100644 --- a/Set-Column.ps1 +++ b/Set-Column.ps1 @@ -131,6 +131,7 @@ $endRow = $Worksheet.Dimension.End.Row } process { + if ($null -eq $workSheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return} if ($Column -eq 0 ) {$Column = $endColumn + 1 } $columnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1","" Write-Verbose -Message "Updating Column $columnName" diff --git a/Set-Row.ps1 b/Set-Row.ps1 index d286090..5d36365 100644 --- a/Set-Row.ps1 +++ b/Set-Row.ps1 @@ -126,6 +126,7 @@ $endRow = $Worksheet.Dimension.End.Row } process { + if ($null -eq $workSheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return} if ($Row -eq 0 ) {$Row = $endRow + 1 } Write-Verbose -Message "Updating Row $Row" #Add a row label