From 53b63b37803d5b863630debcbb38ba06b6a9011a Mon Sep 17 00:00:00 2001 From: jhoneill Date: Thu, 6 Sep 2018 15:23:58 +0100 Subject: [PATCH] Better support of reverse in add-conditional formatting. Tidied Exampes --- AddConditionalFormatting.ps1 | 43 +++++++++++------- .../ConditionalFormatting/TextComparisons.ps1 | 10 ++-- Examples/CustomReporting/dashboard.xlsx | Bin 3521 -> 0 bytes Examples/Fibonacci/fib.xlsx | Bin 2634 -> 0 bytes .../JoinWorksheet/Join-Worksheet.sample.ps1 | 2 +- Examples/NumberFormat/disks.xlsx | Bin 2700 -> 0 bytes Examples/PassThru/sales.xlsx | Bin 3681 -> 0 bytes Examples/PivotTable/test1.xlsx | Bin 8117 -> 0 bytes Examples/PivotTableFilters/dashboard.xlsx | Bin 3057 -> 0 bytes Examples/PivotTableFilters/testPivot.xlsx | Bin 5992 -> 0 bytes .../SpreadsheetCells/CalculatedFields.ps1 | 4 +- Examples/SpreadsheetCells/ExcelFunctions.ps1 | 4 +- Examples/SpreadsheetCells/HyperLink.ps1 | 4 +- Examples/SpreadsheetCells/hyperlink.xlsx | Bin 2676 -> 0 bytes Examples/Stocks/stocks.xlsx | Bin 4724 -> 0 bytes Examples/Tables/testData.xlsx | Bin 6979 -> 0 bytes GetExcelTable.ps1 | 10 ++-- README.md | 20 ++++---- RemoveWorksheet.ps1 | 9 ++-- __tests__/First10Races.csv | 2 +- __tests__/First10Races.tests.ps1 | 40 +++++++++------- 21 files changed, 78 insertions(+), 70 deletions(-) delete mode 100644 Examples/CustomReporting/dashboard.xlsx delete mode 100644 Examples/Fibonacci/fib.xlsx delete mode 100644 Examples/NumberFormat/disks.xlsx delete mode 100644 Examples/PassThru/sales.xlsx delete mode 100644 Examples/PivotTable/test1.xlsx delete mode 100644 Examples/PivotTableFilters/dashboard.xlsx delete mode 100644 Examples/PivotTableFilters/testPivot.xlsx delete mode 100644 Examples/SpreadsheetCells/hyperlink.xlsx delete mode 100644 Examples/Stocks/stocks.xlsx delete mode 100644 Examples/Tables/testData.xlsx diff --git a/AddConditionalFormatting.ps1 b/AddConditionalFormatting.ps1 index 7e62935..398eebf 100644 --- a/AddConditionalFormatting.ps1 +++ b/AddConditionalFormatting.ps1 @@ -68,6 +68,8 @@ [Parameter(Mandatory = $true, ParameterSetName = "NamedRuleAddress", Position = 3)] [OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType]$RuleType , #Text colour for matching objects + [Parameter(ParameterSetName = "NamedRule")] + [Parameter(ParameterSetName = "NamedRuleAddress")] [Alias("ForeGroundColour")] [System.Drawing.Color]$ForeGroundColor, #colour for databar type charts @@ -87,7 +89,9 @@ [Parameter(Mandatory = $true, ParameterSetName = "FiveIconSet")] [Parameter(Mandatory = $true, ParameterSetName = "FiveIconSetAddress")] [OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting5IconsSetType]$FiveIconsSet, - #Use the icon set in reverse order + #Use the icon set in reverse order, or reverse the orders of Two- & Three-Color Scales + [Parameter(ParameterSetName = "NamedRule")] + [Parameter(ParameterSetName = "NamedRuleAddress")] [Parameter(ParameterSetName = "ThreeIconSet")] [Parameter(ParameterSetName = "ThreeIconSetAddress")] [Parameter(ParameterSetName = "FourIconSet")] @@ -155,13 +159,18 @@ } if ($Range -match "!") {$Range = $Range -replace '^.*!',''} - #region Create a rule of the right type + #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 ($PSBoundParameters.ContainsKey("ThreeIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddThreeIconSet($Range , $ThreeIconsSet)} - elseif ($PSBoundParameters.ContainsKey("FourIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddFourIconSet( $Range , $FourIconsSet) } - elseif ($PSBoundParameters.ContainsKey("FiveIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddFiveIconSet( $Range , $FiveIconsSet) } - elseif ($PSBoundParameters.ContainsKey("DataBarColor" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddDatabar( $Range , $DataBarColor) } - else {$rule = ($WorkSheet.ConditionalFormatting)."Add$RuleType"($Range)} - if ($PSBoundParameters.ContainsKey("Reverse" ) ) {$rule.reverse = [boolean]$Reverse} + elseif ($PSBoundParameters.ContainsKey("FourIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddFourIconSet( $Range , $FourIconsSet )} + elseif ($PSBoundParameters.ContainsKey("FiveIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddFiveIconSet( $Range , $FiveIconsSet )} + elseif ($PSBoundParameters.ContainsKey("DataBarColor" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddDatabar( $Range , $DataBarColor )} + else {$rule = ($WorkSheet.ConditionalFormatting)."Add$RuleType"($Range ) } + if ($Reverse) { + if ($rule.type -match 'IconSet$' ) {$rule.reverse = $true} + elseif ($rule.type -match 'ColorScale$') {$temp =$rule.LowValue.Color ; $rule.LowValue.Color = $rule.HighValue.Color; $rule.HighValue.Color = $temp} + else {Write-Warning -Message "-Reverse was ignored because $ruletype does not support it."} + } #endregion #region set the rule conditions #for lessThan/GreaterThan/Equal/Between conditions make sure that strings are wrapped in quotes. Formulas should be passed with = which will be stripped. @@ -190,15 +199,15 @@ if ($RuleType -match "Text|With" -and $ConditionValue -match '^".*"$' ) { Write-Warning -Message "The condition will look for the quotes at the start and end." } - if ($PSBoundParameters.ContainsKey("ConditionValue") -and + if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and $RuleType -match "Top|Botom" ) {$rule.Rank = $ConditionValue } - if ($PSBoundParameters.ContainsKey("ConditionValue") -and + if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and $RuleType -match "StdDev" ) {$rule.StdDev = $ConditionValue } - if ($PSBoundParameters.ContainsKey("ConditionValue") -and + if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and $RuleType -match "Than|Equal|Expression" ) {$rule.Formula = ($ConditionValue -replace '^=','') } - if ($PSBoundParameters.ContainsKey("ConditionValue") -and + if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and $RuleType -match "Text|With" ) {$rule.Text = ($ConditionValue -replace '^=','') } - if ($PSBoundParameters.ContainsKey("ConditionValue") -and + if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and $PSBoundParameters.ContainsKey("ConditionValue2") -and $RuleType -match "Between" ) { $rule.Formula = ($ConditionValue -replace '^=',''); @@ -208,12 +217,12 @@ if ($PSBoundParameters.ContainsKey("Priority") ) {$rule.Priority = $Priority } #endregion #region set the rule format - if ($PSBoundParameters.ContainsKey("NumberFormat" ) ) {$rule.Style.NumberFormat.Format = (Expand-NumberFormat $NumberFormat) } + if ($PSBoundParameters.ContainsKey("NumberFormat" ) ) {$rule.Style.NumberFormat.Format = (Expand-NumberFormat $NumberFormat) } if ($Underline ) {$rule.Style.Font.Underline = [OfficeOpenXml.Style.ExcelUnderLineType]::Single } - elseif ($PSBoundParameters.ContainsKey("Underline" ) ) {$rule.Style.Font.Underline = [OfficeOpenXml.Style.ExcelUnderLineType]::None } - 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 } + elseif ($PSBoundParameters.ContainsKey("Underline" ) ) {$rule.Style.Font.Underline = [OfficeOpenXml.Style.ExcelUnderLineType]::None } + 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("BackgroundPattern") ) {$rule.Style.Fill.PatternType = $BackgroundPattern } diff --git a/Examples/ConditionalFormatting/TextComparisons.ps1 b/Examples/ConditionalFormatting/TextComparisons.ps1 index 78ccbb6..0a759bd 100644 --- a/Examples/ConditionalFormatting/TextComparisons.ps1 +++ b/Examples/ConditionalFormatting/TextComparisons.ps1 @@ -1,6 +1,4 @@ -cls - -ipmo ..\..\ImportExcel.psd1 -Force +try {ipmo ..\..\ImportExcel.psd1 -Force} catch {} $data = $( New-PSItem 100 (echo test testx) @@ -10,8 +8,8 @@ $data = $( New-PSItem 500 ) -$file1 = "tryComparison1.xlsx" -$file2 = "tryComparison2.xlsx" +$file1 = "$env:Temp\tryComparison1.xlsx" +$file2 = "$env:Temp\tryComparison2.xlsx" rm $file1 -ErrorAction Ignore rm $file2 -ErrorAction Ignore @@ -22,6 +20,6 @@ $data | Export-Excel $file1 -Show -ConditionalText $( ) $data | Export-Excel $file2 -Show -ConditionalText $( - New-ConditionalText -ConditionalType GreaterThanOrEqual 275 + New-ConditionalText -ConditionalType GreaterThanOrEqual 275 New-ConditionalText -ConditionalType LessThanOrEqual 250 -BackgroundColor cyan ) diff --git a/Examples/CustomReporting/dashboard.xlsx b/Examples/CustomReporting/dashboard.xlsx deleted file mode 100644 index c2afb01c3a1154602d6549ce53020239373e1766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3521 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 diff --git a/Examples/Fibonacci/fib.xlsx b/Examples/Fibonacci/fib.xlsx deleted file mode 100644 index 431ef10a0d3cb7e20c684fd60e49ddb9d6f2f7c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2634 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 diff --git a/Examples/PassThru/sales.xlsx b/Examples/PassThru/sales.xlsx deleted file mode 100644 index ba69c5b756de04848470bc970118c2e1717e6c79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3681 zcmZ{n2{=^m9>)n|(v-Eb6g5IaVvuA_qhv~cc$*W)V=@Td7kq==XuV%d_TY6`=0MPi{RoG;Q+EOhtMhG$AI8hi?p)AijIZtCKu?c4{Bt-LRG`BS(`|99R??toOtMtc zqDuEMq1PX_oYGrckHxAhfQus}akmb<>s?s~s@h4mxPK*dcf5$t%83U=CU-=iQFuF? zl5X8E08<`EKepVH*6stflM*&ZI&sw%IGY5((?0fdbrY0DiW6ROWxBt;$Bo-2ac*RA zHfaE=49Hs=-@j`)_=Ej)BPwYz@`}Pf8RsLH+srA(YWy+aSA!&GjnRU@2MTo&P?eZ9w&j(Bd8?Vxm+b_y!k2RA?fOXYRlQSXefh6MK4^bVs3oM zuy<@lw4vHW6gZna@e9$$*_*B77_!ZZz`@|lSr_ZJ3D*<`F~w>^)>3Rq-@eA;>z z!3*4s@9ZC73Do(73Kmc~7Tj&D*3Jjx;j46*eNTGcwj)9r1Q@qM;WEQ{9YK)^(D!aj zoODY7=P)Ll54)I*)(-Swu6!S?zDSSL>5mC73j_Cr-?1p-b?1If?fD2iWZ+tt(^U|* zlWWK#h+@>?C&X;y$pA@kGoa1F)B0aDdQ#J1+3I^&Q5|YHa_+f8wXT(*kntabVddT8 zijR*ra|~DP`1#=eJRr*1JVnfN&Fs_7)71<>VHk#{^m!uJrB{frMShjuHn*KEbF-K~ zWg3qRPLf#i5Gcl$*|n3D+{X7rS-@a1;-|o8&Qm&p2VIqL5FlT~ z3c<_M1+SQWgSmQFac65#c2@4S#6780UUbjJK4z*}U$*E&py@lEg%(3~gGgYtbh2TATHIDvQVpBIhwVbaMO`oWK7{1?F zou}tD^b-1T+`Eh%`}~w{Xyu;CHTAi@&PYqkW2U!M(z$P13~XCU*jHE0gqM9R*O3kS z3g|p7z|0tPF~=qs%Mf=XDCi(1uE)NDlWn! zVJoG{6|>$ssBmx>Xh)1_*JA_F{7WAM7aZmAPR=q)a5QYU5%xmO7d5aI)a;;=XRkEe z)we{LD(zpi`^tL3at>#Mah*5dbH|a}Uy%hrs~pF^X1pz2-vjB&1zt;D?aDjNC*o^} z9@j*#+ukZYtN$(&rEMOK5r1lT@k|JlM9Y^FUxcQQ86A$vv+nIAsW9nO;x;y&%?$pe zGZ(X(ae{|~<2nnC=tgDux?nJVzDmCuD7!>%X1(*Gof3($<3W|yS`Uq@{@^lr>?WZ_ zeQVL`QVAi1sgHO0ySs+STP`t#h7LNtr1Qd3=In3zsQ`{HUwB0Oz9PU|MP$GF| z>bs1_g)Kg-`FSy^p5nE>Ho9i^C`4fg|MycQL|oRZ8!2_GzJA)Zi?+&|6`=%@9sigU z2}D0C5_5lmL2vSUI$<{*dUu`?WMWGn;+-z&v0=0|eN)*TdiiiuuZ&aQ)d0E0QVp%zG8kJs za_zMb9*jE%?5K#?5`KstvGj2gx}4C70)>FOCWv+j<{G|FDJ@|4+c2RvRYD`5V2eKL z3D2kPUBXU;#2RjpSgM>AIfEf~H`hVaV>EJHJiR(WB-sgKW&ED63wf82Tq7bPmRe#( z$zVWCv?#Mx1qMsAZ0xPx=XAR(?5e+ohfzMQ1)0NNp@x4f;r&tmz~$(gV?dgPrgOxyw>qyr zU~-vgk6>~`{B-BZ`V>in97-}YqcQI@ndx+W_4O8KQ@&1AFcgaHn@Jv_5f4pqv#Lokj~1xpRn-cKSFi+@LuaC>+On<*7JTVct)u zn@=d=oGBuXe_tN_$*v1VSLLK75k(TQ%9$F4hGpe}{i) zH3VN`ugKi3u?Q!ywq}OSyb*zqZ_k>NDgMt?zt?OIcfxDbkjISTV?;udECkHaCoQ#$ zZkR|%?Pt$}*}ib|$_aR@bPBGEmUPbVy%zZW{>ZLx_QrDnQ0gvi@KmO7CkMXr!BN*lp!)V$p_ZomrCP#|(=7Lz9ys>Z zk{I{8^Ln;kmtaMC@f(MH;>%N1YR;6E9XHI?(5KoNtF#)Oej~)5Gt||=v;2akmCRxg z{!Y8$?W^!>ok6d0dvr3saWA)75uSVcTD>=ar_m?jDM%w_t(h(Gvng$6aTdY3MUh41 zpMFJHs5Zs_`7!x>fXyzIZMioB#X`TyfdAcbv&CbZ*o`>OvUY!2+P^z*c0gY4 aONj5^ReKh}17N?!%etPh5XXVoPyYf1ia5mp diff --git a/Examples/PivotTable/test1.xlsx b/Examples/PivotTable/test1.xlsx deleted file mode 100644 index 182c72e389503f4687c095e27c9412ebac402ad4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8117 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 diff --git a/Examples/PivotTableFilters/dashboard.xlsx b/Examples/PivotTableFilters/dashboard.xlsx deleted file mode 100644 index f6fa0fb955b136e9b5f3a54e434cbc02e15575ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3057 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 rm@E7DCzGmn>N_wycB5PFX|t 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 diff --git a/Examples/Stocks/stocks.xlsx b/Examples/Stocks/stocks.xlsx deleted file mode 100644 index 6eb02d9213fac8d62b954eec8800ba4e61b6f4af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4724 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 diff --git a/Examples/Tables/testData.xlsx b/Examples/Tables/testData.xlsx deleted file mode 100644 index d94934a189b930381690373c891a8c270bf932f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6979 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 diff --git a/GetExcelTable.ps1 b/GetExcelTable.ps1 index e1aacc0..1bd7903 100644 --- a/GetExcelTable.ps1 +++ b/GetExcelTable.ps1 @@ -25,7 +25,7 @@ Function Get-ExcelTableName { $Stream.Close() $Stream.Dispose() $Excel.Dispose() - $Excel = $null + $Excel = $null } Function Get-ExcelTable { @@ -66,7 +66,7 @@ Function Get-ExcelTable { $propertyNames = for($col=$startCol; $col -lt ($startCol+$colCount); $col+= 1) { $Worksheet.Cells[$startRow, $col].value } - + $startRow++ for($row=$startRow; $row -lt ($startRow+$rowCount); $row += 1) { $nr=[ordered]@{} @@ -92,13 +92,11 @@ function ConvertFrom-ExcelColumnName { ForEach { $sum*=26 $sum+=[char]$_.tostring().toupper()-[char]'A'+1 - } + } $sum } -cls - ipmo .\ImportExcel.psd1 -Force -#Get-ExcelTableName .\testTable.xlsx | Get-ExcelTable .\testTable.xlsx +#Get-ExcelTableName .\testTable.xlsx | Get-ExcelTable .\testTable.xlsx Get-ExcelTable .\testTable.xlsx Table3 \ No newline at end of file diff --git a/README.md b/README.md index c26604d..20bd5cb 100644 --- a/README.md +++ b/README.md @@ -51,18 +51,16 @@ Install-Module ImportExcel -scope CurrentUser ```PowerShell Install-Module ImportExcel ``` -- Lots of help improvements. -- Conditional formatting can now support named ranges, and booleans in the sheet as a condition. Also brought the two different kinds together inside export-excel -- Improved handling of hyperlinks. -- Moved logic for adding a named range out of Export-Excel and into new function named Add-ExcelName, and for adding a table into a function named Add-Excel table; this is to make it easier to do these things independently of Export-Excel but minimize duplication. Add-Table command can now toggle the options from table tools toolbar (show totals etc) -- Fixed issues where formatting could be reset when using Export-Excel to manipulate an existing sheet without appending data; this applied to number formats and tables. +- Lots of help improvements and some tidying up of examples +- `Add-ConditionalFormatting`: Now wraps those strings in quotes when needed (for = <= >= string needs to be in double quotes). Parameter intellisense has been improved. There are new parameters: -StopIfTrue and -Priority and support for using the -Reverse parameter with Color-scale rules. Booleans in the sheet are now supported as the value for a condition. Also brought the two different kinds of condition together inside export-excel, and fixed a bug where named-ranges didn't work in some places. In `New-ConditionalText`, more types of conditional format are supported, and -ConditionalTextColor now has an argument completer +- Improved handling of hyperlinks in `Export-Excel`. +- `Export-Excel` has better checking of Table and PivotTable names (for uniqueness) and a new test in quick charts that there is suitable data for charting. +- Moved logic for adding a named range out of Export-Excel and into a new function named `Add-ExcelName`, and logic for adding a table into a function named `Add-ExcelTable`; this is to make it easier to do these things independently of Export-Excel, but minimize duplication. The Add-ExcelTable command has extra parameters to toggle the options from table tools toolbar (show totals etc) - Moved PivotTable Functions out of Export-Excel.PS1 into their own file and moved Add-ExcelChart out of Export-Excel.ps1 into New-ExcelChart.ps1 -- in Export-Excel there is better checking of Table and PivotTable names (for uniqueness) and a new test in quick charts that there is suitable data for charting. -- in New-ConditionalText, more types of conditional format are supported, and conditionalTextColor now has an argument completer -- in Add-ConditionalFormatting: improved parameter intellisense and now wrap those strings which need it in quotes (for = <= >= string needs to be in double quotes), added StopIfTrue and Priority Parameters -- in New-ExcelChartDefinition: Legend parameters (for size, bold & position ) are now supported -- Add-ExcelChart now supports -PassThru to return the chart for tweaking after creation; there is now a -PivotTable parameter to allow Add-PivotTable to call the code in Add-ExcelChart -- in Add-PivotTable: chart creation has been moved out to Add-ExcelChart. -PassThru returns the pivot table (e.g. to allow names /sort orders of data series to be tweaked ) -Address parameter allows Pivot to be placed on an existing sheet; -PivotTableStyle allows a change from "Medium6", -PivotNumberFormat sets data cells and -PivotChartDefinition allows a defintion created with New-ExcelChartDefinition to be used. This opens up all the things that Add-Excel chart can do without duplicating the parameters on Add-Pivot table and Export-Excel. Definition, TableStyle, Numberformat and ChartDefiniton can be used in New-PivotTableDefinition . +- Fixed issues where formatting could be reset when using Export-Excel to manipulate an existing sheet without appending data; this applied to number-formats and tables. +- `Add-PivotTable` has some new parameters -PassThru returns the pivot table (e.g. to allow names /sort orders of data series to be tweaked ) -Address parameter allows Pivot to be placed on an existing sheet; -PivotTableStyle allows a change from "Medium6", -PivotNumberFormat sets data cells. Chart creation has been moved out to Add-ExcelChart, and -PivotChartDefinition allows a defintion created with New-ExcelChartDefinition to be used with a PivotTable. This opens up all the things that Add-Excel chart can do without duplicating the parameters on Add-Pivot table and Export-Excel. Definition, TableStyle, Numberformat and ChartDefiniton can be used in `New-PivotTableDefinition` . +- `Add-ExcelChart` now supports -PassThru to return the chart for tweaking after creation; there is now a -PivotTable parameter to allow Add-PivotTable to call the code in Add-ExcelChart. And in `New-ExcelChartDefinition` Legend parameters (for size, bold & position ) are now supported + # What's new in Release 5.2 - Value does not need to be mandatory in Set-Row or Set-Column, also tidied their parameters a little. diff --git a/RemoveWorksheet.ps1 b/RemoveWorksheet.ps1 index 0b2c06b..36be4f5 100644 --- a/RemoveWorksheet.ps1 +++ b/RemoveWorksheet.ps1 @@ -9,7 +9,7 @@ $Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage $Path $workSheet = $Excel.Workbook.Worksheets[$WorkSheetName] - + if($workSheet) { if($Excel.Workbook.Worksheets.Count -gt 1) { $Excel.Workbook.Worksheets.Delete($workSheet) @@ -22,14 +22,13 @@ } $Excel.Save() - $Excel.Dispose() + $Excel.Dispose() } -cls -ipmo .\ImportExcel.psd1 -Force +Import-Module .\ImportExcel.psd1 -Force -$names = Get-ExcelSheetInfo C:\Temp\testDelete.xlsx +$names = Get-ExcelSheetInfo C:\Temp\testDelete.xlsx $names | % { Remove-WorkSheet C:\Temp\testDelete.xlsx $_.Name} ##Remove-WorkSheet C:\Temp\testDelete.xlsx sheet6 \ No newline at end of file diff --git a/__tests__/First10Races.csv b/__tests__/First10Races.csv index 014ca5b..46b3180 100644 --- a/__tests__/First10Races.csv +++ b/__tests__/First10Races.csv @@ -1,4 +1,4 @@ -Race,Date,FinishPosition,Driver,GridPostion,Team,Points +Race,Date,FinishPosition,Driver,GridPosition,Team,Points Australian,25/03/2018,1,Sebastian Vettel,3,Ferrari,25 Australian,25/03/2018,2,Lewis Hamilton,1,Mercedes,18 Australian,25/03/2018,3,Kimi Räikkönen,2,Ferrari,15 diff --git a/__tests__/First10Races.tests.ps1 b/__tests__/First10Races.tests.ps1 index 4ce05b1..f045af3 100644 --- a/__tests__/First10Races.tests.ps1 +++ b/__tests__/First10Races.tests.ps1 @@ -1,6 +1,6 @@ $scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent $dataPath = Join-Path -Path $scriptPath -ChildPath "First10Races.csv" - + Describe "Creating small named ranges with hyperlinks" { BeforeAll { $path = "$env:TEMP\Results.xlsx" @@ -18,27 +18,29 @@ Describe "Creating small named ranges with hyperlinks" { $worksheet = $excel.Workbook.Worksheets[1] $columns = $worksheet.Dimension.Columns - 1..$columns | foreach {Add-ExcelName -Range $worksheet.cells[$topRow,$_,$lastDataRow,$_]} + 1..$columns | foreach {Add-ExcelName -Range $worksheet.cells[$topRow,$_,$lastDataRow,$_]} #Test Add-Excel Name on its own (outside Export-Excel) $scwarnVar = $null - Set-Column -Worksheet $worksheet -StartRow $topRow -Heading "PlacesGained/Lost" -Value "=GridPostion-FinishPosition" -AutoNameRange -WarningVariable scWarnVar -WarningAction SilentlyContinue + Set-Column -Worksheet $worksheet -StartRow $topRow -Heading "PlacesGained/Lost" ` + -Value "=GridPosition-FinishPosition" -AutoNameRange -WarningVariable scWarnVar -WarningAction SilentlyContinue #Test as many set column options as possible. $columns ++ #create a table which covers all the data. And define a pivot table which uses the same address range. - $table = Add-ExcelTable -PassThru -Range $worksheet.cells[$topRow,1,$lastDataRow,$columns] -TableName "AllResults" -TableStyle Light7 -ShowHeader -ShowFilter -ShowColumnStripes -ShowRowStripes:$false -ShowFirstColumn:$false -ShowLastColumn:$false -ShowTotal:$false + $table = Add-ExcelTable -PassThru -Range $worksheet.cells[$topRow,1,$lastDataRow,$columns] -TableName "AllResults" -TableStyle Light4 ` + -ShowHeader -ShowFilter -ShowColumnStripes -ShowRowStripes:$false -ShowFirstColumn:$false -ShowLastColumn:$false -ShowTotal:$false #Test Add-ExcelTable outside export-Excel with as many options as possible. $pt = New-PivotTableDefinition -PivotTableName Analysis -SourceWorkSheet $worksheet -SourceRange $table.address.address -PivotRows Driver -PivotData @{Points="SUM"} -PivotTotals None - $cf = Add-ConditionalFormatting -Address $worksheet.cells[$topRow,$columns,$lastDataRow,$columns] -ThreeIconsSet Arrows -Passthru + $cf = Add-ConditionalFormatting -Address $worksheet.cells[$topRow,$columns,$lastDataRow,$columns] -ThreeIconsSet Arrows -Passthru #Test using cells[r1,c1,r2,c2] $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 - + 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["GridPosition"] -RuleType ThreeColorScale -Reverse #Test Reverse $ct = New-ConditionalText -Text "Ferrari" - $ct2 = New-ConditionalText -Range $worksheet.Names["FinishPosition"].Address -ConditionalType LessThanOrEqual -Text 3 -ConditionalTextColor Red -BackgroundColor White + $ct2 = New-ConditionalText -Range $worksheet.Names["FinishPosition"].Address -ConditionalType LessThanOrEqual -Text 3 -ConditionalText Red -Background 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 {(New-Object -TypeName OfficeOpenXml.ExcelHyperLink -ArgumentList "Sheet1!$($_.Name)" , "$($_.name) GP")} | - Export-Excel -ExcelPackage $excel -AutoSize -PivotTableDefinition $pt -Calculate -Conditionaltext $ct,$ct2 + $results | foreach {(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 ) $excel = Open-ExcelPackage $path $sheet = $excel.Workbook.Worksheets[1] @@ -47,9 +49,9 @@ Describe "Creating small named ranges with hyperlinks" { } Context "Creating hyperlinks" { it "Put the data into the sheet and created the expected named ranges " { - $sheet.dimension.rows | should be $expectedRows - $sheet.dimension.columns | should be $columns - $sheet.names.count | should be ($columns + $results.Count) + $sheet.Dimension.Rows | should be $expectedRows + $sheet.Dimension.Columns | should be $columns + $sheet.Names.Count | should be ($columns + $results.Count) $sheet.Names[$results[0].Name] | should not benullorEmpty $sheet.Names[$results[-1].Name] | should not benullorEmpty } @@ -62,14 +64,14 @@ Describe "Creating small named ranges with hyperlinks" { It "Populated the cells with the right heading and formulas " { $sheet.Cells[( $results.Count),$columns] | Should benullorEmpty $sheet.Cells[(1+$results.Count),$columns].Value | Should be "PlacesGained/Lost" - $sheet.Cells[(2+$results.Count),$columns].Formula | should be "GridPostion-FinishPosition" + $sheet.Cells[(2+$results.Count),$columns].Formula | should be "GridPosition-FinishPosition" $sheet.Names["PlacesGained_Lost"] | should not benullorEmpty } It "Performed the calculation " { $placesMade = $Sheet.Cells[(2+$results.Count),5].value - $Sheet.Cells[(2+$results.Count),3].value $sheet.Cells[(2+$results.Count),$columns].value | Should be $placesmade } - It "Applied ConditionalFormatting, including stopifTrue and Priority " { + It "Applied ConditionalFormatting, including StopIfTrue, Priority and Reverse " { $sheet.ConditionalFormatting[0].Address.Start.Column | should be $columns $sheet.ConditionalFormatting[0].Address.End.Column | should be $columns $sheet.ConditionalFormatting[0].Address.End.Row | should be $expectedRows @@ -78,16 +80,20 @@ Describe "Creating small named ranges with hyperlinks" { $sheet.ConditionalFormatting[0].Icon3.Value | Should be 1 $sheet.ConditionalFormatting[1].Priority | Should be 1 $sheet.ConditionalFormatting[1].StopIfTrue | Should be $true + $sheet.ConditionalFormatting[3].LowValue.Color.R | Should begreaterThan 180 + $sheet.ConditionalFormatting[3].LowValue.Color.G | Should beLessThan 128 + $sheet.ConditionalFormatting[3].HighValue.Color.R | Should beLessThan 128 + $sheet.ConditionalFormatting[3].HighValue.Color.G | Should begreaterThan 180 } } - Context "Adding adding a table" { + Context "Adding a table" { it "Created a table " { $sheet.tables[0] | Should not beNullOrEmpty $sheet.tables[0].Address.Start.Column | should be 1 $sheet.tables[0].Address.End.Column | should be $columns $sheet.tables[0].Address.Start.row | should be ($results.Count + 1) $sheet.Tables[0].Address.End.Row | should be $expectedRows - $sheet.Tables[0].StyleName | should be "TableStyleLight7" + $sheet.Tables[0].StyleName | should be "TableStyleLight4" $sheet.Tables[0].ShowColumnStripes | should be $true $sheet.Tables[0].ShowRowStripes | should not be $true }