Compare commits

..

48 Commits

Author SHA1 Message Date
dfinke
77f30f105b Spell check 2018-09-19 13:49:44 -04:00
dfinke
972142f727 Bumped version, add header to readme 2018-09-19 08:11:33 -04:00
Doug Finke
cfd1ac99b2 Merge pull request #435 from jhoneill/master
Improved help, minor bugfixes and parameter improvments, more tests
2018-09-19 07:48:41 -04:00
jhoneill
e09c5e5207 Further polish to help 2018-09-11 15:34:37 +01:00
jhoneill
3ff59907ff Improvements to help 2018-09-11 14:05:23 +01:00
jhoneill
ef4ac9777b Updates to examples . Minor bug fix to format in Merge-Multiple 2018-09-10 14:26:29 +01:00
jhoneill
65b1f79d53 Range handling for Add-Conditional format and range tests 2018-09-09 15:10:05 +01:00
jhoneill
ecad48acb3 Set-Format,row and column renamed; definitions as hashtables, 2018-09-08 18:36:51 +01:00
jhoneill
f47887f7fe Support for hash tables as definitions; more tests 2018-09-07 13:07:40 +01:00
jhoneill
061ae22bfe Added TotalSettings to Add-ExcelTable 2018-09-06 20:39:40 +01:00
jhoneill
53b63b3780 Better support of reverse in add-conditional formatting. Tidied Exampes 2018-09-06 15:23:58 +01:00
jhoneill
378a20a094 Further refinements to Conditional format, made new test more robust 2018-09-05 16:56:48 +01:00
jhoneill
7edf5f8a3a Conditional formatting supports named ranges, & booleans in the sheet 2018-09-05 13:38:17 +01:00
jhoneill
6393701a2f Further updates to on-line help 2018-09-05 11:44:41 +01:00
jhoneill
71c22d647d A blitz on on line help 2018-09-04 22:56:20 +01:00
jhoneill
ef656f72b3 Updated Tests 2018-09-02 13:57:21 +01:00
jhoneill
dfd9b23cd7 See readme.md for details 2018-08-31 17:22:52 +01:00
jhoneill
f94a075f52 Better checks and more choice in Conditional formatting 2018-08-23 12:14:47 +01:00
jhoneill
cea9713129 Relocation of and parameter improvments to Chart, & Pivot table; 2018-08-23 12:12:56 +01:00
dfinke
343687c418 bump version 2018-08-18 06:29:08 -04:00
dfinke
d4d2b4a856 Spell check 2018-08-16 19:26:50 -04:00
Doug Finke
bed52d456d Merge pull request #416 from jhoneill/master
Fix for #415, auto extend ranges/tables on append, password fixes, wildcards in Exclude property
2018-08-16 13:23:30 -04:00
jhoneill
31e6eaf59b Clean-up of Set-Row/Column (value no long mandatory); support array formulas in set-format 2018-08-16 17:33:44 +01:00
jhoneill
d770646dc7 Fixed small bug with Append and simple data types 2018-08-15 23:44:00 +01:00
jhoneill
bc65699068 Improved behavior of -NumberFormat in Export-Excel 2018-08-15 22:52:22 +01:00
jhoneill
ce3fd2021f Fix currency parsing Test when "." isn't a seperator in local culture 2018-08-14 17:32:34 +01:00
jhoneill
10f670b4e6 Added timespan support to export Excel 2018-08-14 16:35:19 +01:00
jhoneill
c49b7b6db0 Epplus is not setting chart axis position properly, so disabled for now 2018-08-14 15:40:52 +01:00
jhoneill
f768634214 Refined fix for #419 2018-08-14 12:54:17 +01:00
jhoneill
07342235b9 Fixed bug exporting nested objects; removed = in cond fmt expressions 2018-08-14 10:53:50 +01:00
jhoneill
2793ff1c21 Added -Calculate, fixed formula creation to be EPPlus-friendly 2018-08-13 20:58:10 +01:00
jhoneill
121346f939 Merge branch 'master' of https://github.com/jhoneill/ImportExcel 2018-08-12 15:07:16 +01:00
jhoneill
dc8a096732 Reduced number of proccess in tests to be appveyor freindly 2018-08-12 15:03:33 +01:00
jhoneill
c63512e658 Further fix to DLL screw up 2018-08-12 14:37:09 +01:00
jhoneill
e46fe6d3e9 Updated tests (and resulting refinements) 2018-08-12 14:01:56 +01:00
jhoneill
6ae50c3193 Mistakenly committed renamed epplus.dll 2018-08-12 11:41:46 +01:00
jhoneill
ee2378150c Merge remote-tracking branch 'upstream/master' 2018-08-10 10:23:03 +01:00
jhoneill
259c7e8ae6 Export-Excel -append now automatically extends ranges & tables 2018-08-10 09:29:17 +01:00
dfinke
ae30bfe6c3 don't test ps core 2018-08-08 19:44:09 -04:00
dfinke
3756cd6ad8 set scope 2018-08-08 19:40:33 -04:00
dfinke
1014250e0b try it in PS Core 6 and on Linux 2018-08-08 19:32:15 -04:00
jhoneill
951364da51 Now supports more than 26 columns. 2018-08-08 15:48:53 +01:00
jhoneill
c1604fc08a Exclude Property in Export-Excel now supports wildcards 2018-08-07 16:16:45 +01:00
jhoneill
5a235e309e Tider errors for file open on import; password tests 2018-08-07 15:00:33 +01:00
jhoneill
af77580b5e Password support fixes 2018-08-06 14:30:10 +01:00
jhoneill
b06a5059c5 Updated test for better currency string 2018-08-06 14:21:35 +01:00
jhoneill
edab941c44 Bug fix Export list of dates and Title background color 2018-08-06 11:13:27 +01:00
jhoneill
91fb314bca Expand Number format now sets regional layout for currency 2018-08-06 11:12:41 +01:00
74 changed files with 2922 additions and 1077 deletions

View File

@@ -28,3 +28,7 @@ PivtoTableName
New-Excelchart New-Excelchart
paypal paypal
dll dll
enums
Numberformat
ChartDefiniton
hashtables

View File

@@ -2,9 +2,17 @@
<# <#
.Synopsis .Synopsis
Adds contitional formatting to worksheet. Adds contitional formatting to 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
* 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.
.Example .Example
$excel = $avdata | Export-Excel -Path (Join-path $FilePath "\Machines.XLSX" ) -WorksheetName "Server Anti-Virus" -AutoSize -FreezeTopRow -AutoFilter -PassThru >
PS> $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 "b2:b1048576" -ForeGroundColor "RED" -RuleType ContainsText -ConditionValue "2003"
Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Address "i2:i1048576" -ForeGroundColor "RED" -RuleType ContainsText -ConditionValue "Disabled" Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Address "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].Cells["D1:G1048576"].Style.Numberformat.Format = [cultureinfo]::CurrentCulture.DateTimeFormat.ShortDatePattern
@@ -13,136 +21,194 @@
Here Export-Excel is called with the -passThru parameter so the Excel Package object is stored in $Excel Here Export-Excel is called with the -passThru parameter so the Excel Package object is stored in $Excel
The desired worksheet is selected and the then columns B and i are conditially formatted (excluding the top row) to show red text if The desired worksheet is selected and the then columns B and i are conditially formatted (excluding the top row) to show red text if
the columns contain "2003" or "Disabled respectively. A fixed date formats are then applied to columns D..G, and the top row is formatted. 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. Finally the workbook is saved and the Excel object closed.
.Example .Example
C:\> $r = Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Range "B1:B100" -ThreeIconsSet Flags -Passthru >
C:\> $r.Reverse = $true ; $r.Icon1.Type = "Num"; $r.Icon2.Type = "Num" ; $r.Icon2.value = 100 ; $r.Icon3.type = "Num" ;$r.Icon3.value = 1000 >PS $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 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. 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 Add-ConditionalFormatting does not provide access to every option in the formatting rule, so passthru has been used and the
rule is 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 to apply the flags in reverse order, and boundaries for the number which will set the split 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.
.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 puple, boldface.
This rule is move to first in the priority list, and where cells have a value of 1, no other rules will be processed.
#> #>
Param ( Param (
#The worksheet where the format is to be applied #A block of cells to format - you can use a named range with -Address $ws.names[1] or $ws.cells["RangeName"]
[Parameter(Mandatory = $true, ParameterSetName = "NamedRule")] [Parameter(Mandatory = $true, Position = 0)]
[Parameter(Mandatory = $true, ParameterSetName = "DataBar")] [Alias("Range")]
[Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSet")]
[Parameter(Mandatory = $true, ParameterSetName = "FourIconSet")]
[Parameter(Mandatory = $true, ParameterSetName = "FiveIconSet")]
[OfficeOpenXml.ExcelWorksheet]$WorkSheet ,
#The area of the worksheet where the format is to be applied
[Parameter(Mandatory = $true, ParameterSetName = "NamedRule")]
[Parameter(Mandatory = $true, ParameterSetName = "DataBar")]
[Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSet")]
[Parameter(Mandatory = $true, ParameterSetName = "FourIconSet")]
[Parameter(Mandatory = $true, ParameterSetName = "FiveIconSet")]
[OfficeOpenXml.ExcelAddress]$Range ,
#One or more row(s), column(s) and/or block(s) of cells to format
[Parameter(Mandatory = $true, ParameterSetName = "NamedRuleAddress")]
[Parameter(Mandatory = $true, ParameterSetName = "DataBarAddress")]
[Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSetAddress")]
[Parameter(Mandatory = $true, ParameterSetName = "FourIconSetAddress")]
[Parameter(Mandatory = $true, ParameterSetName = "FiveIconSetAddress")]
$Address , $Address ,
#The worksheet where the format is to be applied
[OfficeOpenXml.ExcelWorksheet]$WorkSheet ,
#One of the standard named rules - Top / Bottom / Less than / Greater than / Contains etc. #One of the standard named rules - Top / Bottom / Less than / Greater than / Contains etc.
[Parameter(Mandatory = $true, ParameterSetName = "NamedRule", Position = 3)] [Parameter(Mandatory = $true, ParameterSetName = "NamedRule", Position = 1)]
[Parameter(Mandatory = $true, ParameterSetName = "NamedRuleAddress", Position = 3)]
[OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType]$RuleType , [OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType]$RuleType ,
#Text colour for matching objects #Text colour for matching objects
[Parameter(ParameterSetName = "NamedRule")]
[Alias("ForeGroundColour")] [Alias("ForeGroundColour")]
[System.Drawing.Color]$ForeGroundColor, [System.Drawing.Color]$ForeGroundColor,
#colour for databar type charts #colour for databar type charts
[Parameter(Mandatory = $true, ParameterSetName = "DataBar")] [Parameter(Mandatory = $true, ParameterSetName = "DataBar")]
[Parameter(Mandatory = $true, ParameterSetName = "DataBarAddress")]
[Alias("DataBarColour")] [Alias("DataBarColour")]
[System.Drawing.Color]$DataBarColor, [System.Drawing.Color]$DataBarColor,
#One of the three-icon set types (e.g. Traffic Lights) #One of the three-icon set types (e.g. Traffic Lights)
[Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSet")] [Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSet")]
[Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSetAddress")]
[OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting3IconsSetType]$ThreeIconsSet, [OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting3IconsSetType]$ThreeIconsSet,
#A four-icon set name #A four-icon set name
[Parameter(Mandatory = $true, ParameterSetName = "FourIconSet")] [Parameter(Mandatory = $true, ParameterSetName = "FourIconSet")]
[Parameter(Mandatory = $true, ParameterSetName = "FourIconSetAddress")]
[OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting4IconsSetType]$FourIconsSet, [OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting4IconsSetType]$FourIconsSet,
#A five-icon set name #A five-icon set name
[Parameter(Mandatory = $true, ParameterSetName = "FiveIconSet")] [Parameter(Mandatory = $true, ParameterSetName = "FiveIconSet")]
[Parameter(Mandatory = $true, ParameterSetName = "FiveIconSetAddress")]
[OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting5IconsSetType]$FiveIconsSet, [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 = "ThreeIconSet")] [Parameter(ParameterSetName = "ThreeIconSet")]
[Parameter(ParameterSetName = "ThreeIconSetAddress")]
[Parameter(ParameterSetName = "FourIconSet")] [Parameter(ParameterSetName = "FourIconSet")]
[Parameter(ParameterSetName = "FourIconSetAddress")]
[Parameter(ParameterSetName = "FiveIconSet")] [Parameter(ParameterSetName = "FiveIconSet")]
[Parameter(ParameterSetName = "FiveIconSetAddress")]
[switch]$Reverse, [switch]$Reverse,
#A value for the condition (e.g. "2000" if the test is 'lessthan 2000') #A value for the condition (e.g. 2000 if the test is 'lessthan 2000' ; Formulas should begin with "=" )
[string]$ConditionValue, [Parameter(ParameterSetName = "NamedRule")]
$ConditionValue,
#A second value for the conditions like "between x and Y" #A second value for the conditions like "between x and Y"
[string]$ConditionValue2, [Parameter(ParameterSetName = "NamedRule")]
$ConditionValue2,
#Background colour for matching items #Background colour for matching items
[Parameter(ParameterSetName = "NamedRule")]
[System.Drawing.Color]$BackgroundColor, [System.Drawing.Color]$BackgroundColor,
#Background pattern for matching items #Background pattern for matching items
[Parameter(ParameterSetName = "NamedRule")]
[OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern = [OfficeOpenXml.Style.ExcelFillStyle]::None , [OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern = [OfficeOpenXml.Style.ExcelFillStyle]::None ,
#Secondary colour when a background pattern requires it #Secondary colour when a background pattern requires it
[Parameter(ParameterSetName = "NamedRule")]
[System.Drawing.Color]$PatternColor, [System.Drawing.Color]$PatternColor,
#Sets the numeric format for matching items #Sets the numeric format for matching items
[Parameter(ParameterSetName = "NamedRule")]
$NumberFormat, $NumberFormat,
#Put matching items in bold face #Put matching items in bold face
[Parameter(ParameterSetName = "NamedRule")]
[switch]$Bold, [switch]$Bold,
#Put matching items in italic #Put matching items in italic
[Parameter(ParameterSetName = "NamedRule")]
[switch]$Italic, [switch]$Italic,
#Underline matching items #Underline matching items
[Parameter(ParameterSetName = "NamedRule")]
[switch]$Underline, [switch]$Underline,
#Strikethrough text of matching items #Strikethrough text of matching items
[Parameter(ParameterSetName = "NamedRule")]
[switch]$StrikeThru, [switch]$StrikeThru,
#Prevent the processing of subsequent rules
[Parameter(ParameterSetName = "NamedRule")]
[switch]$StopIfTrue,
#Set the sequence for rule processong
[int]$Priority,
#If specified pass the rule back to the caller to allow additional customization. #If specified pass the rule back to the caller to allow additional customization.
[switch]$Passthru [switch]$Passthru
) )
#Allow conditional formatting to work like Set-Format (with single ADDRESS parameter), split it to get worksheet and range of cells. #Allow conditional formatting to work like Set-ExcelRange (with single ADDRESS parameter), split it to get worksheet and range of cells.
If ($Address -and -not $WorkSheet -and -not $Range) { If ($Address -is [OfficeOpenXml.Table.ExcelTable]) {
$WorkSheet = $Address.Worksheet[0] $WorkSheet = $Address.Address.Worksheet
$Range = $Address.Address $Address = $Address.Address.Address
}
elseif ($Address.Address -and $Address.Worksheet -and -not $WorkSheet) { #Address is a rangebase or similar
$WorkSheet = $Address.Worksheet[0]
$Address = $Address.Address
}
elseif ($Address -is [String] -and $WorkSheet -and $WorkSheet.Names[$Address] ) { #Address is the name of a named range.
$Address = $WorkSheet.Names[$Address].Address
}
if (($Address -is [OfficeOpenXml.ExcelRow] -and -not $WorkSheet) -or
($Address -is [OfficeOpenXml.ExcelColumn] -and -not $WorkSheet) ){ #EPPLUs Can't get the worksheet object from a row or column object, so bail if that was tried
Write-Warning -Message "Add-ConditionalFormatting does not support Row or Column objects as an address; use a worksheet and/or specify 'R:R' or 'C:C' instead. "; return
}
elseif ($Address -is [OfficeOpenXml.ExcelRow]) { #But if we have a column or row object and a worksheet (I don't know *why*) turn them into a string for the range
$Address = "$($Address.Row):$($Address.Row)"
}
elseif ($Address -is [OfficeOpenXml.ExcelColumn]) {
$Address = [OfficeOpenXml.ExcelAddress]::new(1,$address.ColumnMin,1,$address.ColumnMax).Address -replace '1',''
if ($Address -notmatch ':') {$Address = "$Address`:$Address"}
}
if ( $Address -is [string] -and $Address -match "!") {$Address = $Address -replace '^.*!',''}
#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 <SetName>." ; 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 )}
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}
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."}
} }
#region Create a rule of the right type
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}
#endregion #endregion
#region set the rule conditions #region set the rule conditions
if ($PSBoundParameters.ContainsKey("ConditionValue") -and #for lessThan/GreaterThan/Equal/Between conditions make sure that strings are wrapped in quotes. Formulas should be passed with = which will be stripped.
$RuleType -match "Top|Botom" ) {$rule.Rank = $ConditionValue } if ($RuleType -match "Than|Equal|Between" ) {
if ($PSBoundParameters.ContainsKey("ConditionValue") -and if ($ConditionValue) {
$RuleType -match "StdDev" ) {$rule.StdDev = $ConditionValue } $number = $Null
if ($PSBoundParameters.ContainsKey("ConditionValue") -and #if the condition type is not a value type, but parses as a number, make it the number
$RuleType -match "Than|Equal|Expression" ) {$rule.Formula = $ConditionValue } if ($ConditionValue -isnot [System.ValueType] -and [Double]::TryParse($ConditionValue, [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number) ) {
if ($PSBoundParameters.ContainsKey("ConditionValue") -and $ConditionValue = $number
$RuleType -match "Text|With" ) {$rule.Text = $ConditionValue } } #else if it is not a value type, or a formula, or wrapped in quotes, wrap it in quotes.
if ($PSBoundParameters.ContainsKey("ConditionValue") -and elseif (($ConditionValue -isnot [System.ValueType])-and ($ConditionValue -notmatch '^=') -and ($ConditionValue -notmatch '^".*"$') ) {
$PSBoundParameters.ContainsKey("ConditionValue") -and $ConditionValue = '"' + $ConditionValue +'"'
$RuleType -match "Between" ) { }
$rule.Formula = $ConditionValue; }
$rule.Formula2 = $ConditionValue2 if ($ConditionValue2) {
$number = $Null
if ($ConditionValue -isnot [System.ValueType] -and [Double]::TryParse($ConditionValue2, [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number) ) {
$ConditionValue2 = $number
}
elseif (($ConditionValue -isnot [System.ValueType]) -and ($ConditionValue2 -notmatch '^=') -and ($ConditionValue2 -notmatch '^".*"$') ) {
$ConditionValue2 = '"' + $ConditionValue2 + '"'
}
}
} }
#But we don't usually want quotes round containstext | beginswith type rules. Can't be Certain they need to be removed, so warn the user their condition might be wrong
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
$RuleType -match "Top|Botom" ) {$rule.Rank = $ConditionValue }
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
$RuleType -match "StdDev" ) {$rule.StdDev = $ConditionValue }
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
$RuleType -match "Than|Equal|Expression" ) {$rule.Formula = ($ConditionValue -replace '^=','') }
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
$RuleType -match "Text|With" ) {$rule.Text = ($ConditionValue -replace '^=','') }
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
$PSBoundParameters.ContainsKey("ConditionValue2") -and
$RuleType -match "Between" ) {
$rule.Formula = ($ConditionValue -replace '^=','');
$rule.Formula2 = ($ConditionValue2 -replace '^=','')
}
if ($PSBoundParameters.ContainsKey("StopIfTrue") ) {$rule.StopIfTrue = $StopIfTrue }
if ($PSBoundParameters.ContainsKey("Priority") ) {$rule.Priority = $Priority }
#endregion #endregion
#region set the rule format #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 } if ($Underline ) {$rule.Style.Font.Underline = [OfficeOpenXml.Style.ExcelUnderLineType]::Single }
elseif ($PSBoundParameters.ContainsKey("Underline" ) ) {$rule.Style.Font.Underline = [OfficeOpenXml.Style.ExcelUnderLineType]::None } 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("Bold" ) ) {$rule.Style.Font.Bold = [boolean]$Bold }
if ($PSBoundParameters.ContainsKey("Italic" ) ) {$rule.Style.Font.Italic = [boolean]$Italic } if ($PSBoundParameters.ContainsKey("Italic" ) ) {$rule.Style.Font.Italic = [boolean]$Italic }
if ($PSBoundParameters.ContainsKey("StrikeThru") ) {$rule.Style.Font.Strike = [boolean]$StrikeThru } if ($PSBoundParameters.ContainsKey("StrikeThru" ) ) {$rule.Style.Font.Strike = [boolean]$StrikeThru }
if ($PSBoundParameters.ContainsKey("ForeGroundColor" ) ) {$rule.Style.Font.Color.color = $ForeGroundColor } if ($PSBoundParameters.ContainsKey("ForeGroundColor" ) ) {$rule.Style.Font.Color.color = $ForeGroundColor }
if ($PSBoundParameters.ContainsKey("BackgroundColor" ) ) {$rule.Style.Fill.BackgroundColor.color = $BackgroundColor } if ($PSBoundParameters.ContainsKey("BackgroundColor" ) ) {$rule.Style.Fill.BackgroundColor.color = $BackgroundColor }
if ($PSBoundParameters.ContainsKey("BackgroundPattern") ) {$rule.Style.Fill.PatternType = $BackgroundPattern } if ($PSBoundParameters.ContainsKey("BackgroundPattern") ) {$rule.Style.Fill.PatternType = $BackgroundPattern }
if ($PSBoundParameters.ContainsKey("PatternColor" ) ) {$rule.Style.Fill.PatternColor.color = $PatternColor } if ($PSBoundParameters.ContainsKey("PatternColor" ) ) {$rule.Style.Fill.PatternColor.color = $PatternColor }
#endregion #endregion
#Allow further tweaking by returning the rule, if passthru specified #Allow further tweaking by returning the rule, if passthru specified
if ($Passthru) {$rule} if ($Passthru) {$rule}
} }

View File

@@ -25,14 +25,15 @@ if (Get-Command -Name register-argumentCompleter -ErrorAction SilentlyContinue)
Register-ArgumentCompleter -CommandName Merge-MulipleSheets -ParameterName KeyFontColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName Merge-MulipleSheets -ParameterName KeyFontColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName Set-Format -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName ConditionalTextColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName Set-Format -ParameterName FontColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName Set-Format -ParameterName BorderColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName Set-Format -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName BorderColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName Set-Column -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName Set-Column -ParameterName FontColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName Set-ExcelColumn -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName Set-Column -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName Set-ExcelColumn -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName Set-Row -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName Set-ExcelColumn -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName Set-Row -ParameterName FontColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName Set-ExcelRow -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName Set-Row -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion Register-ArgumentCompleter -CommandName Set-ExcelRow -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
Register-ArgumentCompleter -CommandName Set-ExcelRow -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
} }

View File

@@ -1,5 +1,4 @@
function Copy-ExcelWorkSheet { function Copy-ExcelWorkSheet {
[CmdletBinding()]
<# <#
.SYNOPSIS .SYNOPSIS
Copies a worksheet between workbooks or within the same workbook. Copies a worksheet between workbooks or within the same workbook.
@@ -27,6 +26,7 @@
because -Show is not specified, so other steps can be carried using the package object, at the end the file is saved by Close-ExcelPackage because -Show is not specified, so other steps can be carried using the package object, at the end the file is saved by Close-ExcelPackage
#> #>
[CmdletBinding()]
param( param(
#An ExcelWorkbook or ExcelPackage object or the path to an XLSx file where the data is found. #An ExcelWorkbook or ExcelPackage object or the path to an XLSx file where the data is found.
[Parameter(Mandatory=$true)] [Parameter(Mandatory=$true)]

View File

@@ -8,7 +8,7 @@ $dest = "ImportExcel-{0}-{1}.zip" -f $ModuleVersion, (Get-Date).ToString("yyyyMM
Compress-Archive -Path . -DestinationPath .\$dest Compress-Archive -Path . -DestinationPath .\$dest
if ((Get-Module -ListAvailable pester) -eq $null) { if ((Get-Module -ListAvailable pester) -eq $null) {
Install-Module -Name Pester -Repository PSGallery -Force Install-Module -Name Pester -Repository PSGallery -Force -Scope CurrentUser
} }
$result = Invoke-Pester -Script $PSScriptRoot\__tests__ -Verbose -PassThru $result = Invoke-Pester -Script $PSScriptRoot\__tests__ -Verbose -PassThru

View File

@@ -4,8 +4,9 @@ $xlSourcefile = "$env:TEMP\Source.xlsx"
Remove-Item $xlSourcefile -ErrorAction Ignore Remove-Item $xlSourcefile -ErrorAction Ignore
#Put some simple data in a worksheet and Get an excel package object to represent the file
$excel = 1..10 | Export-Excel $xlSourcefile -PassThru $excel = 1..10 | Export-Excel $xlSourcefile -PassThru
#Add a new worksheet named 'NewSheet' and copying the sheet that was just made (Sheet1) to the new sheet
Add-WorkSheet -ExcelPackage $excel -WorkSheetname "NewSheet" -CopySource $excel.Workbook.Worksheets["Sheet1"] Add-WorkSheet -ExcelPackage $excel -WorkSheetname "NewSheet" -CopySource $excel.Workbook.Worksheets["Sheet1"]
#Save and open in Excel
Close-ExcelPackage -ExcelPackage $excel -Show Close-ExcelPackage -ExcelPackage $excel -Show

View File

@@ -11,7 +11,7 @@ A,B,C,Date
$c = New-ExcelChartDefinition -Title Impressions ` $c = New-ExcelChartDefinition -Title Impressions `
-ChartType Line ` -ChartType Line `
-XRange "Impressions[Date]" ` -XRange "Impressions[Date]" `
-YRange "Impressions[B]" # @("Impressions[B]","Impressions[A]") ` -YRange @("Impressions[B]","Impressions[A]") `
-SeriesHeader 'B data','A data' ` -SeriesHeader 'B data','A data' `
-Row 0 -Column 0 -Row 0 -Column 0

View File

@@ -13,14 +13,14 @@ function plot {
$file = 'C:\temp\plot.xlsx' $file = 'C:\temp\plot.xlsx'
Remove-Item $file -ErrorAction Ignore Remove-Item $file -ErrorAction Ignore
$c = New-ExcelChart -XRange X -YRange Y -ChartType Line -NoLegend -Title Plot -Column 2 -ColumnOffSetPixels 35 # $c = New-ExcelChart -XRange X -YRange Y -ChartType Line -NoLegend -Title Plot -Column 2 -ColumnOffSetPixels 35
$(for ($i = $minx; $i -lt $maxx-.1; $i+=.1) { $(for ($i = $minx; $i -lt $maxx-.1; $i+=.1) {
[pscustomobject]@{ [pscustomobject]@{
X=$i.ToString("N1") X=$i.ToString("N1")
Y=(&$f $i) Y=(&$f $i)
} }
}) | Export-Excel $file -Show -AutoNameRange -ExcelChartDefinition $c }) | Export-Excel $file -Show -AutoNameRange -LineChart -NoLegend #-ExcelChartDefinition $c
} }
function pi {[math]::pi} function pi {[math]::pi}

View File

@@ -1,13 +1,13 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
$file = ".\conditionalTextFormatting.xlsx" $file = "$env:temp\conditionalTextFormatting.xlsx"
Remove-Item $file -ErrorAction Ignore Remove-Item $file -ErrorAction Ignore
Get-Service | Get-Service |
Select-Object Status, Name, DisplayName, ServiceName | Select-Object Status, Name, DisplayName, ServiceName |
Export-Excel $file -Show -AutoSize -AutoFilter -ConditionalText $( Export-Excel $file -Show -AutoSize -AutoFilter -ConditionalText $(
New-ConditionalText stop New-ConditionalText stop #Stop is the condition value, the rule is defaults to 'Contains text' and the default Colors are used
New-ConditionalText runn darkblue cyan New-ConditionalText runn darkblue cyan #runn is the condition value, the rule is defaults to 'Contains text'; the foregroundColur is darkblue and the background is cyan
New-ConditionalText -ConditionalType EndsWith svc wheat green New-ConditionalText -ConditionalType EndsWith svc wheat green #the rule here is 'Ends with' and the value is 'svc' the forground is wheat and the background dark green
New-ConditionalText -ConditionalType BeginsWith windows darkgreen wheat New-ConditionalText -ConditionalType BeginsWith windows darkgreen wheat #this is 'Begins with "Windows"' the forground is dark green and the background wheat
) )

View File

@@ -1,5 +1,6 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
#Define a "Contains blanks" rule. No format is specified so it default to dark-red text on light-pink background.
$ContainsBlanks = New-ConditionalText -ConditionalType ContainsBlanks $ContainsBlanks = New-ConditionalText -ConditionalType ContainsBlanks
$data = $( $data = $(
@@ -11,7 +12,8 @@ $data = $(
New-PSItem g h i New-PSItem g h i
) )
$file ="c:\temp\testblanks.xlsx" $file ="$env:temp\testblanks.xlsx"
Remove-Item $file -ErrorAction Ignore Remove-Item $file -ErrorAction Ignore
#use the conditional format definition created above
$data | Export-Excel $file -show -ConditionalText $ContainsBlanks $data | Export-Excel $file -show -ConditionalText $ContainsBlanks

View File

@@ -1,23 +1,32 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
Remove-Item -Path .\test.xlsx -ErrorAction Ignore $path = "$env:temp\test.xlsx"
Remove-Item -Path $path -ErrorAction Ignore
#Export processes, and get an ExcelPackage object representing the file.
$excel = Get-Process | $excel = Get-Process |
Select-Object -Property Name,Company,Handles,CPU,PM,NPM,WS | Select-Object -Property Name,Company,Handles,CPU,PM,NPM,WS |
Export-Excel -Path .\test.xlsx -ClearSheet -WorkSheetname "Processes" -PassThru Export-Excel -Path $path -ClearSheet -WorkSheetname "Processes" -PassThru
$sheet = $excel.Workbook.Worksheets["Processes"] $sheet = $excel.Workbook.Worksheets["Processes"]
$sheet.Column(1) | Set-Format -Bold -AutoFit
#Apply fixed formatting to columns. Set-Format is an Alias for Set-Excel Range, -NFormat is an alias for numberformat
$sheet.Column(1) | Set-ExcelRange -Bold -AutoFit
$sheet.Column(2) | Set-Format -Width 29 -WrapText $sheet.Column(2) | Set-Format -Width 29 -WrapText
$sheet.Column(3) | Set-Format -HorizontalAlignment Right -NFormat "#,###" $sheet.Column(3) | Set-Format -HorizontalAlignment Right -NFormat "#,###"
Set-Format -Address $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NFormat "#,###" Set-ExcelRange -Range -Address $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NFormat "#,###"
Set-Format -Address $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold #Set-Format is an alias for Set-ExcelRange
Set-Format -Range $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold
#In Set-ExcelRange / Set-Format "-Address" is an alias for "-Range"
Set-Format -Address $sheet.Row(1) -Bold -HorizontalAlignment Center Set-Format -Address $sheet.Row(1) -Bold -HorizontalAlignment Center
Add-ConditionalFormatting -WorkSheet $sheet -Range "D2:D1048576" -DataBarColor Red #Create a Red Data-bar for the values in Column D
Add-ConditionalFormatting -WorkSheet $sheet -Range "G2:G1048576" -RuleType GreaterThan -ConditionValue "104857600" -ForeGroundColor Red Add-ConditionalFormatting -WorkSheet $sheet -Address "D2:D1048576" -DataBarColor Red
# Conditional formatting applies to "Addreses" aliases allow either "Range" or "Address" to be used in Set-ExcelRange or Add-Conditional formatting.
Add-ConditionalFormatting -WorkSheet $sheet -Range "G2:G1048576" -RuleType GreaterThan -ConditionValue "104857600" -ForeGroundColor Red
foreach ($c in 5..9) {Set-Format -Address $sheet.Column($c) -AutoFit } foreach ($c in 5..9) {Set-Format -Address $sheet.Column($c) -AutoFit }
#Create a pivot and save the file.
Export-Excel -ExcelPackage $excel -WorkSheetname "Processes" -IncludePivotChart -ChartType ColumnClustered -NoLegend -PivotRows company -PivotData @{'Name'='Count'} -Show Export-Excel -ExcelPackage $excel -WorkSheetname "Processes" -IncludePivotChart -ChartType ColumnClustered -NoLegend -PivotRows company -PivotData @{'Name'='Count'} -Show

View File

@@ -1,6 +1,6 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
$f = ".\testExport.xlsx" $f = "$env:TEMP\testExport.xlsx"
Remove-Item $f -ErrorAction Ignore Remove-Item $f -ErrorAction Ignore
@@ -21,6 +21,8 @@ $data = $(
New-PSItem Westerly 120 New-PSItem Westerly 120
New-PSItem SouthWest 118 New-PSItem SouthWest 118
) )
# in this example instead of doing $variable = New-Conditional text <parameters> .... ; Export-excel -conditionalText $variable <other parameters>
# the syntax is used is Export-excel -conditionalText (New-Conditional text <parameters>) <other parameters>
#$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType AboveAverage) #$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType AboveAverage)

View File

@@ -1,10 +1,12 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
Remove-Item .\testExport.xlsx -ErrorAction Ignore Remove-Item "$env:TEMP\testExport.xlsx" -ErrorAction Ignore
Get-Process | Where-Object Company | Select-Object Company, Name, PM, Handles, *mem* | Get-Process | Where-Object Company | Select-Object Company, Name, PM, Handles, *mem* |
Export-Excel .\testExport.xlsx -Show -AutoSize -AutoNameRange ` #This example creates a 3 Icon set for the values in the "PM column, and Highlights company names (anywhere in the data) with different colors
Export-Excel "$env:TEMP\testExport.xlsx" -Show -AutoSize -AutoNameRange `
-ConditionalFormat $( -ConditionalFormat $(
New-ConditionalFormattingIconSet -Range "C:C" ` New-ConditionalFormattingIconSet -Range "C:C" `
-ConditionalFormat ThreeIconSet -IconType Arrows -ConditionalFormat ThreeIconSet -IconType Arrows

View File

@@ -1,6 +1,4 @@
cls try {ipmo ..\..\ImportExcel.psd1 -Force} catch {}
ipmo ..\..\ImportExcel.psd1 -Force
$data = $( $data = $(
New-PSItem 100 (echo test testx) New-PSItem 100 (echo test testx)
@@ -10,8 +8,8 @@ $data = $(
New-PSItem 500 New-PSItem 500
) )
$file1 = "tryComparison1.xlsx" $file1 = "$env:Temp\tryComparison1.xlsx"
$file2 = "tryComparison2.xlsx" $file2 = "$env:Temp\tryComparison2.xlsx"
rm $file1 -ErrorAction Ignore rm $file1 -ErrorAction Ignore
rm $file2 -ErrorAction Ignore rm $file2 -ErrorAction Ignore
@@ -22,6 +20,6 @@ $data | Export-Excel $file1 -Show -ConditionalText $(
) )
$data | Export-Excel $file2 -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 New-ConditionalText -ConditionalType LessThanOrEqual 250 -BackgroundColor cyan
) )

Binary file not shown.

View File

@@ -0,0 +1,101 @@
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
Australian,25/03/2018,4,Daniel Ricciardo,8,Red Bull Racing-TAG Heuer,12
Australian,25/03/2018,5,Fernando Alonso,10,McLaren-Renault,10
Australian,25/03/2018,6,Max Verstappen,4,Red Bull Racing-TAG Heuer,8
Australian,25/03/2018,7,Nico Hülkenberg,7,Renault,6
Australian,25/03/2018,8,Valtteri Bottas,15,Mercedes,4
Australian,25/03/2018,9,Stoffel Vandoorne,11,McLaren-Renault,2
Australian,25/03/2018,10,Carlos Sainz,9,Renault,1
Bahrain,08/04/2018,1,Sebastian Vettel,1,Ferrari,25
Bahrain,08/04/2018,2,Valtteri Bottas,3,Mercedes,18
Bahrain,08/04/2018,3,Lewis Hamilton,9,Mercedes,15
Bahrain,08/04/2018,4,Pierre Gasly,5,STR-Honda,12
Bahrain,08/04/2018,5,Kevin Magnussen,6,Haas-Ferrari,10
Bahrain,08/04/2018,6,Nico Hülkenberg,7,Renault,8
Bahrain,08/04/2018,7,Fernando Alonso,13,McLaren-Renault,6
Bahrain,08/04/2018,8,Stoffel Vandoorne,14,McLaren-Renault,4
Bahrain,08/04/2018,9,Marcus Ericsson,17,Sauber-Ferrari,2
Bahrain,08/04/2018,10,Esteban Ocon,8,Force India-Mercedes,1
Chinese,15/04/2018,1,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,25
Chinese,15/04/2018,2,Valtteri Bottas,3,Mercedes,18
Chinese,15/04/2018,3,Kimi Räikkönen,2,Ferrari,15
Chinese,15/04/2018,4,Lewis Hamilton,4,Mercedes,12
Chinese,15/04/2018,5,Max Verstappen,5,Red Bull Racing-TAG Heuer,10
Chinese,15/04/2018,6,Nico Hülkenberg,7,Renault,8
Chinese,15/04/2018,7,Fernando Alonso,13,McLaren-Renault,6
Chinese,15/04/2018,8,Sebastian Vettel,1,Ferrari,4
Chinese,15/04/2018,9,Carlos Sainz,9,Renault,2
Chinese,15/04/2018,10,Kevin Magnussen,11,Haas-Ferrari,1
Azerbaijan,29/04/2018,1,Lewis Hamilton,2,Mercedes,25
Azerbaijan,29/04/2018,2,Kimi Räikkönen,6,Ferrari,18
Azerbaijan,29/04/2018,3,Sergio Pérez,8,Force India-Mercedes,15
Azerbaijan,29/04/2018,4,Sebastian Vettel,1,Ferrari,12
Azerbaijan,29/04/2018,5,Carlos Sainz,9,Renault,10
Azerbaijan,29/04/2018,6,Charles Leclerc,13,Sauber-Ferrari,8
Azerbaijan,29/04/2018,7,Fernando Alonso,12,McLaren-Renault,6
Azerbaijan,29/04/2018,8,Lance Stroll,10,Williams-Mercedes,4
Azerbaijan,29/04/2018,9,Stoffel Vandoorne,16,McLaren-Renault,2
Azerbaijan,29/04/2018,10,Brendon Hartley,19,STR-Honda,1
Spanish,13/05/2018,1,Lewis Hamilton,1,Mercedes,25
Spanish,13/05/2018,2,Valtteri Bottas,2,Mercedes,18
Spanish,13/05/2018,3,Max Verstappen,5,Red Bull Racing-TAG Heuer,15
Spanish,13/05/2018,4,Sebastian Vettel,3,Ferrari,12
Spanish,13/05/2018,5,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,10
Spanish,13/05/2018,6,Kevin Magnussen,7,Haas-Ferrari,8
Spanish,13/05/2018,7,Carlos Sainz,9,Renault,6
Spanish,13/05/2018,8,Fernando Alonso,8,McLaren-Renault,4
Spanish,13/05/2018,9,Sergio Pérez,15,Force India-Mercedes,2
Spanish,13/05/2018,10,Charles Leclerc,14,Sauber-Ferrari,1
Monaco,27/05/2018,1,Daniel Ricciardo,1,Red Bull Racing-TAG Heuer,25
Monaco,27/05/2018,2,Sebastian Vettel,2,Ferrari,18
Monaco,27/05/2018,3,Lewis Hamilton,3,Mercedes,15
Monaco,27/05/2018,4,Kimi Räikkönen,4,Ferrari,12
Monaco,27/05/2018,5,Valtteri Bottas,5,Mercedes,10
Monaco,27/05/2018,6,Esteban Ocon,6,Force India-Mercedes,8
Monaco,27/05/2018,7,Pierre Gasly,10,STR-Honda,6
Monaco,27/05/2018,8,Nico Hülkenberg,11,Renault,4
Monaco,27/05/2018,9,Max Verstappen,20,Red Bull Racing-TAG Heuer,2
Monaco,27/05/2018,10,Carlos Sainz,8,Renault,1
Canadian,10/06/2018,1,Sebastian Vettel,1,Ferrari,25
Canadian,10/06/2018,2,Valtteri Bottas,2,Mercedes,18
Canadian,10/06/2018,3,Max Verstappen,3,Red Bull Racing-TAG Heuer,15
Canadian,10/06/2018,4,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,12
Canadian,10/06/2018,5,Lewis Hamilton,4,Mercedes,10
Canadian,10/06/2018,6,Kimi Räikkönen,5,Ferrari,8
Canadian,10/06/2018,7,Nico Hülkenberg,7,Renault,6
Canadian,10/06/2018,8,Carlos Sainz,9,Renault,4
Canadian,10/06/2018,9,Esteban Ocon,8,Force India-Mercedes,2
Canadian,10/06/2018,10,Charles Leclerc,13,Sauber-Ferrari,1
French,24/06/2018,1,Lewis Hamilton,1,Mercedes,25
French,24/06/2018,2,Max Verstappen,4,Red Bull Racing-TAG Heuer,18
French,24/06/2018,3,Kimi Räikkönen,6,Ferrari,15
French,24/06/2018,4,Daniel Ricciardo,5,Red Bull Racing-TAG Heuer,12
French,24/06/2018,5,Sebastian Vettel,3,Ferrari,10
French,24/06/2018,6,Kevin Magnussen,9,Haas-Ferrari,8
French,24/06/2018,7,Valtteri Bottas,2,Mercedes,6
French,24/06/2018,8,Carlos Sainz,7,Renault,4
French,24/06/2018,9,Nico Hülkenberg,12,Renault,2
French,24/06/2018,10,Charles Leclerc,8,Sauber-Ferrari,1
Austrian,01/07/2018,1,Max Verstappen,4,Red Bull Racing-TAG Heuer,25
Austrian,01/07/2018,2,Kimi Räikkönen,3,Ferrari,18
Austrian,01/07/2018,3,Sebastian Vettel,6,Ferrari,15
Austrian,01/07/2018,4,Romain Grosjean,5,Haas-Ferrari,12
Austrian,01/07/2018,5,Kevin Magnussen,8,Haas-Ferrari,10
Austrian,01/07/2018,6,Esteban Ocon,11,Force India-Mercedes,8
Austrian,01/07/2018,7,Sergio Pérez,15,Force India-Mercedes,6
Austrian,01/07/2018,8,Fernando Alonso,20,McLaren-Renault,4
Austrian,01/07/2018,9,Charles Leclerc,17,Sauber-Ferrari,2
Austrian,01/07/2018,10,Marcus Ericsson,18,Sauber-Ferrari,1
British,08/07/2018,1,Sebastian Vettel,2,Ferrari,25
British,08/07/2018,2,Lewis Hamilton,1,Mercedes,18
British,08/07/2018,3,Kimi Räikkönen,3,Ferrari,15
British,08/07/2018,4,Valtteri Bottas,4,Mercedes,12
British,08/07/2018,5,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,10
British,08/07/2018,6,Nico Hülkenberg,11,Renault,8
British,08/07/2018,7,Esteban Ocon,10,Force India-Mercedes,6
British,08/07/2018,8,Fernando Alonso,13,McLaren-Renault,4
British,08/07/2018,9,Kevin Magnussen,7,Haas-Ferrari,2
British,08/07/2018,10,Sergio Pérez,12,Force India-Mercedes,1
1 Race Date FinishPosition Driver GridPosition Team Points
2 Australian 25/03/2018 1 Sebastian Vettel 3 Ferrari 25
3 Australian 25/03/2018 2 Lewis Hamilton 1 Mercedes 18
4 Australian 25/03/2018 3 Kimi Räikkönen 2 Ferrari 15
5 Australian 25/03/2018 4 Daniel Ricciardo 8 Red Bull Racing-TAG Heuer 12
6 Australian 25/03/2018 5 Fernando Alonso 10 McLaren-Renault 10
7 Australian 25/03/2018 6 Max Verstappen 4 Red Bull Racing-TAG Heuer 8
8 Australian 25/03/2018 7 Nico Hülkenberg 7 Renault 6
9 Australian 25/03/2018 8 Valtteri Bottas 15 Mercedes 4
10 Australian 25/03/2018 9 Stoffel Vandoorne 11 McLaren-Renault 2
11 Australian 25/03/2018 10 Carlos Sainz 9 Renault 1
12 Bahrain 08/04/2018 1 Sebastian Vettel 1 Ferrari 25
13 Bahrain 08/04/2018 2 Valtteri Bottas 3 Mercedes 18
14 Bahrain 08/04/2018 3 Lewis Hamilton 9 Mercedes 15
15 Bahrain 08/04/2018 4 Pierre Gasly 5 STR-Honda 12
16 Bahrain 08/04/2018 5 Kevin Magnussen 6 Haas-Ferrari 10
17 Bahrain 08/04/2018 6 Nico Hülkenberg 7 Renault 8
18 Bahrain 08/04/2018 7 Fernando Alonso 13 McLaren-Renault 6
19 Bahrain 08/04/2018 8 Stoffel Vandoorne 14 McLaren-Renault 4
20 Bahrain 08/04/2018 9 Marcus Ericsson 17 Sauber-Ferrari 2
21 Bahrain 08/04/2018 10 Esteban Ocon 8 Force India-Mercedes 1
22 Chinese 15/04/2018 1 Daniel Ricciardo 6 Red Bull Racing-TAG Heuer 25
23 Chinese 15/04/2018 2 Valtteri Bottas 3 Mercedes 18
24 Chinese 15/04/2018 3 Kimi Räikkönen 2 Ferrari 15
25 Chinese 15/04/2018 4 Lewis Hamilton 4 Mercedes 12
26 Chinese 15/04/2018 5 Max Verstappen 5 Red Bull Racing-TAG Heuer 10
27 Chinese 15/04/2018 6 Nico Hülkenberg 7 Renault 8
28 Chinese 15/04/2018 7 Fernando Alonso 13 McLaren-Renault 6
29 Chinese 15/04/2018 8 Sebastian Vettel 1 Ferrari 4
30 Chinese 15/04/2018 9 Carlos Sainz 9 Renault 2
31 Chinese 15/04/2018 10 Kevin Magnussen 11 Haas-Ferrari 1
32 Azerbaijan 29/04/2018 1 Lewis Hamilton 2 Mercedes 25
33 Azerbaijan 29/04/2018 2 Kimi Räikkönen 6 Ferrari 18
34 Azerbaijan 29/04/2018 3 Sergio Pérez 8 Force India-Mercedes 15
35 Azerbaijan 29/04/2018 4 Sebastian Vettel 1 Ferrari 12
36 Azerbaijan 29/04/2018 5 Carlos Sainz 9 Renault 10
37 Azerbaijan 29/04/2018 6 Charles Leclerc 13 Sauber-Ferrari 8
38 Azerbaijan 29/04/2018 7 Fernando Alonso 12 McLaren-Renault 6
39 Azerbaijan 29/04/2018 8 Lance Stroll 10 Williams-Mercedes 4
40 Azerbaijan 29/04/2018 9 Stoffel Vandoorne 16 McLaren-Renault 2
41 Azerbaijan 29/04/2018 10 Brendon Hartley 19 STR-Honda 1
42 Spanish 13/05/2018 1 Lewis Hamilton 1 Mercedes 25
43 Spanish 13/05/2018 2 Valtteri Bottas 2 Mercedes 18
44 Spanish 13/05/2018 3 Max Verstappen 5 Red Bull Racing-TAG Heuer 15
45 Spanish 13/05/2018 4 Sebastian Vettel 3 Ferrari 12
46 Spanish 13/05/2018 5 Daniel Ricciardo 6 Red Bull Racing-TAG Heuer 10
47 Spanish 13/05/2018 6 Kevin Magnussen 7 Haas-Ferrari 8
48 Spanish 13/05/2018 7 Carlos Sainz 9 Renault 6
49 Spanish 13/05/2018 8 Fernando Alonso 8 McLaren-Renault 4
50 Spanish 13/05/2018 9 Sergio Pérez 15 Force India-Mercedes 2
51 Spanish 13/05/2018 10 Charles Leclerc 14 Sauber-Ferrari 1
52 Monaco 27/05/2018 1 Daniel Ricciardo 1 Red Bull Racing-TAG Heuer 25
53 Monaco 27/05/2018 2 Sebastian Vettel 2 Ferrari 18
54 Monaco 27/05/2018 3 Lewis Hamilton 3 Mercedes 15
55 Monaco 27/05/2018 4 Kimi Räikkönen 4 Ferrari 12
56 Monaco 27/05/2018 5 Valtteri Bottas 5 Mercedes 10
57 Monaco 27/05/2018 6 Esteban Ocon 6 Force India-Mercedes 8
58 Monaco 27/05/2018 7 Pierre Gasly 10 STR-Honda 6
59 Monaco 27/05/2018 8 Nico Hülkenberg 11 Renault 4
60 Monaco 27/05/2018 9 Max Verstappen 20 Red Bull Racing-TAG Heuer 2
61 Monaco 27/05/2018 10 Carlos Sainz 8 Renault 1
62 Canadian 10/06/2018 1 Sebastian Vettel 1 Ferrari 25
63 Canadian 10/06/2018 2 Valtteri Bottas 2 Mercedes 18
64 Canadian 10/06/2018 3 Max Verstappen 3 Red Bull Racing-TAG Heuer 15
65 Canadian 10/06/2018 4 Daniel Ricciardo 6 Red Bull Racing-TAG Heuer 12
66 Canadian 10/06/2018 5 Lewis Hamilton 4 Mercedes 10
67 Canadian 10/06/2018 6 Kimi Räikkönen 5 Ferrari 8
68 Canadian 10/06/2018 7 Nico Hülkenberg 7 Renault 6
69 Canadian 10/06/2018 8 Carlos Sainz 9 Renault 4
70 Canadian 10/06/2018 9 Esteban Ocon 8 Force India-Mercedes 2
71 Canadian 10/06/2018 10 Charles Leclerc 13 Sauber-Ferrari 1
72 French 24/06/2018 1 Lewis Hamilton 1 Mercedes 25
73 French 24/06/2018 2 Max Verstappen 4 Red Bull Racing-TAG Heuer 18
74 French 24/06/2018 3 Kimi Räikkönen 6 Ferrari 15
75 French 24/06/2018 4 Daniel Ricciardo 5 Red Bull Racing-TAG Heuer 12
76 French 24/06/2018 5 Sebastian Vettel 3 Ferrari 10
77 French 24/06/2018 6 Kevin Magnussen 9 Haas-Ferrari 8
78 French 24/06/2018 7 Valtteri Bottas 2 Mercedes 6
79 French 24/06/2018 8 Carlos Sainz 7 Renault 4
80 French 24/06/2018 9 Nico Hülkenberg 12 Renault 2
81 French 24/06/2018 10 Charles Leclerc 8 Sauber-Ferrari 1
82 Austrian 01/07/2018 1 Max Verstappen 4 Red Bull Racing-TAG Heuer 25
83 Austrian 01/07/2018 2 Kimi Räikkönen 3 Ferrari 18
84 Austrian 01/07/2018 3 Sebastian Vettel 6 Ferrari 15
85 Austrian 01/07/2018 4 Romain Grosjean 5 Haas-Ferrari 12
86 Austrian 01/07/2018 5 Kevin Magnussen 8 Haas-Ferrari 10
87 Austrian 01/07/2018 6 Esteban Ocon 11 Force India-Mercedes 8
88 Austrian 01/07/2018 7 Sergio Pérez 15 Force India-Mercedes 6
89 Austrian 01/07/2018 8 Fernando Alonso 20 McLaren-Renault 4
90 Austrian 01/07/2018 9 Charles Leclerc 17 Sauber-Ferrari 2
91 Austrian 01/07/2018 10 Marcus Ericsson 18 Sauber-Ferrari 1
92 British 08/07/2018 1 Sebastian Vettel 2 Ferrari 25
93 British 08/07/2018 2 Lewis Hamilton 1 Mercedes 18
94 British 08/07/2018 3 Kimi Räikkönen 3 Ferrari 15
95 British 08/07/2018 4 Valtteri Bottas 4 Mercedes 12
96 British 08/07/2018 5 Daniel Ricciardo 6 Red Bull Racing-TAG Heuer 10
97 British 08/07/2018 6 Nico Hülkenberg 11 Renault 8
98 British 08/07/2018 7 Esteban Ocon 10 Force India-Mercedes 6
99 British 08/07/2018 8 Fernando Alonso 13 McLaren-Renault 4
100 British 08/07/2018 9 Kevin Magnussen 7 Haas-Ferrari 2
101 British 08/07/2018 10 Sergio Pérez 12 Force India-Mercedes 1

View File

@@ -0,0 +1,27 @@
#First 10 races is a CSV file containing the top 10 finishers for the first 10 Formula one races of 2018. Read this file and group the results by race
#We will create links to each race in the first 10 rows of the spreadSheet
#The next row will be column labels
#After that will come a block for each race.
#Read the data, and decide how much space to leave for the hyperlinks
$scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent
$dataPath = Join-Path -Path $scriptPath -ChildPath "First10Races.csv"
$results = Import-Csv -Path $dataPath | Group-Object -Property RACE
$topRow = $lastDataRow = 1 + $results.Count
#Export the first row of the first group (race) with headers.
$path = "$env:TEMP\Results.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue
$excel = $results[0].Group[0] | Export-Excel -Path $path -StartRow $TopRow -BoldTopRow -PassThru
#export each group (race) below the last one, without headers, and create a range for each using the group (Race) name
foreach ($r in $results) {
$excel = $R.Group | Export-Excel -ExcelPackage $excel -NoHeader -StartRow ($lastDataRow +1) -RangeName $R.Name -PassThru -AutoSize
$lastDataRow += $R.Group.Count
}
#Create a hyperlink for each property with display text of "RaceNameGP" which links to the range created when the rows were exported a
$results | ForEach-Object {(New-Object -TypeName OfficeOpenXml.ExcelHyperLink -ArgumentList "Sheet1!$($_.Name)" , "$($_.name) GP")} |
Export-Excel -ExcelPackage $excel -AutoSize -Show

View File

@@ -0,0 +1,15 @@
Remove-item -path ~\documents\music.xlsx
$excel = Get-IndexedItem "itemtype='.mp3'","AlbumArtist like '%'","RatingText <> '1 star'" -NoFiles -orderby AlbumArtist,AlbumTitle,TrackNumber -path c:\users -Recurse -Property AlbumArtist,Duration,title,EncodingBitrate,SampleRate,AlbumTitle,TrackNumber, Size |
Select-Object -Property AlbumArtist, AlbumTitle, TrackNumber, Title, Duration, SampleRate, EncodingBitRate, Size | Export-excel -path ~\documents\music.xlsx -WorksheetName Music -AutoNameRange -AutoSize -BoldTopRow -FreezeTopRow -PassThru
$ws = $excel.Workbook.Worksheets[1]
Set-ExcelColumn -Worksheet $ws -Column 6 -NumberFormat '0,"KHz"'
Set-ExcelColumn -Worksheet $ws -Column 7 -NumberFormat '0,"Kbits/Sec"' -Width 18
Set-ExcelColumn -Worksheet $ws -Column 8 -NumberFormat '#.#,,"MB"' -Width 7
$pt = Add-PivotTable -PivotTableName SpaceUsedByMusic -ExcelPackage $excel -SourceWorkSheet $ws -PivotRows ALBUMARTIST -PivotData @{"Size"="Sum"} -PivotNumberFormat '#.#,,"MB"' -Activate -PassThru
$pt.RowFields[0].Sort = [OfficeOpenXml.Table.PivotTable.eSortType]::Ascending
$a = $ws.Dimension.address
Add-ExcelTable -Range $ws.cells[$a] -TableStyle Light1 -TableName Musictable -ShowFilter:$false -ShowTotal -ShowFirstColumn
Add-ConditionalFormatting -Address $ws.Names[1] -RuleType ContainsText -ConditionValue "Hits" -ForeGroundColor Blue
Add-ConditionalFormatting -Address $ws.Cells["Albumartist"] -RuleType ContainsText -ConditionValue "Numan" -ForeGroundColor red
Close-ExcelPackage -show $excel

View File

@@ -40,4 +40,4 @@ $ptdef = New-PivotTableDefinition -PivotTableName "Summary" -PivotRows "Store" -
#Put in a title and freeze to top of the sheet including title and colmun headings #Put in a title and freeze to top of the sheet including title and colmun headings
#Add the Pivot table. #Add the Pivot table.
#Show the result #Show the result
Join-Worksheet -Path $path -WorkSheetName "Total" -Clearsheet -FromLabel "Store" -TableName "Summary" -TableStyle Light1 -AutoSize -BoldTopRow -FreezePane 2,1 -Title "Store Sales Summary" -TitleBold -TitleSize 14 -PivotTableDefinition $ptdef -show Join-Worksheet -Path $path -WorkSheetName "Total" -Clearsheet -FromLabel "Store" -TableName "Combined" -TableStyle Light1 -AutoSize -BoldTopRow -FreezePane 2,1 -Title "Store Sales Summary" -TitleBold -TitleSize 14 -PivotTableDefinition $ptdef -show

View File

@@ -1,11 +1,13 @@
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
Get-WmiObject -Class win32_logicaldisk | #Export disk volume, and Network adapter to their own sheets.
Get-WmiObject -Class win32_logicaldisk |
Select-Object -Property DeviceId,VolumeName, Size,Freespace | Select-Object -Property DeviceId,VolumeName, Size,Freespace |
Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000" Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000"
Get-NetAdapter | Get-NetAdapter |
Select-Object -Property Name,InterfaceDescription,MacAddress,LinkSpeed | Select-Object -Property Name,InterfaceDescription,MacAddress,LinkSpeed |
Export-Excel -Path $path -WorkSheetname NetAdapters Export-Excel -Path $path -WorkSheetname NetAdapters
#Create a summary page with a title of Summary, label the blocks with the name of the sheet they came from and hide the source sheets
Join-Worksheet -Path $path -HideSource -WorkSheetName Summary -NoHeader -LabelBlocks -AutoSize -Title "Summary" -TitleBold -TitleSize 22 -show Join-Worksheet -Path $path -HideSource -WorkSheetName Summary -NoHeader -LabelBlocks -AutoSize -Title "Summary" -TitleBold -TitleSize 22 -show

View File

@@ -11,12 +11,13 @@ $params = @{
ExcelChartDefinition = New-ExcelChartDefinition -XRange Item -YRange UnitSold -Title 'Units Sold' ExcelChartDefinition = New-ExcelChartDefinition -XRange Item -YRange UnitSold -Title 'Units Sold'
Path = $xlfile Path = $xlfile
} }
#Import 4 sets of sales data from 4 CSV files, using the parameters above.
Import-Csv $PSScriptRoot\NorthSales.csv | Export-Excel -WorkSheetname North @params Import-Csv $PSScriptRoot\NorthSales.csv | Export-Excel -WorkSheetname North @params
Import-Csv $PSScriptRoot\EastSales.csv | Export-Excel -WorkSheetname East @params Import-Csv $PSScriptRoot\EastSales.csv | Export-Excel -WorkSheetname East @params
Import-Csv $PSScriptRoot\SouthSales.csv | Export-Excel -WorkSheetname South @params Import-Csv $PSScriptRoot\SouthSales.csv | Export-Excel -WorkSheetname South @params
Import-Csv $PSScriptRoot\WestSales.csv | Export-Excel -WorkSheetname West @params Import-Csv $PSScriptRoot\WestSales.csv | Export-Excel -WorkSheetname West @params
#Join the 4 worksheets together on a sheet named Allsales, use the same parameters, except for AutoNameRange and ExcelChartDefinition.
$params.Remove("AutoNameRange") $params.Remove("AutoNameRange")
$params.Remove("ExcelChartDefinition") $params.Remove("ExcelChartDefinition")
Join-Worksheet -WorkSheetName AllSales -Show @params Join-Worksheet -WorkSheetName AllSales -Show @params

View File

@@ -0,0 +1,21 @@
Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\Combined*.xlsx" -ErrorAction SilentlyContinue
#Get a subset of services into $s and export them
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property *
$s | Export-Excel -Path $env:temp\server1.xlsx
#$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s.
#Change a row. Add a row. Delete a row. And export the changed $s to a second file.
$s[2].DisplayName = "Changed from the orginal" #This will be row 4 in Excel - this should be highlighted as a change
$d = $s[-1] | Select-Object -Property *
$d.DisplayName = "Dummy Service"
$d.Name = "Dummy"
$s.Insert(3,$d) #This will be row 5 in Excel - this should be highlighted as a new item
$s.RemoveAt(5) #This will be row 7 in Excel - this should be highlighted as deleted item
$s | Export-Excel -Path $env:temp\server2.xlsx
#This use of Merge-worksheet Assumes a default worksheet name, (sheet1) We will check and output Name (the key), DisplayName and StartType and ignore other properties.
Merge-Worksheet -Referencefile "$env:temp\server1.xlsx" -Differencefile "$env:temp\Server2.xlsx" -OutputFile "$env:temp\combined1.xlsx" -Property name,displayname,startType -Key name -Show

View File

@@ -0,0 +1,34 @@
Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\Combined*.xlsx" -ErrorAction SilentlyContinue
#Get a subset of services into $s and export them
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property Name,DisplayName,StartType
$s | Export-Excel -Path $env:temp\server1.xlsx
#$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s.
#Change a row. Add a row. Delete a row. And export the changed $s to a second file.
$row4Displayname = $s[2].DisplayName
$s[2].DisplayName = "Changed from the orginal" #This will be excel row 4 and Server 2 will show as changed.
$d = $s[-1] | Select-Object -Property *
$d.DisplayName = "Dummy Service"
$d.Name = "Dummy"
$s.Insert(3,$d) #This will be Excel row 5 and server 2 will show as changed - so will Server 3
$s.RemoveAt(5) #This will be Excel row 7 and Server 2 will show as missing.
$s | Export-Excel -Path $env:temp\server2.xlsx
#Make some more changes to $s and export it to a third file
$s[2].displayname = $row4Displayname #Server 3 row 4 will match server 1 so won't be highlighted
$d = $s[-1] | Select-Object -Property *
$d.DisplayName = "Second Service"
$d.Name = "Service2"
$s.Insert(6,$d) #This will be an extra row in Server 3 at row 8. It will show as missing in Server 2.
$s.RemoveAt(8) #This will show as missing in Server 3 at row 11 ()
$s | Export-Excel -Path $env:temp\server3.xlsx
#Now bring the three files together.
Merge-MultipleSheets -Path "$env:temp\server1.xlsx", "$env:temp\Server2.xlsx","$env:temp\Server3.xlsx" -OutputFile "$env:temp\combined3.xlsx" -Property name,displayname,startType -Key name -Show

View File

@@ -3,7 +3,7 @@ try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
$xlfile = "$env:TEMP\testThis.xlsx" $xlfile = "$env:TEMP\testThis.xlsx"
Remove-Item $xlfile -ErrorAction Ignore Remove-Item $xlfile -ErrorAction Ignore
1..10 | Export-Excel $xlfile -WorkSheetname First 1..10 | Export-Excel $xlfile -WorkSheetname First #'First' will be the only sheet
11..20 | Export-Excel $xlfile -WorkSheetname Second -MoveToStart 11..20 | Export-Excel $xlfile -WorkSheetname Second -MoveToStart #'Second' is moved before first so the order is 'Second', 'First'
21..30 | Export-Excel $xlfile -WorkSheetname Third -MoveBefore First 21..30 | Export-Excel $xlfile -WorkSheetname Third -MoveBefore First #'Second' is moved before first so the order is 'Second', 'Third', 'First'
31..40 | Export-Excel $xlfile -WorkSheetname Fourth -MoveAfter Third -Show 31..40 | Export-Excel $xlfile -WorkSheetname Fourth -MoveAfter Third -Show #'Fourth' is moved after third so the order is ' 'Second', 'Third', 'Fourth' First'

View File

@@ -1,6 +1,6 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
$file = "disks.xlsx" $file = "$env:TEMP\disks.xlsx"
Remove-Item $file -ErrorAction Ignore Remove-Item $file -ErrorAction Ignore
@@ -11,5 +11,5 @@ $data = $(
New-PSItem -3.2 -4.1 New-PSItem -3.2 -4.1
New-PSItem -5.2 6.1 New-PSItem -5.2 6.1
) )
#Set the numbers throughout the sheet to format as positive in blue with a + sign, negative in Red with a - sign.
$data | Export-Excel -Path $file -Show -AutoSize -NumberFormat "[Blue]+0.#0;[Red]-0.#0" $data | Export-Excel -Path $file -Show -AutoSize -NumberFormat "[Blue]+0.#0;[Red]-0.#0"

View File

@@ -1,6 +1,6 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
$file = "disks.xlsx" $file = "$env:temp\disks.xlsx"
Remove-Item $file -ErrorAction Ignore Remove-Item $file -ErrorAction Ignore
@@ -12,6 +12,5 @@ $data = $(
New-PSItem -5.2 6.1 New-PSItem -5.2 6.1
New-PSItem 1000 -2000 New-PSItem 1000 -2000
) )
#Number format can expand terms like Currency, to the local currency format
$data | Export-Excel -Path $file -Show -AutoSize -NumberFormat '[Blue]$#,##0.00;[Red]-$#,##0.00' $data | Export-Excel -Path $file -Show -AutoSize -NumberFormat 'Currency'

Binary file not shown.

View File

@@ -1,16 +1,20 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
$file = "sales.xlsx" $file = "$env:Temp\sales.xlsx"
Remove-Item $file -ErrorAction Ignore Remove-Item $file -ErrorAction Ignore
#Using -Passthru with Export-Excel returns an Excel Package object.
$xlPkg = Import-Csv .\sales.csv | Export-Excel $file -PassThru $xlPkg = Import-Csv .\sales.csv | Export-Excel $file -PassThru
$ws = $xlPkg.Workbook.WorkSheets[1] #We add script properties to the package so $xlPkg.Sheet1 is equivalent to $xlPkg.Workbook.WorkSheets["Sheet1"]
$ws = $xlPkg.Sheet1
#We can manipulate the cells ...
$ws.Cells["E1"].Value = "TotalSold" $ws.Cells["E1"].Value = "TotalSold"
$ws.Cells["F1"].Value = "Add 10%" $ws.Cells["F1"].Value = "Add 10%"
#This is for illustration - there are more efficient ways to do this.
2..($ws.Dimension.Rows) | 2..($ws.Dimension.Rows) |
ForEach-Object { ForEach-Object {
$ws.Cells["E$_"].Formula = "=C$_+D$_" $ws.Cells["E$_"].Formula = "=C$_+D$_"
@@ -19,7 +23,7 @@ $ws.Cells["F1"].Value = "Add 10%"
$ws.Cells.AutoFitColumns() $ws.Cells.AutoFitColumns()
#You can call close-ExcelPackage $xlPkg -show, but here we will do the ssteps explicitly
$xlPkg.Save() $xlPkg.Save()
$xlPkg.Dispose() $xlPkg.Dispose()
Invoke-Item $file Invoke-Item $file

Binary file not shown.

View File

@@ -1,15 +1,25 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
Remove-Item .\test1.xlsx -ErrorAction Ignore
$ExcelParams = @{ $ExcelParams = @{
Path = ".\test1.xlsx" Path = "$env:TEMP\test1.xlsx"
IncludePivotTable = $true IncludePivotTable = $true
PivotRows = 'Company' PivotRows = 'Company'
PivotTableName = 'MyTable' PivotTableName = 'MyTable'
PivotData = @{'Handles' = 'sum'} PivotData = @{'Handles' = 'sum'}
Show = $true Show = $true
Activate = $true
} }
Remove-Item $ExcelParams.Path -ErrorAction Ignore
Get-Process | Select-Object Company, Handles | Export-Excel @ExcelParams
Get-Process | Select-Object Company, Handles | <# Builds a pivot table that looks like this:
Export-Excel @ExcelParams
Sum of Handles
Row Labels Total
Adobe Systems Incorporated 3100
(blank) 214374
Apple Inc. 215
etc
etc
Grand Total 365625
#>

View File

@@ -0,0 +1,26 @@
$path = "$Env:TEMP\test.xlsx"
remove-item -path $path -ErrorAction SilentlyContinue
#Export some sales data to Excel, format it as a table and put a data-bar in. For this example we won't create the pivot table during the export
$excel = ConvertFrom-Csv @"
Product, City, Gross, Net
Apple, London , 300, 250
Orange, London , 400, 350
Banana, London , 300, 200
Orange, Paris, 600, 500
Banana, Paris, 300, 200
Apple, New York, 1200,700
"@ | Export-Excel -PassThru -Path $path -TableStyle Medium13 -tablename "RawData" -ConditionalFormat @{Range="C2:C7"; DataBarColor="Green"}
#Add a pivot table, specify its address to put it on the same sheet, use the data that was just exported set the table style and number format.
#Use the "City" for the row names, and "Product" for the columnnames, and sum both the gross and net values for each City/Product combination; add grand totals to rows and columns.
# activate the sheet and add a pivot chart (defined in a hash table)
Add-PivotTable -Address $excel.Sheet1.Cells["F1"] -SourceWorkSheet $Excel.Sheet1 -SourceRange $Excel.Sheet1.Dimension.Address -PivotTableName "Sales" -PivotTableSyle "Medium12" -PivotNumberFormat "$#,##0.00" `
-PivotRows "City" -PivotColumns "Product" -PivotData @{Gross="Sum";Net="Sum"}-PivotTotals "Both" -Activate -PivotChartDefinition @{
Title="Gross and net by city and product";
ChartType="ColumnClustered";
Column=11; Width=500; Height=360;
YMajorUnit=500; YMinorUnit=100; YAxisNumberformat="$#,##0"
LegendPostion="Bottom"}
#Save and open in excel
Close-ExcelPackage $excel -Show

Binary file not shown.

View File

@@ -1,6 +1,6 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
$xlFile=".\testPivot.xlsx" $xlFile="$env:TEMP\testPivot.xlsx"
Remove-Item $xlFile -ErrorAction Ignore Remove-Item $xlFile -ErrorAction Ignore
$data =@" $data =@"
@@ -18,4 +18,18 @@ $data |
-AutoSize -AutoFilter ` -AutoSize -AutoFilter `
-IncludePivotTable ` -IncludePivotTable `
-PivotRows Product ` -PivotRows Product `
-PivotData @{"Units"="sum"} -PivotFilter Region, Area -PivotData @{"Units"="sum"} -PivotFilter Region, Area -Activate
<#
Creates a Pivot table that looks like
Region All^
Area All^
Sum of Units
Row Labels Total
Apple 100
Pear 240
Grape 280
Banana 160
Grand Total 780
#>

View File

@@ -1,10 +1,13 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
$p = Get-Process | Select-Object Company, Handles | Export-Excel c:\temp\testBackgroundColor.xlsx -ClearSheet -KillExcel -PassThru $path = "$env:TEMP\testBackgroundColor.xlsx"
$p = Get-Process | Select-Object Company, Handles | Export-Excel $path -ClearSheet -PassThru
$ws = $p.Workbook.WorkSheets[1] $ws = $p.Workbook.WorkSheets[1]
$totalRows = $ws.Dimension.Rows $totalRows = $ws.Dimension.Rows
Set-Format -Address $ws.Cells["B2:B$($totalRows)"] -BackgroundColor LightBlue #Set the range from B2 to the last active row. s
Set-ExcelRange -Range $ws.Cells["B2:B$($totalRows)"] -BackgroundColor LightBlue
Export-Excel -ExcelPackage $p -show -AutoSize Export-Excel -ExcelPackage $p -show -AutoSize

View File

@@ -3,7 +3,7 @@ try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
#. ..\New-PSItem.ps1 #. ..\New-PSItem.ps1
Remove-Item *.xlsx Remove-Item "$env:temp\functions.xlsx" -ErrorAction SilentlyContinue
$( $(
New-PSItem 12001 Nails 37 3.99 =C2*D2 (echo ID Product Quantity Price Total) New-PSItem 12001 Nails 37 3.99 =C2*D2 (echo ID Product Quantity Price Total)
@@ -11,4 +11,4 @@ $(
New-PSItem 12003 Saw 12 15.37 =C4*D4 New-PSItem 12003 Saw 12 15.37 =C4*D4
New-PSItem 12010 Drill 20 8 =C5*D5 New-PSItem 12010 Drill 20 8 =C5*D5
New-PSItem 12011 Crowbar 7 23.48 =C6*D6 New-PSItem 12011 Crowbar 7 23.48 =C6*D6
) | Export-Excel functions.xlsx -AutoSize -Show ) | Export-Excel "$env:temp\functions.xlsx"-AutoSize -Show

View File

@@ -1,6 +1,6 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
Remove-Item *.xlsx Remove-Item "$env:temp\functions.xlsx" -ErrorAction SilentlyContinue
$( $(
New-PSItem =2%/12 60 500000 "=pmt(rate,nper,pv)" (echo rate nper pv pmt) New-PSItem =2%/12 60 500000 "=pmt(rate,nper,pv)" (echo rate nper pv pmt)
@@ -9,4 +9,4 @@ $(
New-PSItem =5%/12 60 500000 "=pmt(rate,nper,pv)" New-PSItem =5%/12 60 500000 "=pmt(rate,nper,pv)"
New-PSItem =6%/12 60 500000 "=pmt(rate,nper,pv)" New-PSItem =6%/12 60 500000 "=pmt(rate,nper,pv)"
New-PSItem =7%/12 60 500000 "=pmt(rate,nper,pv)" New-PSItem =7%/12 60 500000 "=pmt(rate,nper,pv)"
) | Export-Excel functions.xlsx -AutoNameRange -AutoSize -Show ) | Export-Excel "$env:temp\functions.xlsx" -AutoNameRange -AutoSize -Show

View File

@@ -1,10 +1,10 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
Remove-Item *.xlsx Remove-Item "$env:temp\hyperlink.xlsx" -ErrorAction SilentlyContinue
$( $(
New-PSItem '=Hyperlink("http://dougfinke.com/blog","Doug Finke")' @("Link") New-PSItem '=Hyperlink("http://dougfinke.com/blog","Doug Finke")' @("Link")
New-PSItem '=Hyperlink("http://blogs.msdn.com/b/powershell/","PowerShell Blog")' New-PSItem '=Hyperlink("http://blogs.msdn.com/b/powershell/","PowerShell Blog")'
New-PSItem '=Hyperlink("http://blogs.technet.com/b/heyscriptingguy/","Hey, Scripting Guy")' New-PSItem '=Hyperlink("http://blogs.technet.com/b/heyscriptingguy/","Hey, Scripting Guy")'
) | Export-Excel hyperlink.xlsx -AutoSize -Show ) | Export-Excel "$env:temp\hyperlink.xlsx" -AutoSize -Show

Binary file not shown.

View File

@@ -1,7 +1,7 @@
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {} try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
$xlfile = "testData.xlsx" $xlfile = "$env:Temp\testData.xlsx"
Remove-Item *.xlsx Remove-Item $xlfile -ErrorAction SilentlyContinue
$r = Get-ChildItem C:\WINDOWS\system32 $r = Get-ChildItem C:\WINDOWS\system32
@@ -23,16 +23,19 @@ $top10ByFileSize = $r |
Select-Object -First 10 Name, @{n="Size";e={$_.Length}} #,Extension,Path Select-Object -First 10 Name, @{n="Size";e={$_.Length}} #,Extension,Path
$top10BySize | Export-Excel $xlfile -WorkSheetname FileInfo -TableName ExtSize $xlPkg = $top10BySize | Export-Excel -path $xlfile -WorkSheetname FileInfo -TableName ExtSize -PassThru
$top10ByCount | Export-Excel $xlfile -WorkSheetname FileInfo -StartRow 13 -TableName ExtCount $xlPkg = $top10ByCount | Export-Excel -ExcelPackage $xlPkg -WorkSheetname FileInfo -StartRow 13 -TableName ExtCount -PassThru
$top10ByFileSize | Export-Excel $xlfile -WorkSheetname FileInfo -StartRow 25 -AutoSize -TableName FileSize $xlPkg = $top10ByFileSize | Export-Excel -ExcelPackage $xlPkg -WorkSheetname FileInfo -StartRow 25 -TableName FileSize -PassThru -AutoSize
#worksheets.tables["Name1","Name2"] returns 2 tables. Set-ExcelRange can process those and will set the number format over both
Set-ExcelRange -Range $xlpkg.Workbook.Worksheets[1].Tables["ExtSize","FileSize"] -NumberFormat '0,,"MB"'
$ps = Get-Process | Where-Object Company $ps = Get-Process | Where-Object Company
$ps | $ps |
Sort-Object handles -Descending | Sort-Object handles -Descending |
Select-Object -First 10 company, handles | Select-Object -First 10 company, handles |
Export-Excel $xlfile -WorkSheetname Handles -AutoSize -TableName Handles Export-Excel -ExcelPackage $xlPkg -WorkSheetname Handles -AutoSize -TableName Handles
$ps | $ps |
Sort-Object PM -Descending | Sort-Object PM -Descending |

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -25,7 +25,7 @@ Function Get-ExcelTableName {
$Stream.Close() $Stream.Close()
$Stream.Dispose() $Stream.Dispose()
$Excel.Dispose() $Excel.Dispose()
$Excel = $null $Excel = $null
} }
Function Get-ExcelTable { Function Get-ExcelTable {
@@ -66,7 +66,7 @@ Function Get-ExcelTable {
$propertyNames = for($col=$startCol; $col -lt ($startCol+$colCount); $col+= 1) { $propertyNames = for($col=$startCol; $col -lt ($startCol+$colCount); $col+= 1) {
$Worksheet.Cells[$startRow, $col].value $Worksheet.Cells[$startRow, $col].value
} }
$startRow++ $startRow++
for($row=$startRow; $row -lt ($startRow+$rowCount); $row += 1) { for($row=$startRow; $row -lt ($startRow+$rowCount); $row += 1) {
$nr=[ordered]@{} $nr=[ordered]@{}
@@ -92,13 +92,11 @@ function ConvertFrom-ExcelColumnName {
ForEach { ForEach {
$sum*=26 $sum*=26
$sum+=[char]$_.tostring().toupper()-[char]'A'+1 $sum+=[char]$_.tostring().toupper()-[char]'A'+1
} }
$sum $sum
} }
cls
ipmo .\ImportExcel.psd1 -Force 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 Get-ExcelTable .\testTable.xlsx Table3

View File

@@ -4,7 +4,7 @@
RootModule = 'ImportExcel.psm1' RootModule = 'ImportExcel.psm1'
# Version number of this module. # Version number of this module.
ModuleVersion = '5.1.1' ModuleVersion = '5.3.0'
# ID used to uniquely identify this module # ID used to uniquely identify this module
GUID = '60dd4136-feff-401a-ba27-a84458c57ede' GUID = '60dd4136-feff-401a-ba27-a84458c57ede'

View File

@@ -28,6 +28,7 @@
. $PSScriptRoot\New-PSItem.ps1 . $PSScriptRoot\New-PSItem.ps1
. $PSScriptRoot\Open-ExcelPackage.ps1 . $PSScriptRoot\Open-ExcelPackage.ps1
. $PSScriptRoot\Pivot.ps1 . $PSScriptRoot\Pivot.ps1
. $PSScriptRoot\PivotTable.ps1
. $PSScriptRoot\Send-SQLDataToExcel.ps1 . $PSScriptRoot\Send-SQLDataToExcel.ps1
. $PSScriptRoot\Set-CellStyle.ps1 . $PSScriptRoot\Set-CellStyle.ps1
. $PSScriptRoot\Set-Column.ps1 . $PSScriptRoot\Set-Column.ps1
@@ -321,28 +322,25 @@ function Import-Excel {
} }
Process { Process {
Try { #region Open file
#region Open file try {
$Path = (Resolve-Path $Path).ProviderPath $Path = (Resolve-Path $Path).ProviderPath
Write-Verbose "Import Excel workbook '$Path' with worksheet '$Worksheetname'" Write-Verbose "Import Excel workbook '$Path' with worksheet '$Worksheetname'"
$Stream = New-Object -TypeName System.IO.FileStream -ArgumentList $Path, 'Open', 'Read', 'ReadWrite' $Stream = New-Object -TypeName System.IO.FileStream -ArgumentList $Path, 'Open', 'Read', 'ReadWrite'
}
Catch {throw "Could not open $Path ; $_ "}
if ($Password) { if ($Password) {
$Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage Try {$Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage
$excel.Load( $Stream,$Password)}
Try { Catch { throw "Could not read $Path with the provided password." }
$Excel.Load($Stream,$Password) }
} else {
Catch { try {$Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Stream}
throw "Password '$Password' is not correct." Catch {throw "Failed to read $Path"}
} }
} #endregion
else { Try {
$Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Stream
}
#endregion
#region Select worksheet #region Select worksheet
if ($WorksheetName) { if ($WorksheetName) {
if (-not ($Worksheet = $Excel.Workbook.Worksheets[$WorkSheetName])) { if (-not ($Worksheet = $Excel.Workbook.Worksheets[$WorkSheetName])) {

View File

@@ -1,5 +1,4 @@
function Join-Worksheet { function Join-Worksheet {
[CmdletBinding(DefaultParameterSetName = 'Default')]
<# <#
.SYNOPSIS .SYNOPSIS
Combines data on all the sheets in an Excel worksheet onto a single sheet. Combines data on all the sheets in an Excel worksheet onto a single sheet.
@@ -9,31 +8,36 @@
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 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. 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 .EXAMPLE
foreach ($computerName in @('Server1', 'Server2', 'Server3', 'Server4')) {
Get-Service -ComputerName $computerName | Select-Object -Property Status, Name, DisplayName, StartType |
Export-Excel -Path .\test.xlsx -WorkSheetname $computerName -AutoSize
}
$ptDef =New-PivotTableDefinition -PivotTableName "Pivot1" -SourceWorkSheet "Combined" -PivotRows "Status" -PivotFilter "MachineName" -PivotData @{Status='Count'} -IncludePivotChart -ChartType BarClustered3D
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 single Pivot table.
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.
.EXAMPLE .EXAMPLE
Get-WmiObject -Class win32_logicaldisk | select -Property DeviceId,VolumeName, Size,Freespace | >
Export-Excel -Path "$env:computerName.xlsx" -WorkSheetname Volumes -NumberFormat "0,000" PS> foreach ($computerName in @('Server1', 'Server2', 'Server3', 'Server4')) {
Get-NetAdapter | Select-Object Name,InterfaceDescription,MacAddress,LinkSpeed | Get-Service -ComputerName $computerName | Select-Object -Property Status, Name, DisplayName, StartType |
Export-Excel -Path "$env:COMPUTERNAME.xlsx" -WorkSheetname NetAdapter Export-Excel -Path .\test.xlsx -WorkSheetname $computerName -AutoSize
Join-Worksheet -Path "$env:COMPUTERNAME.xlsx" -WorkSheetName Summary -Title "Summary" -TitleBold -TitleSize 22 -NoHeader -LabelBlocks -AutoSize -HideSource -show }
$ptDef =New-PivotTableDefinition -PivotTableName "Pivot1" -SourceWorkSheet "Combined" -PivotRows "Status" -PivotFilter "MachineName" -PivotData @{Status='Count'} -IncludePivotChart -ChartType BarClustered3D
Join-Worksheet -Path .\test.xlsx -WorkSheetName combined -FromLabel "MachineName" -HideSource -AutoSize -FreezeTopRow -BoldTopRow -PivotTableDefinition $pt -Show
The first two command get logical disk and network card information; each type is exported to its own sheet in a workbook. The foreach command gets the services running on four servers and exports each to its own page in Test.xlsx.
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. $PtDef= creates a defintion for a single Pivot table.
Specifying -LabelBlocks causes each sheet's name to become a title on the summary page above the copied data. The Join-Worksheet command uses the same file and merges the results onto a sheet named "Combined". It sets a column header of "Machinename",
The source data is hidden, a title is addded in 22 point boldface and the columns are sized to fit the data. 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.
.EXAMPLE
>
PS> Get-WmiObject -Class win32_logicaldisk | select -Property DeviceId,VolumeName, Size,Freespace |
Export-Excel -Path "$env:computerName.xlsx" -WorkSheetname Volumes -NumberFormat "0,000"
Get-NetAdapter | Select-Object Name,InterfaceDescription,MacAddress,LinkSpeed |
Export-Excel -Path "$env:COMPUTERNAME.xlsx" -WorkSheetname NetAdapter
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.
#> #>
[CmdletBinding(DefaultParameterSetName = 'Default')]
param ( param (
# Path to a new or existing .XLSX file. # Path to a new or existing .XLSX file.
[Parameter(ParameterSetName = "Default", Position = 0)] [Parameter(ParameterSetName = "Default", Position = 0)]
@@ -85,8 +89,9 @@
[Hashtable]$PivotTableDefinition, [Hashtable]$PivotTableDefinition,
#A hashtable containing ChartType, Title, NoLegend, ShowCategory, ShowPercent, Yrange, Xrange and SeriesHeader for one or more [non-pivot] charts. #A hashtable containing ChartType, Title, NoLegend, ShowCategory, ShowPercent, Yrange, Xrange and SeriesHeader for one or more [non-pivot] charts.
[Object[]]$ExcelChartDefinition, [Object[]]$ExcelChartDefinition,
#One or more conditional formatting rules defined with New-ConditionalFormattingIconSet.
[Object[]]$ConditionalFormat, [Object[]]$ConditionalFormat,
#Applies a 'Conditional formatting rule' in Excel on all the cells. When specific conditions are met a rule is triggered. #Applies a Conditional formatting rule defined with New-ConditionalText. When specific conditions are met the format is applied
[Object[]]$ConditionalText, [Object[]]$ConditionalText,
#Makes each column a named range. #Makes each column a named range.
[switch]$AutoNameRange, [switch]$AutoNameRange,
@@ -108,6 +113,7 @@
[String]$TableName, [String]$TableName,
[Parameter(ParameterSetName = 'Table')] [Parameter(ParameterSetName = 'Table')]
[Parameter(ParameterSetName = 'PackageTable')] [Parameter(ParameterSetName = 'PackageTable')]
#Selects the style for the named table - defaults to 'Medium6'.
[OfficeOpenXml.Table.TableStyles]$TableStyle = 'Medium6', [OfficeOpenXml.Table.TableStyles]$TableStyle = 'Medium6',
#Selects the style for the named table - defaults to 'Medium6'. #Selects the style for the named table - defaults to 'Medium6'.
[switch]$ReturnRange, [switch]$ReturnRange,

View File

@@ -72,6 +72,7 @@
$DifferenceObject , $DifferenceObject ,
[parameter(ParameterSetName='D',Position=2)] [parameter(ParameterSetName='D',Position=2)]
[parameter(ParameterSetName='E',Position=3)] [parameter(ParameterSetName='E',Position=3)]
#If there isn't a filename to use to label data from the "Difference" side, DiffPrefix is used, it defaults to "=>"
$DiffPrefix = "=>" , $DiffPrefix = "=>" ,
#File to hold merged data. #File to hold merged data.
[parameter(Position=3)] [parameter(Position=3)]
@@ -255,25 +256,25 @@
$ws = $xl.Workbook.Worksheets[$OutputSheetName] $ws = $xl.Workbook.Worksheets[$OutputSheetName]
for ($i = 0; $i -lt $expandedDiff.Count; $i++ ) { for ($i = 0; $i -lt $expandedDiff.Count; $i++ ) {
if ( $expandedDiff[$i].side -ne "==" ) { if ( $expandedDiff[$i].side -ne "==" ) {
Set-Format -WorkSheet $ws -Range ("A" + ($i + 2 )) -FontColor $KeyFontColor Set-ExcelRange -WorkSheet $ws -Range ("A" + ($i + 2 )) -FontColor $KeyFontColor
} }
elseif ( $HideEqual ) {$ws.row($i+2).hidden = $true } elseif ( $HideEqual ) {$ws.row($i+2).hidden = $true }
if ( $expandedDiff[$i].side -eq "<>" ) { if ( $expandedDiff[$i].side -eq "<>" ) {
$range = $ws.Dimension -replace "\d+", ($i + 2 ) $range = $ws.Dimension -replace "\d+", ($i + 2 )
Set-Format -WorkSheet $ws -Range $range -BackgroundColor $ChangeBackgroundColor Set-ExcelRange -WorkSheet $ws -Range $range -BackgroundColor $ChangeBackgroundColor
} }
elseif ( $expandedDiff[$i].side -eq "<=" ) { elseif ( $expandedDiff[$i].side -eq "<=" ) {
$rangeR1C1 = "R[{0}]C[1]:R[{0}]C[{1}]" -f ($i + 2 ) , $lastRefColNo $rangeR1C1 = "R[{0}]C[1]:R[{0}]C[{1}]" -f ($i + 2 ) , $lastRefColNo
$range = [OfficeOpenXml.ExcelAddress]::TranslateFromR1C1($rangeR1C1,0,0) $range = [OfficeOpenXml.ExcelAddress]::TranslateFromR1C1($rangeR1C1,0,0)
Set-Format -WorkSheet $ws -Range $range -BackgroundColor $DeleteBackgroundColor Set-ExcelRange -WorkSheet $ws -Range $range -BackgroundColor $DeleteBackgroundColor
} }
elseif ( $expandedDiff[$i].side -eq "=>" ) { elseif ( $expandedDiff[$i].side -eq "=>" ) {
if ($propList.count -gt 1) { if ($propList.count -gt 1) {
$rangeR1C1 = "R[{0}]C[{1}]:R[{0}]C[{2}]" -f ($i + 2 ) , $FirstDiffColNo , $lastDiffColNo $rangeR1C1 = "R[{0}]C[{1}]:R[{0}]C[{2}]" -f ($i + 2 ) , $FirstDiffColNo , $lastDiffColNo
$range = [OfficeOpenXml.ExcelAddress]::TranslateFromR1C1($rangeR1C1,0,0) $range = [OfficeOpenXml.ExcelAddress]::TranslateFromR1C1($rangeR1C1,0,0)
Set-Format -WorkSheet $ws -Range $range -BackgroundColor $AddBackgroundColor Set-ExcelRange -WorkSheet $ws -Range $range -BackgroundColor $AddBackgroundColor
} }
Set-Format -WorkSheet $ws -Range ("A" + ($i + 2 )) -BackgroundColor $AddBackgroundColor Set-ExcelRange -WorkSheet $ws -Range ("A" + ($i + 2 )) -BackgroundColor $AddBackgroundColor
} }
} }
Close-ExcelPackage -ExcelPackage $xl -Show:$Show Close-ExcelPackage -ExcelPackage $xl -Show:$Show
@@ -281,8 +282,6 @@
} }
Function Merge-MultipleSheets { Function Merge-MultipleSheets {
[cmdletbinding()]
[Alias("Merge-MulipleSheets")]
<# <#
.Synopsis .Synopsis
Merges worksheets into a single worksheet with differences marked up. Merges worksheets into a single worksheet with differences marked up.
@@ -321,8 +320,10 @@ Function Merge-MultipleSheets {
(the information was obtained by running Get-Hotfix | Sort-Object -Property description,hotfixid | Select-Object -Property Description,HotfixID) (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 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")]
param ( param (
#Paths to the files to be merged.
[Parameter(Mandatory=$true,ValueFromPipeline=$true)] [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
[string[]]$Path , [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 StartRow are disregarded. By default this is the first row.
@@ -433,7 +434,7 @@ Function Merge-MultipleSheets {
$columnNo = $cell.start.Column -1 $columnNo = $cell.start.Column -1
$cellAddr = [OfficeOpenXml.ExcelAddress]::TranslateFromR1C1("R1C$columnNo",1,$columnNo) $cellAddr = [OfficeOpenXml.ExcelAddress]::TranslateFromR1C1("R1C$columnNo",1,$columnNo)
while ($sheet.cells[$cellAddr].value -match $prefix) { while ($sheet.cells[$cellAddr].value -match $prefix) {
$condFormattingParams = @{RuleType='Expression'; BackgroundPattern='None'; WorkSheet=$sheet; Range=$([OfficeOpenXml.ExcelAddress]::TranslateFromR1C1("R[1]C[$columnNo]:R[1048576]C[$columnNo]",0,0)) } $condFormattingParams = @{RuleType='Expression'; BackgroundPattern='Solid'; WorkSheet=$sheet; Range=$([OfficeOpenXml.ExcelAddress]::TranslateFromR1C1("R[1]C[$columnNo]:R[1048576]C[$columnNo]",0,0)) }
Add-ConditionalFormatting @condFormattingParams -ConditionValue ($cell.Address + '="Added"' ) -BackgroundColor $AddBackgroundColor Add-ConditionalFormatting @condFormattingParams -ConditionValue ($cell.Address + '="Added"' ) -BackgroundColor $AddBackgroundColor
Add-ConditionalFormatting @condFormattingParams -ConditionValue ($cell.Address + '="Changed"') -BackgroundColor $ChangeBackgroundColor Add-ConditionalFormatting @condFormattingParams -ConditionValue ($cell.Address + '="Changed"') -BackgroundColor $ChangeBackgroundColor
Add-ConditionalFormatting @condFormattingParams -ConditionValue ($cell.Address + '="Removed"') -BackgroundColor $DeleteBackgroundColor Add-ConditionalFormatting @condFormattingParams -ConditionValue ($cell.Address + '="Removed"') -BackgroundColor $DeleteBackgroundColor

View File

@@ -1,4 +1,27 @@
function New-ConditionalFormattingIconSet { function New-ConditionalFormattingIconSet {
<#
.SYNOPSIS
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
.PARAMETER Range
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
.PARAMETER Reverse
Use the icons in the reverse order.
.Example
$cfRange = [OfficeOpenXml.ExcelAddress]::new($topRow, $column, $lastDataRow, $column)
$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.
#>
param( param(
[Parameter(Mandatory=$true)] [Parameter(Mandatory=$true)]
$Range, $Range,

View File

@@ -1,35 +1,75 @@
function New-ConditionalText { function New-ConditionalText {
<#
.SYNOPSIS
Creates an object which describes a conditional formatting rule for single valued rules
.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.)
The others take a single paramter (top, BottomPercent, GreaterThan, Contains etc)
This command creates an object to describe the last two categories, which can be passed to Export-Excel
.PARAMETER Range
The range of cells that the conditional format applies to; if none is specified the range will be apply to all the data in the sheet
.PARAMETER ConditionalType
One 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
.PARAMETER ConditionalTextColor
The font color for the cell - by default: Dark red
.PARAMETER BackgroundColor
The fill color for the cell - by default: light pink
.PARAMETER PatternType
The Background pattern for the cell - by deault: 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 secind 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.
#>
[cmdletbinding()]
param( param(
#[Parameter(Mandatory=$true)] #[Parameter(Mandatory=$true)]
[Alias("ConditionValue")]
$Text, $Text,
[Alias("ForeGroundColor")]
[System.Drawing.Color]$ConditionalTextColor="DarkRed", [System.Drawing.Color]$ConditionalTextColor="DarkRed",
[System.Drawing.Color]$BackgroundColor="LightPink", [System.Drawing.Color]$BackgroundColor="LightPink",
[String]$Range, [String]$Range,
[OfficeOpenXml.Style.ExcelFillStyle]$PatternType=[OfficeOpenXml.Style.ExcelFillStyle]::Solid, [OfficeOpenXml.Style.ExcelFillStyle]$PatternType=[OfficeOpenXml.Style.ExcelFillStyle]::Solid,
[ValidateSet( [ValidateSet(
"LessThan","LessThanOrEqual","GreaterThan","GreaterThanOrEqual", "LessThan", "LessThanOrEqual", "GreaterThan", "GreaterThanOrEqual",
"NotEqual","Equal","ContainsText","NotContainsText","BeginsWith","EndsWith", "Equal", "NotEqual",
"Last7Days","LastMonth","LastWeek", "Top", "TopPercent", "Bottom", "BottomPercent",
"NextMonth","NextWeek", "ContainsText", "NotContainsText", "BeginsWith", "EndsWith",
"ThisMonth","ThisWeek", "ContainsBlanks", "NotContainsBlanks", "ContainsErrors", "NotContainsErrors",
"Today","Tomorrow","Yesterday", "DuplicateValues", "UniqueValues",
"DuplicateValues", "Tomorrow", "Today", "Yesterday", "Last7Days",
"AboveOrEqualAverage","BelowAverage","AboveAverage", "NextWeek", "ThisWeek", "LastWeek",
"Top", "TopPercent", "ContainsBlanks" "NextMonth", "ThisMonth", "LastMonth",
"AboveAverage", "AboveOrEqualAverage", "BelowAverage", "BelowOrEqualAverage"
)] )]
[Alias("RuleType")]
$ConditionalType="ContainsText" $ConditionalType="ContainsText"
) )
$obj = [PSCustomObject]@{ $obj = [PSCustomObject]@{
Text = $Text Text = $Text
ConditionalTextColor = $ConditionalTextColor ConditionalTextColor = $ConditionalTextColor
ConditionalType = $ConditionalType ConditionalType = $ConditionalType
PatternType = $PatternType PatternType = $PatternType
Range = $Range Range = $Range
BackgroundColor = $BackgroundColor BackgroundColor = $BackgroundColor
} }
$obj.pstypenames.Clear() $obj.pstypenames.Clear()
$obj.pstypenames.Add("ConditionalText") $obj.pstypenames.Add("ConditionalText")
$obj $obj
} }

View File

@@ -1,6 +1,99 @@
function New-ExcelChartDefinition { function New-ExcelChartDefinition {
[cmdletbinding()] <#
.SYNOPSIS
Creates a Definition of a chart which can be added using Export Excel
.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. This command sets up those objects.
.PARAMETER Title
The title for the chart.
.PARAMETER TitleBold
Sets the title in bold face.
.PARAMETER TitleSize
Sets the point size for the title.
.PARAMETER ChartType
One of the built in chart types, such as Pie, ClusteredColumn, Line etc. Defaults to "ColumnStacked".
.PARAMETER XRange
The range of cells containing values for the X-Axis - usually labels.
.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.
.PARAMETER Height
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 postion the chart by a fraction of of a row .
.PARAMETER Column
Column Postion 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 postion the chart by a fraction of 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.
.PARAMETER SeriesHeader
Specify explicit name(s) for the data series, which will appear in the legend/key
.PARAMETER LegendPostion
Location of the key, either left, right, top, bottom or TopRight.
.PARAMETER LegendSize
Font size for the key
.PARAMETER LegendBold
Sets the key in bold type.
.PARAMETER ShowCategory
Attaches a category label in charts which support this.
.PARAMETER ShowPercent
Attaches a pecentage label in charts which support this.
.PARAMETER XAxisTitleText
Specifies a title for the X axis.
.PARAMETER XAxisTitleBold
Sets the X axis title in bold face.
.PARAMETER XAxisTitleSize
Sets the font size for the axis title
.PARAMETER XAxisNumberformat
A number formatting string, like "#,##0.00" for numbers along the X axis
.PARAMETER XMajorUnit
Spacing for the major gridlines / tick marks along the X axis
.PARAMETER XMinorUnit
Spacing for the major gridlines / tick marks along the X axis
.PARAMETER XMaxValue
Maximum value for the scale along the Xaxis
.PARAMETER XMinValue
Minimum value for the scale along the Xaxis
.PARAMETER xAxisPosition
Postion for the X axis (top or bottom)
.PARAMETER YAxisTitleText
Specifies a title for the Y axis.
.PARAMETER YAxisTitleBold
Sets the Y axis title in bold face.
.PARAMETER YAxisTitleSize
Sets the font size for the Y axis title
.PARAMETER YAxisNumberformat
A number formatting string, like "#,##0.00" for numbers on the Y axis
.PARAMETER YMajorUnit
Spacing for the major gridlines / tick marks on the Y axis
.PARAMETER YMinorUnit
Spacing for the major gridlines / tick marks on the Y axis
.PARAMETER YMaxValue
Maximum value on the Yaxis
.PARAMETER YMinValue
Minimum value on the Yaxis
.PARAMETER YAxisPosition
Postion for the Y axis (left or right)
.PARAMETER Header
No longer used. This may be removed in future versions
.Example
>
PS> $cDef = New-ExcelChartDefinition -ChartType line -XRange "X" -YRange "Sinx" -Title "Graph of Sine X" -TitleBold -TitleSize 14 `
-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 `
-SeriesHeader "Sin(x)" -LegendSize 8 -legendBold -LegendPostion Bottom
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.
#>
[Alias("New-ExcelChart")] #This was the former name. The new name reflects that we are defining a chart, not making one in the workbook. [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()]
param( param(
$Title = "Chart Title", $Title = "Chart Title",
$Header, $Header,
@@ -13,8 +106,9 @@ function New-ExcelChartDefinition {
$RowOffSetPixels = 10, $RowOffSetPixels = 10,
$Column = 6, $Column = 6,
$ColumnOffSetPixels = 5, $ColumnOffSetPixels = 5,
[OfficeOpenXml.Drawing.Chart.eLegendPosition]$LegendPostion,
$LegendSize, $LegendSize,
[Switch]$legendBold, [Switch]$LegendBold,
[Switch]$NoLegend, [Switch]$NoLegend,
[Switch]$ShowCategory, [Switch]$ShowCategory,
[Switch]$ShowPercent, [Switch]$ShowPercent,
@@ -53,12 +147,15 @@ function New-ExcelChartDefinition {
RowOffSetPixels = $RowOffSetPixels RowOffSetPixels = $RowOffSetPixels
Column = $Column Column = $Column
ColumnOffSetPixels = $ColumnOffSetPixels ColumnOffSetPixels = $ColumnOffSetPixels
LegendPostion = $LegendPostion
LegendSize = $LegendSize
Legendbold = $LegendBold
NoLegend = $NoLegend -as [Boolean] NoLegend = $NoLegend -as [Boolean]
ShowCategory = $ShowCategory -as [Boolean] ShowCategory = $ShowCategory -as [Boolean]
ShowPercent = $ShowPercent -as [Boolean] ShowPercent = $ShowPercent -as [Boolean]
SeriesHeader = $SeriesHeader
TitleBold = $TitleBold -as [Boolean] TitleBold = $TitleBold -as [Boolean]
TitleSize = $TitleSize TitleSize = $TitleSize
SeriesHeader = $SeriesHeader
XAxisTitleText = $XAxisTitleText XAxisTitleText = $XAxisTitleText
XAxisTitleBold = $XAxisTitleBold -as [Boolean] XAxisTitleBold = $XAxisTitleBold -as [Boolean]
XAxisTitleSize = $XAxisTitleSize XAxisTitleSize = $XAxisTitleSize
@@ -78,4 +175,264 @@ function New-ExcelChartDefinition {
YMinValue = $YMinValue YMinValue = $YMinValue
YAxisPosition = $YAxisPosition YAxisPosition = $YAxisPosition
} }
} }
function Add-ExcelChart {
<#
.SYNOPSIS
Creates a chart in an existing Excel worksheet
.DESCRIPTION
Creates a chart. It is possible to configure the type of chart, the range of X values (labels) and Y values.
the title, the legend, the ranges for both axes, the format and postion of the axes.
Normally the command does not return anything, but if -passthru is specified the chart is returned so that it can be customized.
.PARAMETER Worksheet
An exisiting Sheet where the chart will be created.
.PARAMETER Title
The title for the chart.
.PARAMETER TitleBold
Sets the title in bold face.
.PARAMETER TitleSize
Sets the point size for the title.
.PARAMETER ChartType
One of the built in chart types, such as Pie, ClusteredColumn, Line etc. Defaults to "ColumnStacked".
.PARAMETER XRange
The range of cells containing values for the X-Axis - usually labels.
.PARAMETER YRange
The range(s) of cells holding values for the Y-Axis - usually "data".
.PARAMETER PivotTable
Instead of specify X and Y ranges, get data from a PivotTable by passing a PivotTable Object.
.PARAMETER Width
Width of the chart in Pixels. Defaults to 500.
.PARAMETER Height
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 postion the chart by a fraction of of a row .
.PARAMETER Column
Column Postion 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 postion the chart by a fraction of 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.
.PARAMETER SeriesHeader
Specify explicit name(s) for the data series, which will appear in the legend/key
.PARAMETER LegendPostion
Location of the key, either left, right, top, bottom or TopRight.
.PARAMETER LegendSize
Font size for the key
.PARAMETER LegendBold
Sets the key in bold type.
.PARAMETER ShowCategory
Attaches a category label in charts which support this.
.PARAMETER ShowPercent
Attaches a pecentage label in charts which support this.
.PARAMETER XAxisTitleText
Specifies a title for the X axis.
.PARAMETER XAxisTitleBold
Sets the X axis title in bold face.
.PARAMETER XAxisTitleSize
Sets the font size for the axis title
.PARAMETER XAxisNumberformat
A number formatting string, like "#,##0.00" for numbers along the X axis
.PARAMETER XMajorUnit
Spacing for the major gridlines / tick marks along the X axis
.PARAMETER XMinorUnit
Spacing for the major gridlines / tick marks along the X axis
.PARAMETER XMaxValue
Maximum value for the scale along the Xaxis
.PARAMETER XMinValue
Minimum value for the scale along the Xaxis
.PARAMETER xAxisPosition
Postion for the X axis (top or bottom)
.PARAMETER YAxisTitleText
Specifies a title for the Y axis.
.PARAMETER YAxisTitleBold
Sets the Y axis title in bold face.
.PARAMETER YAxisTitleSize
Sets the font size for the Y axis title
.PARAMETER YAxisNumberformat
A number formatting string, like "#,##0.00" for numbers on the Y axis
.PARAMETER YMajorUnit
Spacing for the major gridlines / tick marks on the Y axis
.PARAMETER YMinorUnit
Spacing for the major gridlines / tick marks on the Y axis
.PARAMETER YMaxValue
Maximum value on the Yaxis
.PARAMETER YMinValue
Minimum value on the Yaxis
.PARAMETER YAxisPosition
Postion for the Y axis (left or right)
.PARAMETER PassThru
Add-Excel chart doesn't normally return anything, but if -PassThru is specified it returns the newly created chart to allow it to be fine tuned
.EXAMPLE
>
PS> $Excel = ConvertFrom-Csv @"
Product, City, Sales
Apple, London , 300
Orange, London , 400
Banana, London , 300
Orange, Paris, 600
Banana, Paris, 300
Apple, New York, 1200
"@ | Export-Excel -Path test.xlsx -PassThru
Add-ExcelChart -Worksheet $Excel.Workbook.Worksheets[1] -ChartType "Doughnut" -XRange "A2:B7" -YRange "C2:C7" -width 500
Close-ExcelPackage -Show $Excel
The first command expands a multi-line string into 6 rows of data which is exported to new Excel file; leaving an ExcelPackage object in $excel
The second command adds a chart - the cell ranges are explitly specified. Note the at the XRange (labels) is TWO columns wide and the chart will
combine the name of the product and the name of the City to create the table.
The width of the chart is set explictly, the default legend is used and there is no Chart title.
.EXAMPLE
>
PS> $Excel = Invoke-Sum (Get-Process) Company Handles, PM, VirtualMemorySize | Export-Excel $path -AutoSize -ExcelChartDefinition $c -AutoNameRange -PassThru
Add-ExcelChart -Worksheet $Excel.Workbook.Worksheets[1] -Title "VM use" -ChartType PieExploded3D -XRange "Name" -YRange "VirtualMemorySize" -NoLegend -ShowCategory
Close-ExcelPackage $Excel -Show
The first line exports information and creates named ranges for each column.
The Second line uses the ranges to specify a chart - the labels come from the range "Name" and the data from the range "VirtualMemorySize"
The chart is specified as a 3D exploded PIE chart, with a title of "VM Use" and instead of a legend the the pie slices are identified with a label.
.EXAMPLE
>
PS> $Excel = Invoke-Sum (Get-Process) Company Handles, PM, VirtualMemorySize | Export-Excel test.xlsx -TableName Processes -PassThru
Add-ExcelChart -Worksheet $Excel.Workbook.Worksheets[1] -Title Stats -ChartType LineMarkersStacked -XRange "Processes[Name]" -YRange "Processes[PM]", "Processes[VirtualMemorySize]" -SeriesHeader 'PM', 'VMSize'
Close-ExcelPackage $Excel -Show
The first line exports information to a table in new file; and captures the excel Package object in $Excel
The second line creates a chart on the first page of the work sheet, using the notation "TableName[ColumnnName]" to refer to the data,
the labels come Name column in the table, and the data series from its PM and VirtualMemorySize columns. The display names for these in the header are set to PM and VMSize
.EXAMPLE
>
PS> $excel = 0..360 | ForEach-Object {[pscustomobject][ordered]@{x = $_; Sinx = "=Sin(Radians(x)) "}} | Export-Excel -AutoNameRange -Path Text.xlsx -WorkSheetname SinX -PassThru
Add-ExcelChart -Worksheet $excel.Workbook.Worksheets["Sinx"] -ChartType line -XRange "X" -YRange "Sinx" -Title "Graph of Sine X" -TitleBold -TitleSize 14 `
-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 `
-SeriesHeader "Sin(x)" -LegendSize 8 -legendBold -LegendPostion Bottom
Close-ExcelPackage $Excel -Show
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 ranges for the two columns - "X" and "SinX" respectively
The Add-Excel chart colum adds a chart to that work sheet, specifying a line chart with the X values comming from named range "X" and the the Y values comming the range named "SinX".
The chart has a title, and is positioned to the right of column 2 and sized 8000 pixels wide
Thed X axis s labeled "Degrees", in bold 12 point type and runs from 0 to 361 with labels every 30, and minor tick marks every 10. Degres are shown badded to 3 didits.
The Y axis is labeled "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 show 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)"
#>
[cmdletbinding(DefaultParameterSetName='Worksheet')]
[OutputType([OfficeOpenXml.Drawing.Chart.ExcelChart])]
param(
[Parameter(ParameterSetName='Workshet',Mandatory=$true)]
[OfficeOpenXml.ExcelWorksheet]$Worksheet,
[Parameter(ParameterSetName='PivotTable',Mandatory=$true)]
[OfficeOpenXml.Table.PivotTable.ExcelPivotTable]$PivotTable ,
[String]$Title,
#$Header, Not used but referenced previously
[OfficeOpenXml.Drawing.Chart.eChartType]$ChartType = "ColumnStacked",
$XRange,
$YRange,
[int]$Width = 500,
[int]$Height = 350,
[int]$Row = 0,
[int]$RowOffSetPixels = 10,
[int]$Column = 6,
[int]$ColumnOffSetPixels = 5,
[OfficeOpenXml.Drawing.Chart.eLegendPosition]$LegendPostion,
$LegendSize,
[Switch]$LegendBold,
[Switch]$NoLegend,
[Switch]$ShowCategory,
[Switch]$ShowPercent,
$SeriesHeader,
[Switch]$TitleBold,
[Int]$TitleSize ,
[String]$XAxisTitleText,
[Switch]$XAxisTitleBold,
$XAxisTitleSize ,
[string]$XAxisNumberformat,
$XMajorUnit,
$XMinorUnit,
$XMaxValue,
$XMinValue,
[OfficeOpenXml.Drawing.Chart.eAxisPosition]$XAxisPosition ,
[String]$YAxisTitleText,
[Switch]$YAxisTitleBold,
$YAxisTitleSize,
[string]$YAxisNumberformat,
$YMajorUnit,
$YMinorUnit,
$YMaxValue,
$YMinValue,
[OfficeOpenXml.Drawing.Chart.eAxisPosition]$YAxisPosition,
[Switch]$PassThru
)
try {
if ($PivotTable) {
$Worksheet = $PivotTable.WorkSheet
$chart = $Worksheet.Drawings.AddChart(("Chart" + $PivotTable.Name ),$ChartType,$PivotTable)
}
else {
$ChartName = 'Chart' + (Split-Path -Leaf ([System.IO.path]::GetTempFileName())) -replace 'tmp|\.', ''
$chart = $Worksheet.Drawings.AddChart($ChartName, $ChartType)
$chartDefCount = @($YRange).Count
if ($chartDefCount -eq 1) {
$Series = $chart.Series.Add($YRange, $XRange)
if ($SeriesHeader) { $Series.Header = $SeriesHeader}
else { $Series.Header = 'Series 1'}
}
else {
for ($idx = 0; $idx -lt $chartDefCount; $idx += 1) {
$Series = $chart.Series.Add($YRange[$idx], $XRange)
if ($SeriesHeader.Count -gt 0) { $Series.Header = $SeriesHeader[$idx] }
else { $Series.Header = "Series $($idx)"}
}
}
}
if ($Title) {
$chart.Title.Text = $Title
if ($TitleBold) {$chart.Title.Font.Bold = $true}
if ($TitleSize) {$chart.Title.Font.Size = $TitleSize}
}
if ($NoLegend) { $chart.Legend.Remove() }
else {
if ($LegendPostion) {$Chart.Legend.Position = $LegendPostion}
if ($LegendSize) {$chart.Legend.Font.Size = $LegendSize}
if ($legendBold) {$chart.Legend.Font.Bold = $true}
}
if ($XAxisTitleText) {
$chart.XAxis.Title.Text = $XAxisTitleText
if ($XAxisTitleBold) {$chart.XAxis.Title.Font.Bold = $true}
if ($XAxisTitleSize) {$chart.XAxis.Title.Font.Size = $XAxisTitleSize}
}
if ($XAxisPosition) {Write-Warning "X Axis position is not being set propertly at the moment, parameter ignored" }
#$chart.ChartXml.chartSpace.chart.plotArea.catAx.axPos.val = $XAxisPosition.ToString().substring(0,1)}
if ($XMajorUnit) {$chart.XAxis.MajorUnit = $XMajorUnit}
if ($XMinorUnit) {$chart.XAxis.MinorUnit = $XMinorUnit}
if ($null -ne $XMinValue) {$chart.XAxis.MinValue = $XMinValue}
if ($null -ne $XMaxValue) {$chart.XAxis.MaxValue = $XMaxValue}
if ($XAxisNumberformat) {$chart.XAxis.Format = (Expand-NumberFormat $XAxisNumberformat)}
if ($YAxisTitleText) {
$chart.YAxis.Title.Text = $YAxisTitleText
if ($YAxisTitleBold) {$chart.YAxis.Title.Font.Bold = $true}
if ($YAxisTitleSize) {$chart.YAxis.Title.Font.Size = $YAxisTitleSize}
}
if ($YAxisPosition) {Write-Warning "Y Axis position is not being set propertly at the moment, parameter ignored" }
#$chart.ChartXml.chartSpace.chart.plotArea.valAx.axPos.val= $YAxisPosition.ToString().substring(0,1)}
if ($YMajorUnit) {$chart.YAxis.MajorUnit = $YMajorUnit}
if ($YMinorUnit) {$chart.YAxis.MinorUnit = $YMinorUnit}
if ($null -ne $YMinValue){$chart.YAxis.MinValue = $YMinValue}
if ($null -ne $YMaxValue){$chart.YAxis.MaxValue = $YMaxValue}
if ($YAxisNumberformat) {$chart.YAxis.Format = (Expand-NumberFormat $YAxisNumberformat)}
if ($null -ne $chart.Datalabel) {
$chart.Datalabel.ShowCategory = [boolean]$ShowCategory
$chart.Datalabel.ShowPercent = [boolean]$ShowPercent
}
$chart.SetPosition($Row, $RowOffsetPixels, $Column, $ColumnOffsetPixels)
$chart.SetSize($Width, $Height)
if ($PassThru) {return $chart}
}
catch {Write-Warning -Message "Failed adding Chart to worksheet '$($WorkSheet).name': $_"}
}

View File

@@ -1,21 +1,39 @@
Function Open-ExcelPackage { Function Open-ExcelPackage {
<# <#
.Synopsis .Synopsis
Returns an Excel Package Object with for the specified XLSX ile Returns an Excel Package Object for the specified XLSX file
.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.
.Example .Example
$excel = Open-ExcelPackage -path $xlPath >
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"
.Example
>
PS> $excel = Open-ExcelPackage -path "$xlPath" -Password $password
$sheet1 = $excel.Workbook.Worksheets["sheet1"] $sheet1 = $excel.Workbook.Worksheets["sheet1"]
Set-Format -Address $sheet1.Cells["E1:S1048576"], $sheet1.Cells["V1:V1048576"] -NFormat ([cultureinfo]::CurrentCulture.DateTimeFormat.ShortDatePattern) Set-ExcelRange -Range $sheet1.Cells["E1:S1048576"], $sheet1.Cells["V1:V1048576"] -NFormat ([cultureinfo]::CurrentCulture.DateTimeFormat.ShortDatePattern)
Close-ExcelPackage $excel -Show Close-ExcelPackage $excel -Show
This will open the file at $xlPath, select sheet1 apply formatting to two blocks of the sheet and save the package, and launch it in 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])] [OutputType([OfficeOpenXml.ExcelPackage])]
Param ( Param (
#The Path to the file to open #The Path to the file to open
[Parameter(Mandatory=$true)]$Path, [Parameter(Mandatory=$true)]$Path,
#If specified, any running instances of Excel will be terminated before opening the file. #If specified, any running instances of Excel will be terminated before opening the file.
[switch]$KillExcel, [switch]$KillExcel,
#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 only opens an existing file; -Create instructs it to create a new file if required.
[switch]$Create [switch]$Create
) )
@@ -27,7 +45,7 @@
$Path = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path) $Path = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path)
#If -Create was not specified only open the file if it exists already (send a warning if it doesn't exist). #If -Create was not specified only open the file if it exists already (send a warning if it doesn't exist).
if ($Create) { if ($Create -and -not (Test-Path -Path $path)) {
#Create the directory if required. #Create the directory if required.
$targetPath = Split-Path -Parent -Path $Path $targetPath = Split-Path -Parent -Path $Path
if (!(Test-Path -Path $targetPath)) { if (!(Test-Path -Path $targetPath)) {
@@ -36,32 +54,71 @@
} }
New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path
} }
elseif (Test-Path -Path $path) {New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path } elseif (Test-Path -Path $path) {
if ($Password) {$pkgobj = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path , $Password }
else {$pkgobj = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path }
if ($pkgobj) {
foreach ($w in $pkgobj.Workbook.Worksheets) {
$sb = [scriptblock]::Create(('$this.workbook.Worksheets["{0}"]' -f $w.name))
Add-Member -InputObject $pkgobj -MemberType ScriptProperty -Name $w.name -Value $sb
}
return $pkgobj
}
}
else {Write-Warning "Could not find $path" } else {Write-Warning "Could not find $path" }
} }
Function Close-ExcelPackage { Function Close-ExcelPackage {
<# <#
.Synopsis .Synopsis
Closes an Excel Package, saving, saving under a new name or abandoning changes and opening the file in Excel as required. Closes an Excel Package, saving, saving under a new name or abandoning changes and opening the file in Excel as required.
#> .Description
When working with an Excel packaage object the workbook is held in memory and not saved until the Save() method of the package is called.
Close package saves and disposes of the package object. It can be called with -NoSave to abandon the file without saving, with a new "SaveAs" filename
with a password to protect the file. And with Show to open it in Excel. -Calculate will try to update the workbook, although not everything can be recalculated
.Example
Close-ExcelPackage -show $excel
$excel holds a package object, this saves the workbook and loads it into Excel.
.Example
Close-ExcelPackage -NoSave $excel
$excel holds a package object, this disposes of it without writing it to disk.
#>
[CmdLetBinding()]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword","")]
Param ( Param (
#File to close. #Package to close.
[parameter(Mandatory=$true, ValueFromPipeline=$true)] [parameter(Mandatory=$true, ValueFromPipeline=$true)]
[OfficeOpenXml.ExcelPackage]$ExcelPackage, [OfficeOpenXml.ExcelPackage]$ExcelPackage,
#Open the file. #Open the file in Excel.
[switch]$Show, [switch]$Show,
#Abandon the file without saving. #Abandon the file without saving.
[Switch]$NoSave, [Switch]$NoSave,
#Save file with a new name (ignored if -NoSave Specified). #Save file with a new name (ignored if -NoSave Specified).
$SaveAs $SaveAs,
#Password to protect the file.
[ValidateNotNullOrEmpty()]
[String]$Password,
#Attempt to recalculation the workbook before saving
[switch]$Calculate
) )
if ( $NoSave) {$ExcelPackage.Dispose()} if ( $NoSave) {$ExcelPackage.Dispose()}
else { else {
if ($SaveAs) {$ExcelPackage.SaveAs( $SaveAs ) } if ($Calculate) {
Else {$ExcelPackage.Save(); $SaveAs = $ExcelPackage.File.FullName } try { [OfficeOpenXml.CalculationExtension]::Calculate($ExcelPackage.Workbook) }
Catch { Write-Warning "One or more errors occured while calculating, save will continue, but there may be errors in the workbook."}
}
if ($SaveAs) {
$SaveAs = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($SaveAs)
if ($Password) {$ExcelPackage.SaveAs( $SaveAs, $Password ) }
else {$ExcelPackage.SaveAs( $SaveAs)}
}
Else {
if ($Password) {$ExcelPackage.Save($Password) }
else {$ExcelPackage.Save() }
$SaveAs = $ExcelPackage.File.FullName
}
$ExcelPackage.Dispose() $ExcelPackage.Dispose()
if ($show) {Start-Process -FilePath $SaveAs } if ($Show) {Start-Process -FilePath $SaveAs }
} }
} }

338
PivotTable.ps1 Normal file
View File

@@ -0,0 +1,338 @@
function Add-PivotTable {
<#
.Synopsis
Adds a Pivot table (and optional pivot chart) to a workbook
.Description
If the pivot table already exists, the source data will be updated.
.Example
>
PS> $excel = Get-Service | Export-Excel -Path test.xlsx -WorksheetName Services -PassThru -AutoSize -DisplayPropertySet -TableName ServiceTable -Title "Services on $Env:COMPUTERNAME"
Add-PivotTable -ExcelPackage $excel -PivotTableName ServiceSummary -SourceRange $excel.Workbook.Worksheets[1].Tables[0].Address -PivotRows Status -PivotData Name -NoTotalsInPivot -Activate
Close-ExcelPackage $excel -Show
This exports data to new workbook and creates a table with the data in.
The Pivot table is added on its own page, the table created in the first command is used as the source for the PivotTable; which counts the service names in for each Status. At the end the Pivot page is made active.
.Example
>
PS> $chartdef = New-ExcelChartDefinition -Title "Gross and net by city and product" -ChartType ColumnClustered `
-Column 11 -Width 500 -Height 360 -YMajorUnit 500 -YMinorUnit 100 -YAxisNumberformat "$#,##0" -LegendPostion Bottom
$excel = ConvertFrom-Csv @"
Product, City, Gross, Net
Apple, London , 300, 250
Orange, London , 400, 350
Banana, London , 300, 200
Orange, Paris, 600, 500
Banana, Paris, 300, 200
Apple, New York, 1200,700
"@ | Export-Excel -Path "test.xlsx" -TableStyle Medium13 -tablename "RawData" -PassThru
Add-PivotTable -PivotTableName Sales -Address $excel.Workbook.Worksheets[1].Cells["F1"] `
-SourceWorkSheet $excel.Workbook.Worksheets[1] -PivotRows City -PivotColumns Product -PivotData @{Gross="Sum";Net="Sum"} `
-PivotNumberFormat "$#,##0.00" -PivotTotals Both -PivotTableSyle Medium12 -PivotChartDefinition $chartdef
Close-ExcelPackage -show $excel
This script starts by defining a chart. Then it exports some data to an XLSX file and keeps the file open.
The next step is to add the pivot table, normally this would be on its own sheeet in the workbook,
but here -Address is specified to place it beside the data. The Add-Pivot table is given the chart definition and told to create a tale
using the City field to create rows, the Product field to create columns and the data should be the sum of the gross field and the sum of the net field;
grand totals for both gross and net are included for rows (Cities) and columns (product) and the the data is explicitly formatted as a currency.
Not that in thee the chart definition the number format for the axis does not include any fraction part
#>
[cmdletbinding(defaultParameterSetName='ChartbyParams')]
[OutputType([OfficeOpenXml.Table.PivotTable.ExcelPivotTable])]
param (
#Name for the new Pivot table - this will be the name of a sheet in the workbook
[Parameter(Mandatory = $true)]
[string]$PivotTableName,
#By default a pivot table will be created on its own sheet, but it can be created on an existing sheet by giving the address where the top left corner of the table should go. (Allow two rows for the filter if one is used.)
[OfficeOpenXml.ExcelAddressBase]
$Address,
#An excel package object for the workbook.
$ExcelPackage,
#Worksheet where the data is found
$SourceWorkSheet,
#Address range in the worksheet e.g "A10:F20" - the first row must be column names: if not specified the whole sheet will be used.
$SourceRange,
#Fields to set as rows in the Pivot table
$PivotRows,
#A hash table in form "FieldName"="Function", where function is one of
#Average, Count, CountNums, Max, Min, Product, None, StdDev, StdDevP, Sum, Var, VarP
$PivotData,
#Fields to set as columns in the Pivot table
$PivotColumns,
#Fields to use to filter in the Pivot table
$PivotFilter,
#If there are multiple datasets in a PivotTable, by default they are shown seperatate rows under the given row heading; this switch makes them seperate columns.
[Switch]$PivotDataToColumn,
#Define whther totals should be added to rows, columns neither, or both (the default is both)
[ValidateSet("Both","Columns","Rows","None")]
[String]$PivotTotals = "Both",
#Included for compatibility - equivalent to -PivotTotals "None"
[Switch]$NoTotalsInPivot,
#Number format to apply to the data cells in the Pivot table
[string]$PivotNumberFormat,
#Apply a table style to the PivotTable
[OfficeOpenXml.Table.TableStyles]$PivotTableSyle,
#Use a chart definition instead of specifying chart settings one by one
[Parameter(ParameterSetName='ChartbyDef', Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
$PivotChartDefinition,
#If specified a chart Will be included.
[Parameter(ParameterSetName='ChartbyParams')]
[Switch]$IncludePivotChart,
#Optional title for the pivot chart, by default the title omitted.
[Parameter(ParameterSetName='ChartbyParams')]
[String]$ChartTitle = "",
#Height of the chart in Pixels (400 by default)
[Parameter(ParameterSetName='ChartbyParams')]
[int]$ChartHeight = 400 ,
#Width of the chart in Pixels (600 by default)
[Parameter(ParameterSetName='ChartbyParams')]
[int]$ChartWidth = 600,
#Cell position of the top left corner of the chart, there will be this number of rows above the top edge of the chart (default is 0, chart starts at top edge of row 1).
[Parameter(ParameterSetName='ChartbyParams')]
[Int]$ChartRow = 0 ,
#Cell position of the top left corner of the chart, there will be this number of cells to the left of the chart (default is 4, chart starts at left edge of column E)
[Parameter(ParameterSetName='ChartbyParams')]
[Int]$ChartColumn = 4,
#Vertical offset of the chart from the cell corner.
[Parameter(ParameterSetName='ChartbyParams')]
[Int]$ChartRowOffSetPixels = 0 ,
[Parameter(ParameterSetName='ChartbyParams')]
#Horizontal offset of the chart from the cell corner.
[Int]$ChartColumnOffSetPixels = 0,
#Type of chart
[Parameter(ParameterSetName='ChartbyParams')]
[OfficeOpenXml.Drawing.Chart.eChartType]$ChartType = 'Pie',
#If specified hides the chart legend
[Parameter(ParameterSetName='ChartbyParams')]
[Switch]$NoLegend,
#if specified attaches the category to slices in a pie chart : not supported on all chart types, this may give errors if applied to an unsupported type.
[Parameter(ParameterSetName='ChartbyParams')]
[Switch]$ShowCategory,
#If specified attaches percentages to slices in a pie chart.
[Parameter(ParameterSetName='ChartbyParams')]
[Switch]$ShowPercent,
#If there is already content in the workbook the sheet with the Pivot table will not be active UNLESS Activate is specified
[switch]$Activate,
#Return the pivot table so it can be customized
[Switch]$PassThru
)
if ($PivotTableName.length -gt 250) {
Write-warning -Message "Pivot table name will be truncated"
$PivotTableName = $PivotTableName.Substring(0,250)
}
if ($Address) {
[OfficeOpenXml.ExcelWorksheet]$wsPivot = $address.Worksheet
}
else {
try {
if (-not $ExcelPackage) {Write-Warning -message "This combination of Parameters needs to include the ExcelPackage." ; return }
[OfficeOpenXml.ExcelWorksheet]$wsPivot = Add-WorkSheet -ExcelPackage $ExcelPackage -WorksheetName $pivotTableName -Activate:$Activate
if ($wsPivot.Name -ne $PivotTableName) {Write-Warning -Message "The Worksheet name for the pivot table does not match the table name '$PivotTableName'; probably because excess or illegal characters were removed." }
if ($PivotFilter) {$Address = $wsPivot.Cells["A3"]} else { $Address = $wsPivot.Cells["A1"]}
}
catch {throw "Could not create the sheet for the Pivot table. $_" }
}
#if the pivot doesn't exist, create it.
if (-not $wsPivot) {throw "There was a problem getting the worksheet for the pivot table"}
if (-not $wsPivot.PivotTables[$pivotTableName] ) {
try {
#Accept a string or a worksheet object as $SourceWorksheet - we don't need a worksheet if we have a Rangebase .
if ( $SourceWorkSheet -is [string]) {
$SourceWorkSheet = $ExcelPackage.Workbook.Worksheets.where( {$_.name -Like $SourceWorkSheet})[0]
}
elseif ( $SourceWorkSheet -is [int] ) {
$SourceWorkSheet = $ExcelPackage.Workbook.Worksheets[$SourceWorkSheet]
}
if ( $SourceRange -is [OfficeOpenXml.Table.ExcelTable]) {$SourceRange = $SourceRange.Address }
if ( $sourceRange -is [OfficeOpenXml.ExcelRange] -or
$SourceRange -is [OfficeOpenXml.ExcelAddress]) {
$pivotTable = $wsPivot.PivotTables.Add($Address, $SourceRange, $pivotTableName)
}
elseif (-not $SourceRange) {
$pivotTable = $wsPivot.PivotTables.Add($Address, $SourceWorkSheet.cells[$SourceWorkSheet.Dimension.Address], $pivotTableName)
}
elseif ($SourceWorkSheet -isnot [OfficeOpenXml.ExcelWorksheet] ) {
Write-Warning -Message "Could not find source Worksheet for pivot-table '$pivotTableName'." ; return
}
elseif ( $SourceRange -is [String] -or $SourceRange -is [OfficeOpenXml.ExcelAddress]) {
$pivotTable = $wsPivot.PivotTables.Add($Address,$SourceWorkSheet.Cells[$SourceRange], $pivotTableName)
}
else {Write-warning "Could not create a pivot table with the Source Range provided."; return}
foreach ($Row in $PivotRows) {
try {$null = $pivotTable.RowFields.Add($pivotTable.Fields[$Row]) }
catch {Write-Warning -message "Could not add '$row' to Rows in PivotTable $pivotTableName." }
}
foreach ($Column in $PivotColumns) {
try {$null = $pivotTable.ColumnFields.Add($pivotTable.Fields[$Column])}
catch {Write-Warning -message "Could not add '$Column' to Columns in PivotTable $pivotTableName." }
}
if ($PivotData -is [HashTable] -or $PivotData -is [System.Collections.Specialized.OrderedDictionary]) {
$PivotData.Keys | ForEach-Object {
try {
$df = $pivotTable.DataFields.Add($pivotTable.Fields[$_])
$df.Function = $PivotData.$_
if ($PivotNumberFormat) {$df.Format = (Expand-NumberFormat -NumberFormat $PivotNumberFormat)}
}
catch {Write-Warning -message "Problem adding data fields to PivotTable $pivotTableName." }
}
}
else {
foreach ($field in $PivotData) {
try {
$df = $pivotTable.DataFields.Add($pivotTable.Fields[$field])
$df.Function = 'Count'
}
catch {Write-Warning -message "Problem adding data field '$field' to PivotTable $pivotTableName." }
}
}
foreach ( $pFilter in $PivotFilter) {
try { $null = $pivotTable.PageFields.Add($pivotTable.Fields[$pFilter])}
catch {Write-Warning -message "Could not add '$pFilter' to Filter/Page fields in PivotTable $pivotTableName." }
}
if ($NoTotalsInPivot) {$PivotTotals = "None" }
if ($PivotTotals -eq "None" -or $PivotTotals -eq "Columns") { $pivotTable.RowGrandTotals = $false }
elseif ($PivotTotals -eq "Both" -or $PivotTotals -eq "Rows") { $pivotTable.RowGrandTotals = $true }
if ($PivotTotals -eq "None" -or $PivotTotals -eq "Rows") { $pivotTable.ColumGrandTotals = $false } # Epplus spelling mistake, not mine!
elseif ($PivotTotals -eq "Both" -or $PivotTotals -eq "Columns") { $pivotTable.ColumGrandTotals = $true }
if ($PivotDataToColumn ) { $pivotTable.DataOnRows = $false }
if ($PivotTableSyle) { $pivotTable.TableStyle = $PivotTableSyle}
}
catch {Write-Warning -Message "Failed adding PivotTable '$pivotTableName': $_"}
}
else {
Write-Warning -Message "Pivot table defined in $($pivotTableName) already exists, only the data range will be changed."
$pivotTable = $wsPivot.PivotTables[$pivotTableName]
if (-not $SourceRange) { $SourceRange = $SourceWorkSheet.Dimension.Address}
$pivotTable.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref = $SourceRange
}
#Create the chart if it doesn't exist, leave alone if it does.
if ($IncludePivotChart -and -not $wsPivot.Drawings["Chart$pivotTableName"] ) {
try {Add-ExcelChart -PivotTable $pivotTable -ChartType $ChartType -Width $ChartWidth -Height $ChartHeight -Row $ChartRow -Column $ChartColumn -RowOffSetPixels $ChartRowOffSetPixels -ColumnOffSetPixels $ChartColumnOffSetPixels -Title $ChartTitle -NoLegend:$NoLegend -ShowCategory:$ShowCategory -ShowPercent:$ShowPercent }
catch {Write-Warning -Message "Failed adding chart for pivotable '$pivotTableName': $_"}
}
elseif ($PivotChartDefinition -and -not $wsPivot.Drawings["Chart$pivotTableName"]) {
if ($PivotChartDefinition -is [System.Management.Automation.PSCustomObject]) {
$params = @{PivotTable= $pivotTable }
$PivotChartDefinition.PSObject.Properties | ForEach-Object {if ( $null -ne $_.value) {$params[$_.name] = $_.value}}
Add-ExcelChart @params
}
elseif ($PivotChartDefinition -is [hashtable] -or $PivotChartDefinition -is[System.Collections.Specialized.OrderedDictionary]) {
Add-ExcelChart -PivotTable $pivotTable @PivotChartDefinition
}
}
if ($PassThru) {return $pivotTable}
}
function New-PivotTableDefinition {
<#
.Synopsis
Creates Pivot table definitons for Export-Excel
.Description
Export-Excel allows a single Pivot table to be defined using the parameters -IncludePivotTable, -PivotColumns -PivotRows,
=PivotData, -PivotFilter, -PivotTotals, -PivotDataToColumn, -IncludePivotChart and -ChartType.
Its -PivotTableDefintion paramater allows multiple pivot tables to be defined, with additional parameters.
New-PivotTableDefinition is a convenient way to build these definitions.
.Example
>
PS> $pt = New-PivotTableDefinition -PivotTableName "PT1" -SourceWorkSheet "Sheet1" -PivotRows "Status" -PivotData @{Status='Count' } -PivotFilter 'StartType' -IncludePivotChart -ChartType BarClustered3D
$Pt += New-PivotTableDefinition -PivotTableName "PT2" -SourceWorkSheet "Sheet2" -PivotRows "Company" -PivotData @{Company='Count'} -IncludePivotChart -ChartType PieExploded3D -ShowPercent -ChartTitle "Breakdown of processes by company"
Get-Service | Select-Object -Property Status,Name,DisplayName,StartType | Export-Excel -Path .\test.xlsx -AutoSize
Get-Process | Select-Object -Property Name,Company,Handles,CPU,VM | Export-Excel -Path .\test.xlsx -AutoSize -WorksheetName 'sheet2'
$excel = Export-Excel -Path .\test.xlsx -PivotTableDefinition $pt -Show
This is a re-work of one of the examples in Export-Excel - instead of writing out the pivot definition hash table it is built by calling New-PivotTableDefinition.
#>
param(
[Parameter(Mandatory)]
[Alias("PivtoTableName")]#Previous typo - use alias to avoid breaking scripts
$PivotTableName,
#Worksheet where the data is found
$SourceWorkSheet,
#Address range in the worksheet e.g "A10:F20" - the first row must be column names: if not specified the whole sheet will be used/
$SourceRange,
#Fields to set as rows in the Pivot table
$PivotRows,
#A hash table in form "FieldName"="Function", where function is one of
#Average, Count, CountNums, Max, Min, Product, None, StdDev, StdDevP, Sum, Var, VarP
[hashtable]$PivotData,
#Fields to set as columns in the Pivot table
$PivotColumns,
#Fields to use to filter in the Pivot table
$PivotFilter,
#If there are multiple datasets in a PivotTable, by default they are shown seperatate rows under the given row heading; this switch makes them seperate columns.
[Switch]$PivotDataToColumn,
#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.
#Define whther totals should be added to rows, columns neither, or both (the default is both)
[ValidateSet("Both","Columns","Rows","None")]
[String]$PivotTotals = "Both",
#Included for compatibility - equivalent to -PivotTotals "None"
[Switch]$NoTotalsInPivot,
#Number format to apply to the data cells in the Pivot table
[string]$PivotNumberFormat,
#Apply a table style to the PivotTable
[OfficeOpenXml.Table.TableStyles]$PivotTableSyle,
#Use a chart definition instead of specifying chart settings one by one
[Parameter(ParameterSetName='ChartbyDef', Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
$PivotChartDefinition,
#If specified a chart Will be included.
[Parameter(ParameterSetName='ChartbyParams')]
[Switch]$IncludePivotChart,
#Optional title for the pivot chart, by default the title omitted.
[Parameter(ParameterSetName='ChartbyParams')]
[String]$ChartTitle,
#Height of the chart in Pixels (400 by default)
[Parameter(ParameterSetName='ChartbyParams')]
[int]$ChartHeight = 400 ,
#Width of the chart in Pixels (600 by default)
[Parameter(ParameterSetName='ChartbyParams')]
[int]$ChartWidth = 600,
#Cell position of the top left corner of the chart, there will be this number of rows above the top edge of the chart (default is 0, chart starts at top edge of row 1).
[Parameter(ParameterSetName='ChartbyParams')]
[Int]$ChartRow = 0 ,
#Cell position of the top left corner of the chart, there will be this number of cells to the left of the chart (default is 4, chart starts at left edge of column E)
[Parameter(ParameterSetName='ChartbyParams')]
[Int]$ChartColumn = 4,
#Vertical offset of the chart from the cell corner.
[Parameter(ParameterSetName='ChartbyParams')]
[Int]$ChartRowOffSetPixels = 0 ,
#Horizontal offset of the chart from the cell corner.
[Parameter(ParameterSetName='ChartbyParams')]
[Int]$ChartColumnOffSetPixels = 0,
#Type of chart
[Parameter(ParameterSetName='ChartbyParams')]
[OfficeOpenXml.Drawing.Chart.eChartType]$ChartType = 'Pie',
#If specified hides the chart legend
[Parameter(ParameterSetName='ChartbyParams')]
[Switch]$NoLegend,
#if specified attaches the category to slices in a pie chart : not supported on all chart types, this may give errors if applied to an unsupported type.
[Parameter(ParameterSetName='ChartbyParams')]
[Switch]$ShowCategory,
#If specified attaches percentages to slices in a pie chart.
[Parameter(ParameterSetName='ChartbyParams')]
[Switch]$ShowPercent,
#If there is already content in the workbook the sheet with the Pivot table will not be active UNLESS Activate is specified
[switch]$Activate
)
$validDataFuntions = [system.enum]::GetNames([OfficeOpenXml.Table.PivotTable.DataFieldFunctions])
if ($PivotData.values.Where({$_ -notin $validDataFuntions}) ) {
Write-Warning -Message ("Pivot data functions might not be valid, they should be one of " + ($validDataFuntions -join ", ") + ".")
}
$parameters = @{} + $PSBoundParameters
if ($NoTotalsInPivot) {
$parameters.Remove('NoTotalsInPivot')
$parameters["PivotTotals"] = "None"
}
$parameters.Remove('PivotTableName')
if ($PivotChartDefinition) {
$parameters.PivotChartDefinition.XRange = $null
$parameters.PivotChartDefinition.YRange = $null
$parameters.PivotChartDefinition.SeriesHeader = $null
}
@{$PivotTableName = $parameters}
}

View File

@@ -51,12 +51,50 @@ Install-Module ImportExcel -scope CurrentUser
```PowerShell ```PowerShell
Install-Module ImportExcel Install-Module ImportExcel
``` ```
# What's new to Aug 2018
# What's new in Release 5.3
- Help improvements and tidying up of examples and extra examples
- Open-Excel Package and Add-Worksheet now add worksheets as script properties so `$Excel = Open-ExcelPackage -path test.xlsx ; $excel.sheet1` will return the sheet named "sheet1" `$Excel.SheetName` is a script property which is defined as `$this.workbook.worksheets["Sheetname"]`
- Renamed Set-Column to `Set-ExcelColumn`, Set-Row to `Set-ExcelRow`, and Set-Format, to `Set-ExcelRange`. Added aliases so the old names still work.
- `Set-ExcelRange` (or set-Format) used "Address" and "Range" incorrectly. There is now a single parameter `-Range`, with an alias of "Address". If the worksheet parameter is present, the function accepts a string specifying cells ("A1:Z10") or a the name of range. Without the worksheet it accepts an object representing a named range or a Table; or a tables's address, or part of the worksheet.cells collection.
- `Add-ConditionalFormatting`: Used "address" correctly, and it will accept ranges in the address parameter (range is now an alias for address). It now wraps conditional value strings in quotes when needed (for = <= >= operations string needs to be in double quotes see issue #424). Parameter intellisense has been improved. There are new parameters: `-StopIfTrue` and `-Priority` and support for using the `-Reverse` parameter with Color-scale rules (issue #430). 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 the argument completer for -ConditionalTextColor was missing and has been added.
- Improved handling of hyperlinks in `Export-Excel` (see issue #426)s
- `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. It also accepts hash tables for chart, pivot table and conditional formatting parameters which are splatted into the functions which add these.
- 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.) and set options in the totals row.
- 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
- Fixed bug in Merge-MultipleSheets where background pattern was set to None, making background color invisible.
- 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` allows Pivot to be placed on an existing sheet; `-PivotTableStyle` allows a change from "Medium6", `-PivotNumberFormat` formats data cells. It is more flexible about how the source data is specified - copying the range options in Set-ExcelRange. `Add-ExcelChart` is now used for creating PivotCharts, and `-PivotChartDefinition` allows a definition created with `New-ExcelChartDefinition` to be used when setting up a PivotTable. This opens up all the things that Add-ExcelChart 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
- ChartDefinition and conditional formatting parameters can now be hashtables - anything that splats Add-ExcelChart or Add-ConditionalFormatting, it should be acceptable as a definition.
# 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.
- Added support for array formulas in Set-Format (it really should be set range now that it sets values, formulas and hyperlinks - that can go on the to-do list )
- Fixed a bug with -Append in Export-Excel which caused it to overwrite the last row if the new data was a simple type.
- NumberFormat in Export-Excel now sets the default for on a new / blank sheet; but [still] sets individual cells when adding to a sheet
- Added support for timespans in Export excel ; set as elapsed hours, mins, secs [h]:mm:sss
- In Export-Excel improved the catch-all handler for insuring values to cope better with nested objects (#419) and reduce the number of parse operations
- Added -Calculate switch to Export-Excel and Close-Excel Package; EPPlus needs formulas to OMIT the leading = sign so where formula is set it now strips a leading = sign
- Added -PivotTotals parameter where there was already -NoTotalsInPivot new one allows None, Both, Rows, Columns. (#415)
- When appending Export-Excel only extended tables and ranges if they were explicitly specified. It now does it automatically.
- Compare and Merge worksheet originally had a problem with > 26 columns, I fixed merge turns out I hadn't fixed compare ... I have now
- Fixed bug where Export-Excel would not recognize it had to set $TitleFillPattern - made the default 'Solid'
- ExcludeProperty in Export-Excel now supports wildcards.
- Added DateTime to the list of types which can be exported as single column.
- Added Password support to Open- and Close-ExcelPackage (password was not doing anything in Export-Excel)
- Gave Expand-NumberFormat a better grasp of currency layouts - it follows .NET which is not always the same as Excel would set:-(
# What's new in Release 5.1.1
- Set-Row and Set-Column will now create hyperlinks and insert dates correctly - Set-Row and Set-Column will now create hyperlinks and insert dates correctly
- Import-Excel now has an argument completer for Worksheet name - this can be slow on large files - Import-Excel now has an argument completer for Worksheet name - this can be slow on large files
- The NumberFormat parameter (in Export-Excel, Set-Row, Set-Column, Set-Format and Add-ConditionalFormat) and X&YAxisNumberFormat parameters (in New-ExcelChartDefinition and Add-ExcelChart) now have an argument completer and the names Currency, Number, Percentage, Scientific, Fraction, Short Date ,Short time,Long time, Date-Time and Text will be converted to the correct Excel formatting strings. - The NumberFormat parameter (in Export-Excel, Set-Row, Set-Column, Set-Format and Add-ConditionalFormat) and X&YAxisNumberFormat parameters (in New-ExcelChartDefinition and Add-ExcelChart) now have an argument completer and the names Currency, Number, Percentage, Scientific, Fraction, Short Date ,Short time,Long time, Date-Time and Text will be converted to the correct Excel formatting strings.
- Added new function Select-Worksheet to make a named sheet active: Added -Activate switch to Add-Worksheet, to make current sheet active, Export-Excel and Add-PivotTable support -Activate and pass it to Add-Worksheet, and New-PivotTableDefinition allows it to be part of the Pivot TableDefinition. - Added new function Select-Worksheet to make a named sheet active: Added -Activate switch to Add-Worksheet, to make current sheet active, Export-Excel and Add-PivotTable support -Activate and pass it to Add-Worksheet, and New-PivotTableDefinition allows it to be part of the Pivot TableDefinition.
- Fixed a bug in Set-Format which caused -Hidden not to work - Fixed a bug in Set-Format which caused -Hidden not to work
- Made the same changes to Add-Conditional format as set format so -switch:$false is processed, and 0 enums and values are processed correctly
- In Export-Excel, wrapped calls to Add-CellValue in a try catch so a value which causes an issue doesn't crash the whole export but generates a warning instead (#410) .
- Additional tests. - Additional tests.
# What's new to July 18 # What's new to July 18

View File

@@ -9,7 +9,7 @@
$Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage $Path $Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage $Path
$workSheet = $Excel.Workbook.Worksheets[$WorkSheetName] $workSheet = $Excel.Workbook.Worksheets[$WorkSheetName]
if($workSheet) { if($workSheet) {
if($Excel.Workbook.Worksheets.Count -gt 1) { if($Excel.Workbook.Worksheets.Count -gt 1) {
$Excel.Workbook.Worksheets.Delete($workSheet) $Excel.Workbook.Worksheets.Delete($workSheet)
@@ -22,14 +22,13 @@
} }
$Excel.Save() $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} $names | % { Remove-WorkSheet C:\Temp\testDelete.xlsx $_.Name}
##Remove-WorkSheet C:\Temp\testDelete.xlsx sheet6 ##Remove-WorkSheet C:\Temp\testDelete.xlsx sheet6

View File

@@ -52,6 +52,8 @@
Name(s) columns from the spreadhseet which will provide the Filter name(s) in a pivot table created from command line parameters. Name(s) columns from the spreadhseet which will provide the Filter name(s) in a pivot table created from command line parameters.
.PARAMETER PivotData .PARAMETER PivotData
In a pivot table created from command line parameters, the fields to use in the table body is given as a Hash table in the form ColumnName = Average|Count|CountNums|Max|Min|Product|None|StdDev|StdDevP|Sum|Var|VarP . In a pivot table created from command line parameters, the fields to use in the table body is 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 seperatate rows under the given row heading; this switch makes them seperate columns.
.PARAMETER NoTotalsInPivot .PARAMETER NoTotalsInPivot
In a pivot table created from command line parameters, prevents the addition of totals to rows and columns. In a pivot table created from command line parameters, prevents the addition of totals to rows and columns.
.PARAMETER IncludePivotChart .PARAMETER IncludePivotChart
@@ -111,6 +113,9 @@
Sizes the width of the Excel column to the maximum width needed to display all the containing data in that cell. Sizes the width of the Excel column to the maximum width needed to display all the containing data in that cell.
.PARAMETER Show .PARAMETER Show
Opens the Excel file immediately after creation. Convenient for viewing the results instantly without having to search for the file first. Opens the Excel file immediately after creation. Convenient for viewing the results instantly without having to search for the file first.
.PARAMETER CellStyleSB
A script block which is run at the end of the process to apply styles to cells (although it can be used for other purposes).
The script block is given three paramaters; an object containing the current worksheet, the Total number of Rows and the number of the last column.
.PARAMETER ReturnRange .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 .PARAMETER PassThru

View File

@@ -1,35 +1,52 @@
Function Set-Column { Function Set-ExcelColumn {
<# <#
.SYNOPSIS .SYNOPSIS
Adds a column to the existing data area in an Excel sheet, fills values and sets formatting Adds a column to the existing data area in an Excel sheet, fills values and sets formatting
.DESCRIPTION .DESCRIPTION
Set-Column takes a value which is either string containing a value or formula or a scriptblock Set-ExcelColumn takes 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. which evaluates to a string, and optionally a column number and fills that value down the column.
A column name can be specified and the new column can be made a named range. A column heading can be specified and the new column can be made a named range.
The column can be formatted. The column can be formatted in the same operation.
.Example .EXAMPLE
C:> Set-Column -Worksheet $ws -Heading "WinsToFastLaps" -Value {"=E$row/C$row"} -Column 7 -AutoSize -AutoNameRange Set-ExcelColumn -Worksheet $ws -Column 5 -NumberFormat 'Currency'
$ws contains a worksheet object - and column E is set to use the local currecy format.
Intelisense will complete 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) Here $WS already contains a worksheet which contains counts of races won and fastest laps recorded by racing drivers (in columns C and E)
Set-Column specifies that Column 7 should have a heading of "WinsToFastLaps" and the data cells should contain =E2/C2 , =E3/C3 Set-ExcelColumn specifies that Column 7 should have a heading of "WinsToFastLaps" and the data cells should contain =E2/C2 , =E3/C3 etc
the data cells should become a named range, which will also be "WinsToFastLaps" the column width will be set automatically the data cells should become a named range, which will also be "WinsToFastLaps" 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.
#> #>
[cmdletbinding()] [cmdletbinding()]
[Alias(" Set-Column")]
[OutputType([OfficeOpenXml.ExcelColumn],[String])]
Param ( Param (
#If specifing the worksheet by name the ExcelPackage object which contains it needs to be passed
[Parameter(ParameterSetName="Package",Mandatory=$true)] [Parameter(ParameterSetName="Package",Mandatory=$true)]
[OfficeOpenXml.ExcelPackage]$ExcelPackage, [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 a given as a name or an Excel Worksheet object - this sets it by name
[Parameter(ParameterSetName="Package")] [Parameter(ParameterSetName="Package")]
#The sheet to update can be a given as a name or an Excel Worksheet object - $workSheet contains the object #The sheet to update can be a given as a name or an Excel Worksheet object - $workSheet contains the object
$Worksheetname = "Sheet1", [String]$Worksheetname = "Sheet1",
#The worksheet object can be passed instead of passing a sheet name and a package.
[Parameter(ParameterSetName="sheet",Mandatory=$true)] [Parameter(ParameterSetName="sheet",Mandatory=$true)]
[OfficeOpenXml.ExcelWorksheet] [OfficeOpenXml.ExcelWorksheet]$Worksheet,
$Worksheet,
#Column to fill down - first column is 1. 0 will be interpreted as first unused column #Column to fill down - first column is 1. 0 will be interpreted as first unused column
[ValidateRange(0,16384)]
$Column = 0 , $Column = 0 ,
#First row to fill data in #First row to fill data in
[ValidateRange(1,1048576)]
[Int]$StartRow , [Int]$StartRow ,
#value, formula or script block for to fill in. Script block can use $row, $column [number], $ColumnName [letter(s)], $startRow, $startColumn, $endRow, $endColumn #value, formula or script block to fill in. Script block can use $row, $column [number], $columnName [letter(s)], $startRow, $startColumn, $endRow, $endColumn
[parameter(Mandatory=$true)]
$Value , $Value ,
#Optional column heading #Optional column heading
$Heading , $Heading ,
@@ -41,15 +58,15 @@
#Colour for the text - if none specified it will be left as it it is #Colour for the text - if none specified it will be left as it it is
[System.Drawing.Color]$FontColor, [System.Drawing.Color]$FontColor,
#Make text bold; use -Bold:$false to remove bold #Make text bold; use -Bold:$false to remove bold
[switch]$Bold, [Switch]$Bold,
#Make text italic; use -Italic:$false to remove italic #Make text italic; use -Italic:$false to remove italic
[switch]$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 -underline type; use -Underline:$false to remove underlining
[switch]$Underline, [Switch]$Underline,
#Should Underline use single or double, normal or accounting mode : default is single normal #Should Underline use single or double, normal or accounting mode : default is single normal
[OfficeOpenXml.Style.ExcelUnderLineType]$UnderLineType = [OfficeOpenXml.Style.ExcelUnderLineType]::Single, [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, [Switch]$StrikeThru,
#Subscript or superscript (or none) #Subscript or superscript (or none)
[OfficeOpenXml.Style.ExcelVerticalAlignmentFont]$FontShift, [OfficeOpenXml.Style.ExcelVerticalAlignmentFont]$FontShift,
#Font to use - Excel defaults to Calibri #Font to use - Excel defaults to Calibri
@@ -64,7 +81,7 @@
[Alias("PatternColour")] [Alias("PatternColour")]
[System.Drawing.Color]$PatternColor, [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 word wrapping
[switch]$WrapText, [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, [OfficeOpenXml.Style.ExcelHorizontalAlignment]$HorizontalAlignment,
#Position cell contents to top bottom or centre #Position cell contents to top bottom or centre
@@ -79,38 +96,41 @@
[float]$Width, [float]$Width,
#Set the inserted data to be a named range (ignored if header is not specified) #Set the inserted data to be a named range (ignored if header is not specified)
[Switch]$AutoNameRange, [Switch]$AutoNameRange,
#If Sepecified returns the range of cells which affected #Hide the column
[switch]$ReturnRange, [Switch]$Hide,
#If Sepecified returns the range of cells which were affected
[Switch]$ReturnRange,
#If Specified, return an ExcelPackage object to allow further work to be done on the file. #If Specified, return an ExcelPackage object to allow further work to be done on the file.
[switch]$PassThru [Switch]$PassThru
) )
#if we were passed a package object and a worksheet name , get the worksheet. #if we were passed a package object and a worksheet name , get the worksheet.
if ($ExcelPackage) {$Worksheet = $ExcelPackage.Workbook.Worksheets[$Worksheetname] } if ($ExcelPackage) {$Worksheet = $ExcelPackage.Workbook.Worksheets[$Worksheetname] }
#In a script block to build a formula, we may want any of corners or the columnname, #In a script block to build a formula, we may want any of corners or the column name,
#if column and startrow aren't specified, assume first unused column, and first row #if Column and Startrow aren't specified, assume first unused column, and first row
if (-not $StartRow) {$startRow = $Worksheet.Dimension.Start.Row } if (-not $StartRow) {$startRow = $Worksheet.Dimension.Start.Row }
$StartColumn = $Worksheet.Dimension.Start.Column $startColumn = $Worksheet.Dimension.Start.Column
$endColumn = $Worksheet.Dimension.End.Column $endColumn = $Worksheet.Dimension.End.Column
$endRow = $Worksheet.Dimension.End.Row $endRow = $Worksheet.Dimension.End.Row
if ($Column -lt 2 ) {$Column = $endColumn + 1 } if ($Column -eq 0 ) {$Column = $endColumn + 1 }
$ColumnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1","" $columnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1",""
Write-Verbose -Message "Updating Column $ColumnName"
Write-Verbose -Message "Updating Column $columnName"
#If there is a heading, insert it and use it as the name for a range (if we're creating one) #If there is a heading, insert it and use it as the name for a range (if we're creating one)
if ($Heading) { if ($Heading) {
$Worksheet.Cells[$StartRow, $Column].Value = $heading $Worksheet.Cells[$StartRow, $Column].Value = $Heading
$startRow ++ $StartRow ++
if ($AutoNameRange) { $Worksheet.Names.Add( $heading, ($Worksheet.Cells[$startrow, $Column, $endRow, $Column]) ) | Out-Null } if ($AutoNameRange) { Add-ExcelName -Range $Worksheet.Cells[$StartRow, $Column, $endRow, $Column] -RangeName $Heading }
} }
#Fill in the data #Fill in the data
if ($PSBoundParameters.ContainsKey('value')) { foreach ($row in ($StartRow.. $endRow)) { if ($PSBoundParameters.ContainsKey('Value')) { foreach ($row in ($StartRow..$endRow)) {
if ($Value -is [scriptblock]) { #re-create the script block otherwise variables from this function are out of scope. if ($Value -is [scriptblock]) { #re-create the script block otherwise variables from this function are out of scope.
$cellData = & ([scriptblock]::create( $Value )) $cellData = & ([scriptblock]::create( $Value ))
Write-Verbose -Message $cellData Write-Verbose -Message $cellData
} }
else { $cellData = $Value} else { $cellData = $Value}
if ($cellData -match "^=") { $Worksheet.Cells[$Row, $Column].Formula = $cellData } if ($cellData -match "^=") { $Worksheet.Cells[$Row, $Column].Formula = ($cellData -replace '^=','') } #EPPlus likes formulas with no = sign; Excel doesn't care
elseif ( [System.Uri]::IsWellFormedUriString($cellData , [System.UriKind]::Absolute)) { elseif ( [System.Uri]::IsWellFormedUriString($cellData , [System.UriKind]::Absolute)) {
# Save a hyperlink : internal links can be in the form xl://sheet!E419 (use A1 as goto sheet), or xl://RangeName # Save a hyperlink : internal links can be in the form xl://sheet!E419 (use A1 as goto sheet), or xl://RangeName
if ($cellData -match "^xl://internal/") { if ($cellData -match "^xl://internal/") {
@@ -123,8 +143,9 @@
$Worksheet.Cells[$Row, $Column].Style.Font.Color.SetColor([System.Drawing.Color]::Blue) $Worksheet.Cells[$Row, $Column].Style.Font.Color.SetColor([System.Drawing.Color]::Blue)
$Worksheet.Cells[$Row, $Column].Style.Font.UnderLine = $true $Worksheet.Cells[$Row, $Column].Style.Font.UnderLine = $true
} }
else { $Worksheet.Cells[$Row, $Column].Value = $cellData } else { $Worksheet.Cells[$Row, $Column].Value = $cellData }
if ($cellData -is [datetime]) { $Worksheet.Cells[$Row, $Column].Style.Numberformat.Format = 'm/d/yy h:mm' } # This is not a custom format, but a preset recognized as date and localized. if ($cellData -is [datetime]) { $Worksheet.Cells[$Row, $Column].Style.Numberformat.Format = 'm/d/yy h:mm' } # This is not a custom format, but a preset recognized as date and localized.
if ($cellData -is [timespan]) { $Worksheet.Cells[$Row, $Column].Style.Numberformat.Format = '[h]:mm:ss' }
}} }}
#region Apply formatting #region Apply formatting
$params = @{} $params = @{}
@@ -133,12 +154,13 @@
'BorderAround', 'BackgroundColor', 'BackgroundPattern', 'PatternColor')) { 'BorderAround', 'BackgroundColor', 'BackgroundPattern', 'PatternColor')) {
if ($PSBoundParameters.ContainsKey($p)) {$params[$p] = $PSBoundParameters[$p]} if ($PSBoundParameters.ContainsKey($p)) {$params[$p] = $PSBoundParameters[$p]}
} }
$theRange = "$ColumnName$startRow`:$ColumnName$endRow" $theRange = "$columnName$StartRow`:$columnName$endRow"
if ($params.Count) { if ($params.Count) {
Set-Format -WorkSheet $Worksheet -Range $theRange @params Set-ExcelRange -WorkSheet $Worksheet -Range $theRange @params
} }
#endregion #endregion
if ($PSBoundParameters["Hide"]) {$workSheet.Column($Column).Hidden = [bool]$Hide}
#return the new data if -passthru was specified. #return the new data if -passthru was specified.
if ($passThru) { $Worksheet.Column( $Column)} if ($passThru) { $Worksheet.Column($Column)}
elseif ($ReturnRange) { $theRange} elseif ($ReturnRange) { $theRange}
} }

View File

@@ -1,22 +1,30 @@
Function Set-Row { Function Set-ExcelRow {
<# <#
.Synopsis .Synopsis
Fills values into a [new] row in an Excel spreadsheet. To format a row without setting values, use Set-Format. Fills values into a [new] row in an Excel spreadsheet. And sets row formmats.
.Description .Description
Set-Row accepts either a Worksheet object or an Excel package object returned by Export-Excel and the name of a sheet, 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. and inserts the chosen contents into a row of the sheet.
The contents can be a constant "42" , a formula or a script block which is converted into a constant or formula. The contents can be a constant "42" , a formula or a script block which is converted into a constant or formula.
The first cell of the row can optional be given a heading. The first cell of the row can optionally be given a heading.
.Example .Example
Set-row -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-Row will select the next row after the end of the data in the sheet $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 will contain "Total", and each other cell will contain The first cell will contain "Total", and each other cell will contain
=Sum(xx2:xx99) - where xx is the column name, and 99 is the last row of data. =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" Note the use of `2 to Prevent 2 becoming part of the variable "ColumnName"
The script block can use $row, $column, $ColumnName, $startRow/Column $endRow/Column The script block can use $row, $column, $ColumnName, $startRow/Column $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.
#> #>
[cmdletbinding()] [cmdletbinding()]
[Alias(" Set-Row")]
[OutputType([OfficeOpenXml.ExcelRow],[String])]
Param ( 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)] [Parameter(ParameterSetName="Package",Mandatory=$true)]
@@ -25,37 +33,50 @@
[Parameter(ParameterSetName="Package")] [Parameter(ParameterSetName="Package")]
$Worksheetname = "Sheet1", $Worksheetname = "Sheet1",
#A worksheet object #A worksheet object
[Parameter(ParameterSetName="sheet",Mandatory=$true)] [Parameter(ParameterSetName="Sheet",Mandatory=$true)]
[OfficeOpenXml.Excelworksheet] [OfficeOpenXml.Excelworksheet] $Worksheet,
$Worksheet,
#Row to fill right - first row is 1. 0 will be interpreted as first unused row #Row to fill right - first row is 1. 0 will be interpreted as first unused row
$Row = 0 , $Row = 0 ,
#Position in the row to start from #Position in the row to start from
[Int]$StartColumn, [int]$StartColumn,
#value, formula or script block for to fill in. Script block can use $worksheet, $row, $column [number], $ColumnName [letter(s)], $startRow, $startColumn, $endRow, $endColumn #Value, formula or script block to fill in. Script block can use $worksheet, $row, $Column [number], $ColumnName [letter(s)], $startRow, $startColumn, $endRow, $endColumn
[parameter(Mandatory=$true)]
$Value, $Value,
#Optional Row heading #Optional Row heading
$Heading , $Heading ,
#Set the heading in bold type
[Switch]$HeadingBold,
#Change the size of the heading type
[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 #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")] [Alias("NFormat")]
$NumberFormat, $NumberFormat,
#Style of border to draw around the row #Style of border to draw around the row
[OfficeOpenXml.Style.ExcelBorderStyle]$BorderAround, [OfficeOpenXml.Style.ExcelBorderStyle]$BorderAround,
#Color of the border
[System.Drawing.Color]$BorderColor=[System.Drawing.Color]::Black,
#Style for the bottom border
[OfficeOpenXml.Style.ExcelBorderStyle]$BorderBottom,
#Style for the top border
[OfficeOpenXml.Style.ExcelBorderStyle]$BorderTop,
#Style for the left border
[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 #Colour for the text - if none specified it will be left as it it is
[System.Drawing.Color]$FontColor, [System.Drawing.Color]$FontColor,
#Make text bold; use -Bold:$false to remove bold #Make text bold; use -Bold:$false to remove bold
[switch]$Bold, [Switch]$Bold,
#Make text italic; use -Italic:$false to remove italic #Make text italic; use -Italic:$false to remove italic
[switch]$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 -underline type; use -Underline:$false to remove underlining
[switch]$Underline, [Switch]$Underline,
#Should Underline use single or double, normal or accounting mode : default is single normal #Should Underline use single or double, normal or accounting mode : default is single normal
[OfficeOpenXml.Style.ExcelUnderLineType]$UnderLineType = [OfficeOpenXml.Style.ExcelUnderLineType]::Single, [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, [Switch]$StrikeThru,
#Subscript or superscript (or none) #Subscript or superscript (or none)
[OfficeOpenXml.Style.ExcelVerticalAlignmentFont]$FontShift, [OfficeOpenXml.Style.ExcelVerticalAlignmentFont]$FontShift,
#Font to use - Excel defaults to Calibri
[String]$FontName, [String]$FontName,
#Point size for the text #Point size for the text
[float]$FontSize, [float]$FontSize,
@@ -67,7 +88,7 @@
[Alias("PatternColour")] [Alias("PatternColour")]
[System.Drawing.Color]$PatternColor, [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 word wrapping
[switch]$WrapText, [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, [OfficeOpenXml.Style.ExcelHorizontalAlignment]$HorizontalAlignment,
#Position cell contents to top bottom or centre #Position cell contents to top bottom or centre
@@ -77,10 +98,12 @@
[int]$TextRotation , [int]$TextRotation ,
#Set cells to a fixed hieght #Set cells to a fixed hieght
[float]$Height, [float]$Height,
#If Sepecified returns the range of cells which affected #Hide the Row
[switch]$ReturnRange, [Switch]$Hide,
#If Specified, return a row object to allow further work to be done #If Sepecified returns the range of cells which were affected
[switch]$PassThru [Switch]$ReturnRange,
#If Specified, return a row object to allow further work to be done
[Switch]$PassThru
) )
#if we were passed a package object and a worksheet name , get the worksheet. #if we were passed a package object and a worksheet name , get the worksheet.
@@ -92,24 +115,26 @@
$startRow = $Worksheet.Dimension.Start.Row + 1 $startRow = $Worksheet.Dimension.Start.Row + 1
$endColumn = $Worksheet.Dimension.End.Column $endColumn = $Worksheet.Dimension.End.Column
$endRow = $Worksheet.Dimension.End.Row $endRow = $Worksheet.Dimension.End.Row
if ($Row -lt 2 ) {$Row = $endRow + 1 } if ($Row -eq 0 ) {$Row = $endRow + 1 }
Write-Verbose -Message "Updating Row $Row" Write-Verbose -Message "Updating Row $Row"
#Add a row label #Add a row label
if ($Heading) { if ($Heading) {
$Worksheet.Cells[$Row, $StartColumn].Value = $Heading $Worksheet.Cells[$Row, $StartColumn].Value = $Heading
$StartColumn ++ if ($HeadingBold) {$Worksheet.Cells[$Row, $StartColumn].Style.Font.Bold = $true}
if ($HeadingSize) {$Worksheet.Cells[$Row, $StartColumn].Style.Font.Size = $HeadingSize}
$StartColumn ++
} }
#Fill in the data #Fill in the data
if ($PSBoundParameters.ContainsKey('Value')) {foreach ($column in ($StartColumn..$EndColumn)) { if ($PSBoundParameters.ContainsKey('Value')) {foreach ($column in ($StartColumn..$endColumn)) {
#We might want the column name in a script block #We might want the column name in a script block
$ColumnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1","" $columnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1",""
if ($Value -is [scriptblock] ) { if ($Value -is [scriptblock] ) {
#re-create the script block otherwise variables from this function are out of scope. #re-create the script block otherwise variables from this function are out of scope.
$cellData = & ([scriptblock]::create( $Value )) $cellData = & ([scriptblock]::create( $Value ))
Write-Verbose -Message $cellData Write-Verbose -Message $cellData
} }
else{$cellData = $Value} else{$cellData = $Value}
if ($cellData -match "^=") { $Worksheet.Cells[$Row, $column].Formula = $cellData } if ($cellData -match "^=") { $Worksheet.Cells[$Row, $column].Formula = ($cellData -replace '^=','') } #EPPlus likes formulas with no = sign; Excel doesn't care
elseif ( [System.Uri]::IsWellFormedUriString($cellData , [System.UriKind]::Absolute)) { elseif ( [System.Uri]::IsWellFormedUriString($cellData , [System.UriKind]::Absolute)) {
# Save a hyperlink : internal links can be in the form xl://sheet!E419 (use A1 as goto sheet), or xl://RangeName # Save a hyperlink : internal links can be in the form xl://sheet!E419 (use A1 as goto sheet), or xl://RangeName
if ($cellData -match "^xl://internal/") { if ($cellData -match "^xl://internal/") {
@@ -122,21 +147,24 @@
$Worksheet.Cells[$Row, $Column].Style.Font.Color.SetColor([System.Drawing.Color]::Blue) $Worksheet.Cells[$Row, $Column].Style.Font.Color.SetColor([System.Drawing.Color]::Blue)
$Worksheet.Cells[$Row, $Column].Style.Font.UnderLine = $true $Worksheet.Cells[$Row, $Column].Style.Font.UnderLine = $true
} }
else { $Worksheet.Cells[$Row, $column].Value = $cellData } else { $Worksheet.Cells[$Row, $column].Value = $cellData }
if ($cellData -is [datetime]) { $Worksheet.Cells[$Row, $column].Style.Numberformat.Format = 'm/d/yy h:mm' } # This is not a custom format, but a preset recognized as date and localized. if ($cellData -is [datetime]) { $Worksheet.Cells[$Row, $column].Style.Numberformat.Format = 'm/d/yy h:mm' } #This is not a custom format, but a preset recognized as date and localized.
if ($cellData -is [timespan]) { $Worksheet.Cells[$Row, $Column].Style.Numberformat.Format = '[h]:mm:ss' }
}} }}
#region Apply formatting #region Apply formatting
$params = @{} $params = @{}
foreach ($p in @('Underline','Bold','Italic','StrikeThru','FontSize', 'FontShift','NumberFormat','TextRotation', foreach ($p in @('Underline','Bold','Italic','StrikeThru','FontSize', 'FontShift','NumberFormat','TextRotation',
'WrapText', 'HorizontalAlignment','VerticalAlignment', 'Height', 'FontColor' 'WrapText', 'HorizontalAlignment','VerticalAlignment', 'Height', 'FontColor'
'BorderAround', 'BackgroundColor', 'BackgroundPattern', 'PatternColor')) { 'BorderAround', 'BorderBottom', 'BorderTop', 'BorderLeft', 'BorderRight', 'BorderColor',
'BackgroundColor', 'BackgroundPattern', 'PatternColor')) {
if ($PSBoundParameters.ContainsKey($p)) {$params[$p] = $PSBoundParameters[$p]} if ($PSBoundParameters.ContainsKey($p)) {$params[$p] = $PSBoundParameters[$p]}
} }
$theRange = [OfficeOpenXml.ExcelAddress]::TranslateFromR1C1("R[$Row]C[$StartColumn]:R[$Row]C[$EndColumn]",0,0) $theRange = [OfficeOpenXml.ExcelAddress]::New($Row, $StartColumn, $Row, $endColumn)
if ($params.Count) { if ($params.Count) {
Set-Format -WorkSheet $Worksheet -Range $theRange @params Set-ExcelRange -WorkSheet $Worksheet -Range $theRange @params
} }
#endregion #endregion
if ($PSBoundParameters["Hide"]) {$workSheet.Row($Row).Hidden = [bool]$Hide}
#return the new data if -passthru was specified. #return the new data if -passthru was specified.
if ($passThru) {$Worksheet.Row($Row)} if ($passThru) {$Worksheet.Row($Row)}
elseif ($ReturnRange) {$theRange} elseif ($ReturnRange) {$theRange}

View File

@@ -1,34 +1,50 @@
Function Set-Format { Function Set-ExcelRange {
<# <#
.SYNOPSIS .SYNOPSIS
Applies Number, font, alignment and colour formatting to a range of Excel Cells Applies Number, font, alignment and colour formatting, values or formulas to a range of Excel Cells
.EXAMPLE .DESCRIPTION
$sheet.Column(3) | Set-Format -HorizontalAlignment Right -NumberFormat "#,###" Set-ExcelRange was created to set the style elements for a range of cells, this includes autosizing and hiding, setting
Selects column 3 from a sheet object (within a workbook object, which is a child of the ExcelPackage object) and passes it to Set-Format which formats as an integer with comma seperated groups font elements (Name, Size, Bold, Italic, Underline & UnderlineStyle and Subscript & SuperScript), font and background colors,
.EXAMPLE borders, text wrapping, rotation, aliginment within cells, and number format. It was orignally named "Set-ExcelRange"
Set-Format -Address $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NumberFormat "#,###" It has been extended to set Values, Formulas and set ArrayFormulas (sometimes called Ctrl-shift-Enter [CSE] formulas); because of this
Instead of piping the address in this version specifies a block of cells and applies similar formatting the name has become Set-ExcelRange - but the old name of Set-Format is preserved as an alias name may swapped.
.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 seperated 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 in 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.
#>
[cmdletbinding()]
[Alias("Set-Format")]
Param ( Param (
#One or more row(s), Column(s) and/or block(s) of cells to format #One or more row(s), Column(s) and/or block(s) of cells to format
[Parameter(ValueFromPipeline = $true,ParameterSetName="Address",Mandatory=$True,Position=0)] [Parameter(ValueFromPipeline = $true,Position=0)]
$Address , [Alias("Address")]
$Range ,
#The worksheet where the format is to be applied #The worksheet where the format is to be applied
[Parameter(ParameterSetName="SheetAndRange",Mandatory=$True)]
[OfficeOpenXml.ExcelWorksheet]$WorkSheet , [OfficeOpenXml.ExcelWorksheet]$WorkSheet ,
#The area of the worksheet where the format is to be applied #Number format to apply to cells e.g. "dd/MM/yyyy HH:mm", "£#,##0.00;[Red]-£#,##0.00", "0.00%" , "##/##" , "0.0E+0" etc
[Parameter(ParameterSetName="SheetAndRange",Mandatory=$True)]
[OfficeOpenXml.ExcelAddress]$Range,
#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")] [Alias("NFormat")]
$NumberFormat, $NumberFormat,
#Style of border to draw around the range #Style of border to draw around the range
[OfficeOpenXml.Style.ExcelBorderStyle]$BorderAround, [OfficeOpenXml.Style.ExcelBorderStyle]$BorderAround,
#Color of the border
[System.Drawing.Color]$BorderColor=[System.Drawing.Color]::Black, [System.Drawing.Color]$BorderColor=[System.Drawing.Color]::Black,
#Style for the bottom border
[OfficeOpenXml.Style.ExcelBorderStyle]$BorderBottom, [OfficeOpenXml.Style.ExcelBorderStyle]$BorderBottom,
#Style for the top border
[OfficeOpenXml.Style.ExcelBorderStyle]$BorderTop, [OfficeOpenXml.Style.ExcelBorderStyle]$BorderTop,
#Style for the left border
[OfficeOpenXml.Style.ExcelBorderStyle]$BorderLeft, [OfficeOpenXml.Style.ExcelBorderStyle]$BorderLeft,
#Style for the right border
[OfficeOpenXml.Style.ExcelBorderStyle]$BorderRight, [OfficeOpenXml.Style.ExcelBorderStyle]$BorderRight,
#Colour for the text - if none specified it will be left as it it is #Colour for the text - if none specified it will be left as it it is
[System.Drawing.Color]$FontColor, [System.Drawing.Color]$FontColor,
@@ -36,18 +52,20 @@
$Value, $Value,
#Formula for the cell #Formula for the cell
$Formula, $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 colour to black
[switch]$ResetFont, [Switch]$ResetFont,
#Make text bold; use -Bold:$false to remove bold #Make text bold; use -Bold:$false to remove bold
[switch]$Bold, [Switch]$Bold,
#Make text italic; use -Italic:$false to remove italic #Make text italic; use -Italic:$false to remove italic
[switch]$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 -underline type; use -Underline:$false to remove underlining
[switch]$Underline, [Switch]$Underline,
#Should Underline use single or double, normal or accounting mode : default is single normal #Should Underline use single or double, normal or accounting mode : default is single normal
[OfficeOpenXml.Style.ExcelUnderLineType]$UnderLineType = [OfficeOpenXml.Style.ExcelUnderLineType]::Single, [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, [Switch]$StrikeThru,
#Subscript or superscript (or none) #Subscript or superscript (or none)
[OfficeOpenXml.Style.ExcelVerticalAlignmentFont]$FontShift, [OfficeOpenXml.Style.ExcelVerticalAlignmentFont]$FontShift,
#Font to use - Excel defaults to Calibri #Font to use - Excel defaults to Calibri
@@ -62,7 +80,7 @@
[Alias("PatternColour")] [Alias("PatternColour")]
[System.Drawing.Color]$PatternColor, [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 word wrapping
[switch]$WrapText, [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, [OfficeOpenXml.Style.ExcelHorizontalAlignment]$HorizontalAlignment,
#Position cell contents to top bottom or center #Position cell contents to top bottom or center
@@ -78,135 +96,136 @@
#Set cells to a fixed hieght (rows or ranges only) #Set cells to a fixed hieght (rows or ranges only)
[float]$Height, [float]$Height,
#Hide a row or column (not a range); use -Hidden:$false to unhide #Hide a row or column (not a range); use -Hidden:$false to unhide
[switch]$Hidden [Switch]$Hidden
) )
begin {
#Allow Set-Format to take Worksheet and range parameters (like Add Contitional formatting) - convert them to an address
if ($WorkSheet -and $Range) {$Address = $WorkSheet.Cells[$Range] }
}
process { process {
if ($Address -is [Array]) { if ($Range -is [Array]) {
[void]$PSBoundParameters.Remove("Address") [void]$PSBoundParameters.Remove("Range")
$Address | Set-Format @PSBoundParameters $Range | Set-ExcelRange @PSBoundParameters
} }
else { else {
#We should accept, a worksheet and a name of a range or a cell address; a table; the address of a table; a named range; a row, a column or .Cells[ ]
if ($Range -is [OfficeOpenXml.Table.ExcelTable]) {$Range = $Range.Address}
elseif ($WorkSheet -and ($Range -is [string] -or $Range -is [OfficeOpenXml.ExcelAddress])) {
$Range = $WorkSheet.Cells[$Range]
}
elseif ($Range -is [string]) {Write-Warning -Message "The range pararameter you have specified also needs a worksheet parameter."}
if ($ResetFont) { if ($ResetFont) {
$Address.Style.Font.Color.SetColor("Black") $Range.Style.Font.Color.SetColor("Black")
$Address.Style.Font.Bold = $false $Range.Style.Font.Bold = $false
$Address.Style.Font.Italic = $false $Range.Style.Font.Italic = $false
$Address.Style.Font.UnderLine = $false $Range.Style.Font.UnderLine = $false
$Address.Style.Font.Strike = $false $Range.Style.Font.Strike = $false
$Range.Style.Font.VerticalAlign = [OfficeOpenXml.Style.ExcelVerticalAlignmentFont]::None
} }
if ($PSBoundParameters.ContainsKey('Underline')) { if ($PSBoundParameters.ContainsKey('Underline')) {
$Address.Style.Font.UnderLine = [boolean]$Underline $Range.Style.Font.UnderLine = [boolean]$Underline
$Address.Style.Font.UnderLineType = $UnderLineType $Range.Style.Font.UnderLineType = $UnderLineType
} }
if ($PSBoundParameters.ContainsKey('Bold')) { if ($PSBoundParameters.ContainsKey('Bold')) {
$Address.Style.Font.Bold = [boolean]$bold $Range.Style.Font.Bold = [boolean]$bold
} }
if ($PSBoundParameters.ContainsKey('Italic')) { if ($PSBoundParameters.ContainsKey('Italic')) {
$Address.Style.Font.Italic = [boolean]$italic $Range.Style.Font.Italic = [boolean]$italic
} }
if ($PSBoundParameters.ContainsKey('StrikeThru')) { if ($PSBoundParameters.ContainsKey('StrikeThru')) {
$Address.Style.Font.Strike = [boolean]$StrikeThru $Range.Style.Font.Strike = [boolean]$StrikeThru
} }
if ($PSBoundParameters.ContainsKey('FontSize')){ if ($PSBoundParameters.ContainsKey('FontSize')){
$Address.Style.Font.Size = $FontSize $Range.Style.Font.Size = $FontSize
} }
if ($PSBoundParameters.ContainsKey('FontShift')){ if ($PSBoundParameters.ContainsKey('FontShift')){
$Address.Style.Font.VerticalAlign = $FontShift $Range.Style.Font.VerticalAlign = $FontShift
} }
if ($PSBoundParameters.ContainsKey('FontColor')){ if ($PSBoundParameters.ContainsKey('FontColor')){
$Address.Style.Font.Color.SetColor( $FontColor) $Range.Style.Font.Color.SetColor( $FontColor)
} }
if ($PSBoundParameters.ContainsKey('TextRotation')) { if ($PSBoundParameters.ContainsKey('TextRotation')) {
$Address.Style.TextRotation = $TextRotation $Range.Style.TextRotation = $TextRotation
} }
if ($PSBoundParameters.ContainsKey('WrapText')) { if ($PSBoundParameters.ContainsKey('WrapText')) {
$Address.Style.WrapText = [boolean]$WrapText $Range.Style.WrapText = [boolean]$WrapText
} }
if ($PSBoundParameters.ContainsKey('HorizontalAlignment')) { if ($PSBoundParameters.ContainsKey('HorizontalAlignment')) {
$Address.Style.HorizontalAlignment = $HorizontalAlignment $Range.Style.HorizontalAlignment = $HorizontalAlignment
} }
if ($PSBoundParameters.ContainsKey('VerticalAlignment')) { if ($PSBoundParameters.ContainsKey('VerticalAlignment')) {
$Address.Style.VerticalAlignment = $VerticalAlignment $Range.Style.VerticalAlignment = $VerticalAlignment
} }
if ($PSBoundParameters.ContainsKey('Value')) { if ($PSBoundParameters.ContainsKey('Value')) {
if ($Value -like '=*') {$Address.Formula = $Value} if ($Value -match '^=') {$PSBoundParameters["Formula"] = $Value -replace '^=','' }
else { else {
$Address.Value = $Value $Range.Value = $Value
if ($Value -is [DateTime]) { if ($Value -is [datetime]) { $Range.Style.Numberformat.Format = 'm/d/yy h:mm' }# This is not a custom format, but a preset recognized as date and localized. It might be overwritten in a moment
$Address.Style.Numberformat.Format = 'm/d/yy h:mm' # This is not a custom format, but a preset recognized as date and localized. It might be overwritten in a moment if ($Value -is [timespan]) { $Range.Style.Numberformat.Format = '[h]:mm:ss' }
}
} }
} }
if ($PSBoundParameters.ContainsKey('Formula')) { if ($PSBoundParameters.ContainsKey('Formula')) {
$Address.Formula = $Formula if ($ArrayFormula) {$Range.CreateArrayFormula(($Formula -replace '^=','')) }
else {$Range.Formula = ($Formula -replace '^=','') }
} }
if ($PSBoundParameters.ContainsKey('NumberFormat')) { if ($PSBoundParameters.ContainsKey('NumberFormat')) {
$Address.Style.Numberformat.Format = (Expand-NumberFormat $NumberFormat) $Range.Style.Numberformat.Format = (Expand-NumberFormat $NumberFormat)
} }
if ($PSBoundParameters.ContainsKey('BorderAround')) { if ($PSBoundParameters.ContainsKey('BorderAround')) {
$Address.Style.Border.BorderAround($BorderAround, $BorderColor) $Range.Style.Border.BorderAround($BorderAround, $BorderColor)
} }
if ($PSBoundParameters.ContainsKey('BorderBottom')) { if ($PSBoundParameters.ContainsKey('BorderBottom')) {
$Address.Style.Border.Bottom.Style=$BorderBottom $Range.Style.Border.Bottom.Style=$BorderBottom
$Address.Style.Border.Bottom.Color.SetColor($BorderColor) $Range.Style.Border.Bottom.Color.SetColor($BorderColor)
} }
if ($PSBoundParameters.ContainsKey('BorderTop')) { if ($PSBoundParameters.ContainsKey('BorderTop')) {
$Address.Style.Border.Top.Style=$BorderTop $Range.Style.Border.Top.Style=$BorderTop
$Address.Style.Border.Top.Color.SetColor($BorderColor) $Range.Style.Border.Top.Color.SetColor($BorderColor)
} }
if ($PSBoundParameters.ContainsKey('BorderLeft')) { if ($PSBoundParameters.ContainsKey('BorderLeft')) {
$Address.Style.Border.Left.Style=$BorderLeft $Range.Style.Border.Left.Style=$BorderLeft
$Address.Style.Border.Left.Color.SetColor($BorderColor) $Range.Style.Border.Left.Color.SetColor($BorderColor)
} }
if ($PSBoundParameters.ContainsKey('BorderRight')) { if ($PSBoundParameters.ContainsKey('BorderRight')) {
$Address.Style.Border.Right.Style=$BorderRight $Range.Style.Border.Right.Style=$BorderRight
$Address.Style.Border.Right.Color.SetColor($BorderColor) $Range.Style.Border.Right.Color.SetColor($BorderColor)
} }
if ($PSBoundParameters.ContainsKey('BackgroundColor')) { if ($PSBoundParameters.ContainsKey('BackgroundColor')) {
$Address.Style.Fill.PatternType = $BackgroundPattern $Range.Style.Fill.PatternType = $BackgroundPattern
$Address.Style.Fill.BackgroundColor.SetColor($BackgroundColor) $Range.Style.Fill.BackgroundColor.SetColor($BackgroundColor)
if ($PatternColor) { if ($PatternColor) {
$Address.Style.Fill.PatternColor.SetColor( $PatternColor) $Range.Style.Fill.PatternColor.SetColor( $PatternColor)
} }
} }
if ($PSBoundParameters.ContainsKey('Height')) { if ($PSBoundParameters.ContainsKey('Height')) {
if ($Address -is [OfficeOpenXml.ExcelRow] ) {$Address.Height = $Height } if ($Range -is [OfficeOpenXml.ExcelRow] ) {$Range.Height = $Height }
elseif ($Address -is [OfficeOpenXml.ExcelRange] ) { elseif ($Range -is [OfficeOpenXml.ExcelRange] ) {
($Address.Start.Row)..($Address.Start.Row + $Address.Rows) | ($Range.Start.Row)..($Range.Start.Row + $Range.Rows) |
ForEach-Object {$Address.WorkSheet.Row($_).Height = $Height } ForEach-Object {$Range.WorkSheet.Row($_).Height = $Height }
} }
else {Write-Warning -Message ("Can set the height of a row or a range but not a {0} object" -f ($Address.GetType().name)) } else {Write-Warning -Message ("Can set the height of a row or a range but not a {0} object" -f ($Range.GetType().name)) }
} }
if ($Autosize) { if ($Autosize) {
if ($Address -is [OfficeOpenXml.ExcelColumn]) {$Address.AutoFit() } if ($Range -is [OfficeOpenXml.ExcelColumn]) {$Range.AutoFit() }
elseif ($Address -is [OfficeOpenXml.ExcelRange] ) { elseif ($Range -is [OfficeOpenXml.ExcelRange] ) {
$Address.AutoFitColumns() $Range.AutoFitColumns()
} }
else {Write-Warning -Message ("Can autofit a column or a range but not a {0} object" -f ($Address.GetType().name)) } else {Write-Warning -Message ("Can autofit a column or a range but not a {0} object" -f ($Range.GetType().name)) }
} }
elseif ($PSBoundParameters.ContainsKey('Width')) { elseif ($PSBoundParameters.ContainsKey('Width')) {
if ($Address -is [OfficeOpenXml.ExcelColumn]) {$Address.Width = $Width} if ($Range -is [OfficeOpenXml.ExcelColumn]) {$Range.Width = $Width}
elseif ($Address -is [OfficeOpenXml.ExcelRange] ) { elseif ($Range -is [OfficeOpenXml.ExcelRange] ) {
($Address.Start.Column)..($Address.Start.Column + $Address.Columns - 1) | ($Range.Start.Column)..($Range.Start.Column + $Range.Columns - 1) |
ForEach-Object { ForEach-Object {
#$ws.Column($_).Width = $Width #$ws.Column($_).Width = $Width
$Address.Worksheet.Column($_).Width = $Width $Range.Worksheet.Column($_).Width = $Width
} }
} }
else {Write-Warning -Message ("Can set the width of a column or a range but not a {0} object" -f ($Address.GetType().name)) } else {Write-Warning -Message ("Can set the width of a column or a range but not a {0} object" -f ($Range.GetType().name)) }
} }
if ($PSBoundParameters.ContainsKey('Hidden')) { if ($PSBoundParameters.ContainsKey('Hidden')) {
if ($Address -is [OfficeOpenXml.ExcelRow] -or if ($Range -is [OfficeOpenXml.ExcelRow] -or
$Address -is [OfficeOpenXml.ExcelColumn] ) {$Address.Hidden = [boolean]$Hidden} $Range -is [OfficeOpenXml.ExcelColumn] ) {$Range.Hidden = [boolean]$Hidden}
else {Write-Warning -Message ("Can hide a row or a column but not a {0} object" -f ($Address.GetType().name)) } else {Write-Warning -Message ("Can hide a row or a column but not a {0} object" -f ($Range.GetType().name)) }
} }
} }
} }
} }
@@ -254,9 +273,11 @@ Function NumberFormatCompletion {
if (Get-Command -ErrorAction SilentlyContinue -name Register-ArgumentCompleter) { if (Get-Command -ErrorAction SilentlyContinue -name Register-ArgumentCompleter) {
Register-ArgumentCompleter -CommandName Add-ConditionalFormatting -ParameterName NumberFormat -ScriptBlock $Function:NumberFormatCompletion Register-ArgumentCompleter -CommandName Add-ConditionalFormatting -ParameterName NumberFormat -ScriptBlock $Function:NumberFormatCompletion
Register-ArgumentCompleter -CommandName Export-Excel -ParameterName NumberFormat -ScriptBlock $Function:NumberFormatCompletion Register-ArgumentCompleter -CommandName Export-Excel -ParameterName NumberFormat -ScriptBlock $Function:NumberFormatCompletion
Register-ArgumentCompleter -CommandName Set-Format -ParameterName NumberFormat -ScriptBlock $Function:NumberFormatCompletion Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName NumberFormat -ScriptBlock $Function:NumberFormatCompletion
Register-ArgumentCompleter -CommandName Set-Column -ParameterName NumberFormat -ScriptBlock $Function:NumberFormatCompletion Register-ArgumentCompleter -CommandName Set-ExcelColumn -ParameterName NumberFormat -ScriptBlock $Function:NumberFormatCompletion
Register-ArgumentCompleter -CommandName Set-Row -ParameterName NumberFormat -ScriptBlock $Function:NumberFormatCompletion Register-ArgumentCompleter -CommandName Set-ExcelRow -ParameterName NumberFormat -ScriptBlock $Function:NumberFormatCompletion
Register-ArgumentCompleter -CommandName Add-PivotTable -ParameterName PivotNumberFormat -ScriptBlock $Function:NumberFormatCompletion
Register-ArgumentCompleter -CommandName New-PivotTableDefinition -ParameterName PivotNumberFormat -ScriptBlock $Function:NumberFormatCompletion
Register-ArgumentCompleter -CommandName New-ExcelChartDefinition -ParameterName XAxisNumberformat -ScriptBlock $Function:NumberFormatCompletion Register-ArgumentCompleter -CommandName New-ExcelChartDefinition -ParameterName XAxisNumberformat -ScriptBlock $Function:NumberFormatCompletion
Register-ArgumentCompleter -CommandName New-ExcelChartDefinition -ParameterName YAxisNumberformat -ScriptBlock $Function:NumberFormatCompletion Register-ArgumentCompleter -CommandName New-ExcelChartDefinition -ParameterName YAxisNumberformat -ScriptBlock $Function:NumberFormatCompletion
Register-ArgumentCompleter -CommandName Add-ExcelChart -ParameterName XAxisNumberformat -ScriptBlock $Function:NumberFormatCompletion Register-ArgumentCompleter -CommandName Add-ExcelChart -ParameterName XAxisNumberformat -ScriptBlock $Function:NumberFormatCompletion
@@ -264,12 +285,65 @@ if (Get-Command -ErrorAction SilentlyContinue -name Register-ArgumentCompleter)
} }
Function Expand-NumberFormat { Function Expand-NumberFormat {
param ($NumberFormat) <#
.SYNOPSIS
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 ",")
.EXAMPLE
Expand-NumberFormat percentage
Returns "0.00%"
.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.
#>
[cmdletbinding()]
[OutputType([String])]
param (
#the format string to Expand
$NumberFormat
)
switch ($NumberFormat) { switch ($NumberFormat) {
"Currency" {return [cultureinfo]::CurrentCulture.NumberFormat.CurrencySymbol + "#,##0.00"} "Currency" {
#https://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.currencynegativepattern(v=vs.110).aspx
$sign = [cultureinfo]::CurrentCulture.NumberFormat.CurrencySymbol
switch ([cultureinfo]::CurrentCulture.NumberFormat.CurrencyPositivePattern) {
0 {$pos = "$Sign#,##0.00" ; break }
1 {$pos = "#,##0.00$Sign" ; break }
2 {$pos = "$Sign #,##0.00" ; break }
3 {$pos = "#,##0.00 $Sign" ; break }
}
switch ([cultureinfo]::CurrentCulture.NumberFormat.CurrencyPositivePattern) {
0 {return "$pos;($Sign#,##0.00)" }
1 {return "$pos;-$Sign#,##0.00" }
2 {return "$pos;$Sign-#,##0.00" }
3 {return "$pos;$Sign#,##0.00-" }
4 {return "$pos;(#,##0.00$Sign)" }
5 {return "$pos;-#,##0.00$Sign" }
6 {return "$pos;#,##0.00-$Sign" }
7 {return "$pos;#,##0.00$Sign-" }
8 {return "$pos;-#,##0.00 $Sign" }
9 {return "$pos;-$Sign #,##0.00" }
10 {return "$pos;#,##0.00 $Sign-" }
11 {return "$pos;$Sign #,##0.00-" }
12 {return "$pos;$Sign -#,##0.00" }
13 {return "$pos;#,##0.00- $Sign" }
14 {return "$pos;($Sign #,##0.00)" }
15 {return "$pos;(#,##0.00 $Sign)" }
}
}
"Number" {return "0.00" } # format id 2 "Number" {return "0.00" } # format id 2
"Percentage" {return "0.00%" } # format id 10 "Percentage" {return "0.00%" } # format id 10
"Scientific" {return "0.00E+00" } # format id 11 "Scientific" {return "0.00E+00" } # format id 11
"Fraction" {return "# ?/?" } # format id 12 "Fraction" {return "# ?/?" } # format id 12
"Short Date" {return "mm-dd-yy" } # format id 14 localized on load by Excel. "Short Date" {return "mm-dd-yy" } # format id 14 localized on load by Excel.
"Short Time" {return "h:mm" } # format id 20 localized on load by Excel. "Short Time" {return "h:mm" } # format id 20 localized on load by Excel.
@@ -278,4 +352,4 @@ Function Expand-NumberFormat {
"Text" {return "@" } # format ID 49 "Text" {return "@" } # format ID 49
Default {return $NumberFormat} Default {return $NumberFormat}
} }
} }

19
ToDo.md
View File

@@ -1,17 +1,4 @@
- [x] Create an autocomplete for WorkSheetName param on ImportExcel and for number format ; where number format exists Translate "Date", "DateTime", "Currency"
- [x] Support "make worksheet active"
- [X] Add checks for valid worksheet names
- [ ] Improve checking of worksheet, pivot names, range names and table names
- [ ] Investigate regional support for number conversion & possible date conversion. Also investigate feasablity of preserving number format when converting string to number - [ ] Investigate regional support for number conversion & possible date conversion. Also investigate feasablity of preserving number format when converting string to number
- [ ] Add help text for parmaters which don't have it ( PivotDataToColumn , NoClobber and CellStyleSB ) in Export Excel, copy to Send-SQLDataToExcel - [ ] Add help to ConvertToExcelXLSx.ps1, Get-HTMLTable.ps1, GetRange.PS1, GetExcelTable.Ps1, Import-HTML.PS1, New-Psitem.PS1 and Remove-Worksheet.ps1
- [ ] Add help in ConvertToExcelXLSx.ps1, Get-HTMLTable.ps1, GetRange.PS1, GetExcelTable.Ps1, Import-HTML.PS1, New-ConditionalFormattingIconSet.Ps1, NewConditionalText.PS1, New-Psitem.PS1, Remove-Worksheet.ps1 and Add-ExcelChart - Copy parameter help from function Add-ExcelChart into New-ExcelChart.ps1 - [ ] Add Examples and tests for new "Quick charts" in Export Excel (is it possible to replace examples that use Charting.ps1, GetXYRange.ps1, InferData.PS1 ? ).
- [ ] Add examples to add-ConditionalFormat, set-format,set-Row and Set-column (e.g. from tests) - [ ] Increase Test code-covereage for import-excel
- [ ] Add Examples and tests for new "Quick charts" in Export Excel (replace examples) that use Charting.ps1, GetXYRange.ps1, InferData.PS1 (move these to deprecated).
- [X] Test Add PivotTable selecting source sheet by position
-[X] Test UnhideSheet, and Wildcard support for hideSheet
- [X] Test return range support for Set-Row
- [X] Test return range support for Set-Column
- [X] Test Expand-NumberFormat.
- [X] Test Set-Row and Set-column setting values as dates and hyperlinks (only testing Column)
- [X] Increase Test code covereage for Set-Format
- [ ] Increase Test code covereage for import-excel

View File

@@ -1,6 +1,8 @@
#Requires -Modules Pester #Requires -Modules Pester
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
Add-Type -AssemblyName System.Windows.Forms
Describe "Compare Worksheet" { Describe "Compare Worksheet" {
Context "Simple comparison output" { Context "Simple comparison output" {
BeforeAll { BeforeAll {

View File

@@ -4,8 +4,8 @@ Remove-item -Path $path1, $path2 -ErrorAction SilentlyContinue
$ProcRange = Get-Process | Export-Excel $path1 -DisplayPropertySet -WorkSheetname Processes -ReturnRange $ProcRange = Get-Process | Export-Excel $path1 -DisplayPropertySet -WorkSheetname Processes -ReturnRange
if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") {$OtherCurrencySymbol = "$"} if ((Get-Culture).NumberFormat.CurrencySymbol -eq "<EFBFBD>") {$OtherCurrencySymbol = "$"}
else {$OtherCurrencySymbol = "£"} else {$OtherCurrencySymbol = "<EFBFBD>"}
[PSCustOmobject][Ordered]@{ [PSCustOmobject][Ordered]@{
Date = Get-Date Date = Get-Date
Formula1 = '=SUM(F2:G2)' Formula1 = '=SUM(F2:G2)'
@@ -25,8 +25,8 @@ else {$OtherCurrencySymbol = "
StrE164Phone = '+32 (444) 444 4444' StrE164Phone = '+32 (444) 444 4444'
StrAltPhone1 = '+32 4 4444 444' StrAltPhone1 = '+32 4 4444 444'
StrAltPhone2 = '+3244444444' StrAltPhone2 = '+3244444444'
StrLeadSpace = ' 123' StrLeadSpace = ' 123'
StrTrailSpace = '123 ' StrTrailSpace = '123 '
Link1 = [uri]"https://github.com/dfinke/ImportExcel" Link1 = [uri]"https://github.com/dfinke/ImportExcel"
Link2 = "https://github.com/dfinke/ImportExcel" # Links are not copied correctly, hopefully this will be fixed at some future date Link2 = "https://github.com/dfinke/ImportExcel" # Links are not copied correctly, hopefully this will be fixed at some future date
} | Export-Excel -NoNumberConversion IPAddress, StrLeadZero, StrAltPhone2 -WorkSheetname MixedTypes -Path $path2 } | Export-Excel -NoNumberConversion IPAddress, StrLeadZero, StrAltPhone2 -WorkSheetname MixedTypes -Path $path2
@@ -50,14 +50,16 @@ Describe "Copy-Worksheet" {
$excel = Open-ExcelPackage -Path $path2 $excel = Open-ExcelPackage -Path $path2
$ws = $Excel.Workbook.Worksheets[3] $ws = $Excel.Workbook.Worksheets[3]
} }
it "Inserted a worksheet with the expected name, number of rows and number of columns " { it "Copied a worksheet, giving the expected name, number of rows and number of columns " {
$Excel.Workbook.Worksheets.count | Should be 3 $Excel.Workbook.Worksheets.count | Should be 3
$ws | Should not benullorEmpty $ws | Should not benullorEmpty
$ws.Name | Should be "CopyOfMixedTypes" $ws.Name | Should be "CopyOfMixedTypes"
$ws.Dimension.Columns | Should be 22 $ws.Dimension.Columns | Should be 22
$ws.Dimension.Rows | Should be 2 $ws.Dimension.Rows | Should be 2
}
it "Copied the expected data into the worksheet " {
$ws.Cells[2, 1].Value.Gettype().name | Should be 'DateTime' $ws.Cells[2, 1].Value.Gettype().name | Should be 'DateTime'
$ws.Cells[2, 2].Formula | Should be '=SUM(F2:G2)' $ws.Cells[2, 2].Formula | Should be 'SUM(F2:G2)'
$ws.Cells[2, 5].Value.GetType().name | Should be 'String' $ws.Cells[2, 5].Value.GetType().name | Should be 'String'
$ws.Cells[2, 6].Value.GetType().name | Should be 'String' $ws.Cells[2, 6].Value.GetType().name | Should be 'String'
$ws.Cells[2, 18].Value.GetType().name | Should be 'String' $ws.Cells[2, 18].Value.GetType().name | Should be 'String'

View File

@@ -1,8 +1,6 @@
#Requires -Modules Pester #Requires -Modules Pester
# $here = Split-Path -Parent $MyInvocation.MyCommand.Path #Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
# Import-Module $here -Force -Verbose
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
if (Get-process -Name Excel,xlim -ErrorAction SilentlyContinue) { Write-Warning -Message "You need to close Excel before running the tests." ; return} if (Get-process -Name Excel,xlim -ErrorAction SilentlyContinue) { Write-Warning -Message "You need to close Excel before running the tests." ; return}
Describe ExportExcel { Describe ExportExcel {
@@ -10,7 +8,8 @@ Describe ExportExcel {
Context "#Example 1 # Creates and opens a file with the right number of rows and columns" { Context "#Example 1 # Creates and opens a file with the right number of rows and columns" {
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
$processes = Get-Process #Test with a maximum of 100 processes for speed; export all properties, then export smaller subsets.
$processes = Get-Process | select-object -first 100
$propertyNames = $Processes[0].psobject.properties.name $propertyNames = $Processes[0].psobject.properties.name
$rowcount = $Processes.Count $rowcount = $Processes.Count
$Processes | Export-Excel $path #-show $Processes | Export-Excel $path #-show
@@ -20,7 +19,7 @@ Describe ExportExcel {
} }
# it "Started Excel to display the file " { # it "Started Excel to display the file " {
# Get-process -Name Excel, xlim -ErrorAction SilentlyContinue | Should not benullorempty # Get-process -Name Excel, xlim -ErrorAction SilentlyContinue | Should not beNullOrEmpty
# } # }
#Start-Sleep -Seconds 5 ; #Start-Sleep -Seconds 5 ;
@@ -29,11 +28,16 @@ Describe ExportExcel {
#TODO Need to test opening pre-existing file with no -create switch (and graceful failure when file does not exist) somewhere else #TODO Need to test opening pre-existing file with no -create switch (and graceful failure when file does not exist) somewhere else
$Excel = Open-ExcelPackage -Path $path -KillExcel $Excel = Open-ExcelPackage -Path $path -KillExcel
it "Killed Excel when Open-Excelpackage was told to " { it "Killed Excel when Open-Excelpackage was told to " {
Get-process -Name Excel, xlim -ErrorAction SilentlyContinue | Should benullorempty Get-process -Name Excel, xlim -ErrorAction SilentlyContinue | Should beNullOrEmpty
} }
it "Created 1 worksheet " { it "Created 1 worksheet, named 'Sheet1' " {
$Excel.Workbook.Worksheets.count | Should be 1 $Excel.Workbook.Worksheets.count | Should be 1
$Excel.Workbook.Worksheets["Sheet1"] | Should not beNullOrEmpty
}
it "Added a 'Sheet1' property to the Package object " {
$Excel.Sheet1 | Should not beNullOrEmpty
} }
$ws = $Excel.Workbook.Worksheets[1] $ws = $Excel.Workbook.Worksheets[1]
@@ -50,7 +54,7 @@ Describe ExportExcel {
} }
} }
it "Formatted the process StartTime field as 'localized Date-Time' " { it "Formatted the process StartTime field as 'localized Date-Time' " {
$STHeader = $ws.cells["1:1"].where( {$_.Value -eq "StartTime"})[0] $STHeader = $ws.cells["1:1"].where( {$_.Value -eq "StartTime"})[0]
$STCell = $STHeader.Address -replace '1$', '2' $STCell = $STHeader.Address -replace '1$', '2'
$ws.cells[$stcell].Style.Numberformat.NumFmtID | Should be 22 $ws.cells[$stcell].Style.Numberformat.NumFmtID | Should be 22
@@ -66,16 +70,16 @@ Describe ExportExcel {
Context " # NoAliasOrScriptPropeties -ExcludeProperty and -DisplayPropertySet work" { Context " # NoAliasOrScriptPropeties -ExcludeProperty and -DisplayPropertySet work" {
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
$processes = Get-Process $processes = Get-Process | Select-Object -First 100
$propertyNames = $Processes[0].psobject.properties.where( {$_.MemberType -eq 'Property'}).name $propertyNames = $Processes[0].psobject.properties.where( {$_.MemberType -eq 'Property'}).name
$rowcount = $Processes.Count $rowcount = $Processes.Count
#TestCreating a range with a name which needs illegal chars removing #Test -NoAliasOrScriptPropeties option and creating a range with a name which needs illegal chars removing - check this sends back a warning
$warnVar = $null $warnVar = $null
$Processes | Export-Excel $path -NoAliasOrScriptPropeties -RangeName "No Spaces" -WarningVariable warnvar -WarningAction SilentlyContinue $Processes | Export-Excel $path -NoAliasOrScriptPropeties -RangeName "No Spaces" -WarningVariable warnvar -WarningAction SilentlyContinue
$Excel = Open-ExcelPackage -Path $path $Excel = Open-ExcelPackage -Path $path
$ws = $Excel.Workbook.Worksheets[1] $ws = $Excel.Workbook.Worksheets[1]
it "Created a new file with alias & Script Properties removed. " { it "Created a new file with Alias & Script Properties removed. " {
$ws.Name | Should be "sheet1" $ws.Name | Should be "sheet1"
$ws.Dimension.Columns | Should be $propertyNames.Count $ws.Dimension.Columns | Should be $propertyNames.Count
$ws.Dimension.Rows | Should be ($rowcount + 1 ) # +1 for the header. $ws.Dimension.Rows | Should be ($rowcount + 1 ) # +1 for the header.
@@ -86,19 +90,20 @@ Describe ExportExcel {
$ws.names["No_spaces"].End.Row | Should be ($rowcount + 1 ) # +1 for the header. $ws.names["No_spaces"].End.Row | Should be ($rowcount + 1 ) # +1 for the header.
$warnVar.Count | Should be 1 $warnVar.Count | Should be 1
} }
#This time use clearsheet instead of deleting the file #This time use clearsheet instead of deleting the file test -Exclude properties, including wildcards.
$Processes | Export-Excel $path -NoAliasOrScriptPropeties -ExcludeProperty SafeHandle, modules, MainModule, StartTime, Threads -ClearSheet $Processes | Export-Excel $path -ClearSheet -NoAliasOrScriptPropeties -ExcludeProperty SafeHandle, threads, modules, MainModule, StartInfo, MachineName, MainWindow*, M*workingSet
$Excel = Open-ExcelPackage -Path $path $Excel = Open-ExcelPackage -Path $path
$ws = $Excel.Workbook.Worksheets[1] $ws = $Excel.Workbook.Worksheets[1]
it "Created a new file with a further 5 properties excluded and cleared the old sheet " { it "Created a new file with further properties excluded and cleared the old sheet " {
$ws.Name | Should be "sheet1" $ws.Name | Should be "sheet1"
$ws.Dimension.Columns | Should be ($propertyNames.Count - 5) $ws.Dimension.Columns | Should be ($propertyNames.Count - 10)
$ws.Dimension.Rows | Should be ($rowcount + 1) # +1 for the header $ws.Dimension.Rows | Should be ($rowcount + 1) # +1 for the header
} }
$propertyNames = $Processes[0].psStandardmembers.DefaultDisplayPropertySet.ReferencedPropertyNames $propertyNames = $Processes[0].psStandardmembers.DefaultDisplayPropertySet.ReferencedPropertyNames
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
#Test -DisplayPropertySet
$Processes | Export-Excel $path -DisplayPropertySet $Processes | Export-Excel $path -DisplayPropertySet
$Excel = Open-ExcelPackage -Path $path $Excel = Open-ExcelPackage -Path $path
@@ -114,7 +119,7 @@ Describe ExportExcel {
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
#testing -ReturnRange switch #testing -ReturnRange switch and applying number format to Formulas as well as values.
$returnedRange = Write-Output -1 668 34 777 860 -0.5 119 -0.1 234 788,"=A9+A10" | Export-Excel -NumberFormat '[Blue]$#,##0.00;[Red]-$#,##0.00' -Path $path -ReturnRange $returnedRange = Write-Output -1 668 34 777 860 -0.5 119 -0.1 234 788,"=A9+A10" | Export-Excel -NumberFormat '[Blue]$#,##0.00;[Red]-$#,##0.00' -Path $path -ReturnRange
it "Created a new file and returned the expected range " { it "Created a new file and returned the expected range " {
Test-Path -Path $path -ErrorAction SilentlyContinue | Should be $true Test-Path -Path $path -ErrorAction SilentlyContinue | Should be $true
@@ -143,15 +148,38 @@ Describe ExportExcel {
} }
} }
Context " # Number format parameter" {
BeforeAll {
$path = "$env:temp\test.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue
1..10 | Export-Excel -Path $path -Numberformat 'Number'
1..10 | Export-Excel -Path $path -Numberformat 'Percentage' -Append
21..30 | Export-Excel -Path $path -Numberformat 'Currency' -StartColumn 3
$excel = Open-ExcelPackage -Path $path
$ws = $excel.Workbook.Worksheets[1]
}
it "Set the worksheet default number format correctly " {
$ws.Cells.Style.Numberformat.Format | Should be "0.00"
}
it "Set number formats on specific blocks of cells " {
$ws.Cells["A2" ].Style.Numberformat.Format | Should be "0.00"
$ws.Cells["c19"].Style.Numberformat.Format | Should be "0.00"
$ws.Cells["A20"].Style.Numberformat.Format | Should be "0.00%"
$ws.Cells["C6" ].Style.Numberformat.Format | Should be (Expand-NumberFormat "currency")
}
}
Context "#Examples 3 & 4 # Setting cells for different data types Also added test for URI type" { Context "#Examples 3 & 4 # Setting cells for different data types Also added test for URI type" {
if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") {$OtherCurrencySymbol = "$"} if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") {$OtherCurrencySymbol = "$"}
else {$OtherCurrencySymbol = "£"} else {$OtherCurrencySymbol = "£"}
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
$warnVar = $null
#Test correct export of different data types and number formats; test hyperlinks, test -NoNumberConversion test object is converted to a string with no warnings, test calcuation of formula
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
[PSCustOmobject][Ordered]@{ [PSCustOmobject][Ordered]@{
Date = Get-Date Date = Get-Date
Formula1 = '=SUM(F2:G2)' Formula1 = '=SUM(S2:T2)'
String1 = 'My String' String1 = 'My String'
Float = [math]::pi Float = [math]::pi
IPAddress = '10.10.25.5' IPAddress = '10.10.25.5'
@@ -163,8 +191,8 @@ Describe ExportExcel {
StrNegInt = '-31' StrNegInt = '-31'
StrTrailingNeg = '31-' StrTrailingNeg = '31-'
StrParens = '(123)' StrParens = '(123)'
strLocalCurrency = ('{0}123.45' -f (Get-Culture).NumberFormat.CurrencySymbol ) strLocalCurrency = ('{0}123{1}45' -f (Get-Culture).NumberFormat.CurrencySymbol,(Get-Culture).NumberFormat.CurrencyDecimalSeparator)
strOtherCurrency = ('{0}123.45' -f $OtherCurrencySymbol ) strOtherCurrency = ('{0}123{1}45' -f $OtherCurrencySymbol ,(Get-Culture).NumberFormat.CurrencyDecimalSeparator)
StrE164Phone = '+32 (444) 444 4444' StrE164Phone = '+32 (444) 444 4444'
StrAltPhone1 = '+32 4 4444 444' StrAltPhone1 = '+32 4 4444 444'
StrAltPhone2 = '+3244444444' StrAltPhone2 = '+3244444444'
@@ -174,30 +202,37 @@ Describe ExportExcel {
Link2 = "https://github.com/dfinke/ImportExcel" Link2 = "https://github.com/dfinke/ImportExcel"
Link3 = "xl://internal/sheet1!A1" Link3 = "xl://internal/sheet1!A1"
Link4 = "xl://internal/sheet1!C5" Link4 = "xl://internal/sheet1!C5"
} | Export-Excel -NoNumberConversion IPAddress, StrLeadZero, StrAltPhone2 -Path $path Link5 = (New-Object -TypeName OfficeOpenXml.ExcelHyperLink -ArgumentList "Sheet1!E2" , "Display Text")
Process = (Get-Process -Id $PID)
TimeSpan = [datetime]::Now.Subtract([datetime]::Today)
} | Export-Excel -NoNumberConversion IPAddress, StrLeadZero, StrAltPhone2 -Path $path -Calculate -WarningVariable $warnVar
it "Created a new file " { it "Created a new file " {
Test-Path -Path $path -ErrorAction SilentlyContinue | Should be $true Test-Path -Path $path -ErrorAction SilentlyContinue | Should be $true
} }
$Excel = Open-ExcelPackage -Path $path $Excel = Open-ExcelPackage -Path $path
it "Created 1 worksheet " { it "Created 1 worksheet with no warnings " {
$Excel.Workbook.Worksheets.count | Should be 1 $Excel.Workbook.Worksheets.count | Should be 1
$warnVar | Should beNullorEmpty
} }
$ws = $Excel.Workbook.Worksheets[1] $ws = $Excel.Workbook.Worksheets[1]
it "Created the worksheet with the expected name, number of rows and number of columns " { it "Created the worksheet with the expected name, number of rows and number of columns " {
$ws.Name | Should be "sheet1" $ws.Name | Should be "sheet1"
$ws.Dimension.Columns | Should be 24 $ws.Dimension.Columns | Should be 27
$ws.Dimension.Rows | Should be 2 $ws.Dimension.Rows | Should be 2
} }
it "Set a date in Cell A2 " { it "Set a date in Cell A2 " {
$ws.Cells[2, 1].Value.Gettype().name | Should be 'DateTime' $ws.Cells[2, 1].Value.Gettype().name | Should be 'DateTime'
} }
it "Set a formula in Cell B2 " { it "Set a formula in Cell B2 " {
$ws.Cells[2, 2].Formula | Should be '=SUM(F2:G2)' $ws.Cells[2, 2].Formula | Should be 'SUM(S2:T2)'
}
it "Forced a successful calculation of the Value in Cell B2 " {
$ws.Cells[2, 2].Value | Should be 246
} }
it "Set strings in Cells E2, F2 and R2 (no number conversion) " { it "Set strings in Cells E2, F2 and R2 (no number conversion) " {
$ws.Cells[2, 5].Value.GetType().name | Should be 'String' $ws.Cells[2, 5].Value.GetType().name | Should be 'String'
$ws.Cells[2, 6].Value.GetType().name | Should be 'String' $ws.Cells[2, 6].Value.GetType().name | Should be 'String'
$ws.Cells[2, 18].Value.GetType().name | Should be 'String' $ws.Cells[2, 18].Value.GetType().name | Should be 'String'
} }
it "Set numbers in Cells K2,L2,M2 (diferent Negative integer formats) " { it "Set numbers in Cells K2,L2,M2 (diferent Negative integer formats) " {
($ws.Cells[2, 11].Value -is [valuetype] ) | Should be $true ($ws.Cells[2, 11].Value -is [valuetype] ) | Should be $true
@@ -218,6 +253,8 @@ Describe ExportExcel {
$ws.Cells[2, 24].Hyperlink.Scheme | Should be "xl" $ws.Cells[2, 24].Hyperlink.Scheme | Should be "xl"
$ws.Cells[2, 24].Hyperlink.ReferenceAddress | Should be "sheet1!c5" $ws.Cells[2, 24].Hyperlink.ReferenceAddress | Should be "sheet1!c5"
$ws.Cells[2, 24].Hyperlink.Display | Should be "sheet1!c5" $ws.Cells[2, 24].Hyperlink.Display | Should be "sheet1!c5"
$ws.Cells[2, 25].Hyperlink.ReferenceAddress | Should be "sheet1!E2"
$ws.Cells[2, 25].Hyperlink.Display | Should be "Display Text"
} }
it "Processed thousands according to local settings (Cells H2 and I2) " { it "Processed thousands according to local settings (Cells H2 and I2) " {
if ((Get-Culture).NumberFormat.NumberGroupSeparator -EQ ",") { if ((Get-Culture).NumberFormat.NumberGroupSeparator -EQ ",") {
@@ -241,12 +278,21 @@ Describe ExportExcel {
($ws.Cells[2, 19].Value -is [valuetype] ) | Should be $true ($ws.Cells[2, 19].Value -is [valuetype] ) | Should be $true
($ws.Cells[2, 20].Value -is [valuetype] ) | Should be $true ($ws.Cells[2, 20].Value -is [valuetype] ) | Should be $true
} }
it "Converted a nested object to a string (Y2) " {
$ws.Cells[2, 26].Value | should match '^System\.Diagnostics\.Process\s+\(.*\)$'
}
it "Processed a timespan object (Z2) " {
$ws.cells[2, 27].Value.ToOADate() | should beGreaterThan 0
$ws.cells[2, 27].Value.ToOADate() | should beLessThan 1
$ws.cells[2, 27].Style.Numberformat.Format | should be '[h]:mm:ss'
}
} }
Context "# # Setting cells for different data types with -noHeader" { Context "# # Setting cells for different data types with -noHeader" {
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
#Test -NoHeader & -NoNumberConversion
[PSCustOmobject][Ordered]@{ [PSCustOmobject][Ordered]@{
Date = Get-Date Date = Get-Date
Formula1 = '=SUM(F1:G1)' Formula1 = '=SUM(F1:G1)'
@@ -280,11 +326,11 @@ Describe ExportExcel {
} }
it "Set a date in Cell A1 " { it "Set a date in Cell A1 " {
$ws.Cells[1, 1].Value.Gettype().name | Should be 'DateTime' $ws.Cells[1, 1].Value.Gettype().name | Should be 'DateTime'
} }
it "Set a formula in Cell B1 " { it "Set a formula in Cell B1 " {
$ws.Cells[1, 2].Formula | Should be '=SUM(F1:G1)' $ws.Cells[1, 2].Formula | Should be 'SUM(F1:G1)'
} }
it "Set strings in Cells E1 and F1 " { it "Set strings in Cells E1 and F1 " {
@@ -302,23 +348,25 @@ Describe ExportExcel {
} }
Context "#Example 5 # Adding a single conditional format " { Context "#Example 5 # Adding a single conditional format " {
#Test New-ConditionalText builds correctly
$ct = New-ConditionalText -ConditionalType GreaterThan 525 -ConditionalTextColor DarkRed -BackgroundColor LightPink $ct = New-ConditionalText -ConditionalType GreaterThan 525 -ConditionalTextColor DarkRed -BackgroundColor LightPink
it "Created a Conditional format description " { it "Created a Conditional format description " {
$ct.BackgroundColor -is [System.Drawing.Color] | Should be $true $ct.BackgroundColor -is [System.Drawing.Color] | Should be $true
$ct.ConditionalTextColor -is [System.Drawing.Color] | Should be $true $ct.ConditionalTextColor -is [System.Drawing.Color] | Should be $true
$ct.ConditionalType -in [enum]::GetNames( [OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType] ) | $ct.ConditionalType -in [enum]::GetNames( [OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType] ) |
Should be $true Should be $true
} }
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
#Test -ConditionalText with a single conditional spec.
Write-Output 489 668 299 777 860 151 119 497 234 788 | Export-Excel -Path $path -ConditionalText $ct Write-Output 489 668 299 777 860 151 119 497 234 788 | Export-Excel -Path $path -ConditionalText $ct
it "Created a new file " { it "Created a new file " {
Test-Path -Path $path -ErrorAction SilentlyContinue | Should be $true Test-Path -Path $path -ErrorAction SilentlyContinue | Should be $true
} }
#ToDo need to test applying conitional formatting to a pre-existing worksheet #ToDo need to test applying conitional formatting to a pre-existing worksheet and removing = from formula
$Excel = Open-ExcelPackage -Path $path $Excel = Open-ExcelPackage -Path $path
$ws = $Excel.Workbook.Worksheets[1] $ws = $Excel.Workbook.Worksheets[1]
@@ -333,13 +381,11 @@ Describe ExportExcel {
$cf.Type.ToString() | Should be $ct.ConditionalType $cf.Type.ToString() | Should be $ct.ConditionalType
#$cf.Style.Fill.BackgroundColor | Should be $ct.BackgroundColor #$cf.Style.Fill.BackgroundColor | Should be $ct.BackgroundColor
# $cf.Style.Font.Color | Should be $ct.ConditionalTextColor - have to compare r.g.b # $cf.Style.Font.Color | Should be $ct.ConditionalTextColor - have to compare r.g.b
} }
} }
Context "#Example 6 # Adding multiple conditional formats using short form syntax. " { Context "#Example 6 # Adding multiple conditional formats using short form syntax. " {
#this is a test of adding more than one conditional block and using the minimal syntax for new-ConditionalText = #Test adding mutliple conditional blocks and using the minimal syntax for new-ConditionalText
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue Remove-item -Path $path -ErrorAction SilentlyContinue
@@ -387,6 +433,7 @@ Describe ExportExcel {
} }
$Array = $Obj1, $Obj2, $Obj3 $Array = $Obj1, $Obj2, $Obj3
#test Update-FirstObjectProperties
$newarray = $Array | Update-FirstObjectProperties $newarray = $Array | Update-FirstObjectProperties
it "Outputs as many objects as it input " { it "Outputs as many objects as it input " {
$newarray.Count | Should be $Array.Count $newarray.Count | Should be $Array.Count
@@ -402,20 +449,21 @@ Describe ExportExcel {
Context "#Examples 8 & 9 # Adding Pivot tables and charts from parameters" { Context "#Examples 8 & 9 # Adding Pivot tables and charts from parameters" {
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
#This time we are not deleting the XLSX file so this Should create a new, named, sheet. #Test -passthru and -worksheetName creating a new, named, sheet in an existing file.
$Excel = Get-Process | Select-Object -first 50 -Property Name, cpu, pm, handles, company | Export-Excel $path -WorkSheetname Processes -PassThru $Excel = Get-Process | Select-Object -first 20 -Property Name, cpu, pm, handles, company | Export-Excel $path -WorkSheetname Processes -PassThru
#Testing -passthru and adding the Pivot as a second step. Want to save and re-open it ... #Testing -Excel Pacakage and adding a Pivot-table as a second step. Want to save and re-open it ...
Export-Excel -ExcelPackage $Excel -WorkSheetname Processes -IncludePivotTable -PivotRows Company -PivotData PM -NoTotalsInPivot Export-Excel -ExcelPackage $Excel -WorkSheetname Processes -IncludePivotTable -PivotRows Company -PivotData PM -NoTotalsInPivot
$Excel = Open-ExcelPackage $path $Excel = Open-ExcelPackage $path
$PTws = $Excel.Workbook.Worksheets["ProcessesPivotTable"] $PTws = $Excel.Workbook.Worksheets["ProcessesPivotTable"]
$wCount = $Excel.Workbook.Worksheets.Count $wCount = $Excel.Workbook.Worksheets.Count
it "Added the named sheet and pivot table to the workbook " { it "Added the named sheet and pivot table to the workbook " {
$excel.ProcessesPivotTable | Should not beNullOrEmpty
$PTws | Should not beNullOrEmpty $PTws | Should not beNullOrEmpty
$PTws.PivotTables.Count | Should be 1 $PTws.PivotTables.Count | Should be 1
$Excel.Workbook.Worksheets["Processes"] | Should not beNullOrEmpty $Excel.Workbook.Worksheets["Processes"] | Should not beNullOrEmpty
$Excel.Workbook.Worksheets.Count | Should beGreaterThan 2 $Excel.Workbook.Worksheets.Count | Should beGreaterThan 2
# $excel.Workbook.Worksheets["Processes"].Dimension.rows | Should be 51 #50 data + 1 header $excel.Workbook.Worksheets["Processes"].Dimension.rows | Should be 21 #20 data + 1 header
} }
$pt = $PTws.PivotTables[0] $pt = $PTws.PivotTables[0]
it "Built the expected Pivot table " { it "Built the expected Pivot table " {
@@ -426,7 +474,7 @@ Describe ExportExcel {
$pt.DataFields[0].Field.Name | Should be "PM" $pt.DataFields[0].Field.Name | Should be "PM"
$PTws.Drawings.Count | Should be 0 $PTws.Drawings.Count | Should be 0
} }
#using the already open sheet add the pivot chart #test adding pivot chart using the already open sheet
$warnvar = $null $warnvar = $null
Export-Excel -ExcelPackage $Excel -WorkSheetname Processes -IncludePivotTable -PivotRows Company -PivotData PM -IncludePivotChart -ChartType PieExploded3D -ShowCategory -NoLegend -WarningAction SilentlyContinue -WarningVariable warnvar Export-Excel -ExcelPackage $Excel -WorkSheetname Processes -IncludePivotTable -PivotRows Company -PivotData PM -IncludePivotChart -ChartType PieExploded3D -ShowCategory -NoLegend -WarningAction SilentlyContinue -WarningVariable warnvar
$Excel = Open-ExcelPackage $path $Excel = Open-ExcelPackage $path
@@ -439,15 +487,16 @@ Describe ExportExcel {
it "Generated a message on re-processing the Pivot table " { it "Generated a message on re-processing the Pivot table " {
$warnVar | Should not beNullOrEmpty $warnVar | Should not beNullOrEmpty
} }
#Test appending data extends pivot chart (with a warning) .
$warnVar = $null $warnVar = $null
Get-Process | Select-Object -Last 50 -Property Name, cpu, pm, handles, company | Export-Excel $path -WorkSheetname Processes -Append -IncludePivotTable -PivotRows Company -PivotData PM -IncludePivotChart -ChartType PieExploded3D -WarningAction SilentlyContinue -WarningVariable warnvar Get-Process | Select-Object -Last 20 -Property Name, cpu, pm, handles, company | Export-Excel $path -WorkSheetname Processes -Append -IncludePivotTable -PivotRows Company -PivotData PM -IncludePivotChart -ChartType PieExploded3D -WarningAction SilentlyContinue -WarningVariable warnvar
$Excel = Open-ExcelPackage $path $Excel = Open-ExcelPackage $path
$pt = $Excel.Workbook.Worksheets["ProcessesPivotTable"].PivotTables[0] $pt = $Excel.Workbook.Worksheets["ProcessesPivotTable"].PivotTables[0]
it "Appended to the Worksheet and Extended the Pivot table " { it "Appended to the Worksheet and Extended the Pivot table " {
$Excel.Workbook.Worksheets.Count | Should be $wCount $Excel.Workbook.Worksheets.Count | Should be $wCount
# $excel.Workbook.Worksheets["Processes"].Dimension.rows | Should be 101 #appended 50 rows to the previous total $excel.Workbook.Worksheets["Processes"].Dimension.rows | Should be 41 #appended 20 rows to the previous total
# $pt.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref | $pt.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref |
# Should be "A1:E101" Should be "A1:E41"
} }
it "Generated a message on extending the Pivot table " { it "Generated a message on extending the Pivot table " {
$warnVar | Should not beNullOrEmpty $warnVar | Should not beNullOrEmpty
@@ -456,7 +505,7 @@ Describe ExportExcel {
Context " # Add-Worksheet inserted sheets, moved them correctly, and copied a sheet" { Context " # Add-Worksheet inserted sheets, moved them correctly, and copied a sheet" {
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
#Test the -CopySource and -Movexxxx parameters for Add-WorkSheet
$Excel = Open-ExcelPackage $path $Excel = Open-ExcelPackage $path
#At this point Sheets Should be in the order Sheet1, Processes, ProcessesPivotTable #At this point Sheets Should be in the order Sheet1, Processes, ProcessesPivotTable
$null = Add-WorkSheet -ExcelPackage $Excel -WorkSheetname "Processes" -MoveToEnd # order now Sheet1, ProcessesPivotTable, Processes $null = Add-WorkSheet -ExcelPackage $Excel -WorkSheetname "Processes" -MoveToEnd # order now Sheet1, ProcessesPivotTable, Processes
@@ -489,11 +538,12 @@ Describe ExportExcel {
Context " # Create and append with Start row and Start Column, inc ranges and Pivot table. " { Context " # Create and append with Start row and Start Column, inc ranges and Pivot table. " {
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
remove-item -Path $path -ErrorAction SilentlyContinue
#Catch warning #Catch warning
$warnVar = $null $warnVar = $null
#Test Append with no existing sheet. Test adding a named pivot table from a command line parameter #Test -Append with no existing sheet. Test adding a named pivot table from command line parameters and extending ranges when they're not specified explictly
Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company | Export-Excel -StartRow 3 -StartColumn 3 -AutoFilter -AutoNameRange -BoldTopRow -IncludePivotTable -PivotRows Company -PivotData PM -PivotTableName 'PTOffset' -Path $path -WorkSheetname withOffset -Append -PivotFilter Name -NoTotalsInPivot Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company | Export-Excel -StartRow 3 -StartColumn 3 -BoldTopRow -IncludePivotTable -PivotRows Company -PivotData PM -PivotTableName 'PTOffset' -Path $path -WorkSheetname withOffset -Append -PivotFilter Name -NoTotalsInPivot -RangeName procs -AutoFilter -AutoNameRange
Get-Process | Select-Object -last 10 -Property Name, cpu, pm, handles, company | Export-Excel -StartRow 3 -StartColumn 3 -AutoFilter -AutoNameRange -BoldTopRow -IncludePivotTable -PivotRows Company -PivotData PM -PivotTableName 'PTOffset' -Path $path -WorkSheetname withOffset -Append -WarningAction SilentlyContinue -WarningVariable warnvar Get-Process | Select-Object -last 10 -Property Name, cpu, pm, handles, company | Export-Excel -StartRow 3 -StartColumn 3 -BoldTopRow -IncludePivotTable -PivotRows Company -PivotData PM -PivotTableName 'PTOffset' -Path $path -WorkSheetname withOffset -Append -WarningAction SilentlyContinue -WarningVariable warnvar
$Excel = Open-ExcelPackage $path $Excel = Open-ExcelPackage $path
$dataWs = $Excel.Workbook.Worksheets["withOffset"] $dataWs = $Excel.Workbook.Worksheets["withOffset"]
$pt = $Excel.Workbook.Worksheets["PTOffset"].PivotTables[0] $pt = $Excel.Workbook.Worksheets["PTOffset"].PivotTables[0]
@@ -505,21 +555,71 @@ Describe ExportExcel {
$dataWs.Dimension.End.Row | Should be 23 $dataWs.Dimension.End.Row | Should be 23
$dataWs.names[0].end.row | Should be 23 $dataWs.names[0].end.row | Should be 23
$dataWs.names[0].name | Should be 'Name' $dataWs.names[0].name | Should be 'Name'
$dataWs.names.Count | Should be 6 $dataWs.names.Count | Should be 7 # Name, cpu, pm, handles & company + Named Range "Procs" + xl one for autofilter
$dataWs.cells[$dataws.Dimension].AutoFilter | Should be true $dataWs.cells[$dataws.Dimension].AutoFilter | Should be true
}
it "Applied and auto-extended an autofilter " {
$dataWs.Names["_xlnm._FilterDatabase"].Start.Row | should be 3 #offset
$dataWs.Names["_xlnm._FilterDatabase"].Start.Column | should be 3
$dataWs.Names["_xlnm._FilterDatabase"].Rows | should be 21 #2 x 10 data + 1 header
$dataWs.Names["_xlnm._FilterDatabase"].Columns | should be 5 #Name, cpu, pm, handles & company
$dataWs.Names["_xlnm._FilterDatabase"].AutoFilter | should be $true
}
it "Created and auto-extended the named ranges " {
$dataWs.names["procs"].rows | should be 21
$dataWs.names["procs"].Columns | should be 5
$dataWs.Names["CPU"].Rows | should be 20
$dataWs.Names["CPU"].Columns | should be 1
}
it "Created and extended the pivot table " {
$pt.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref | $pt.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref |
Should be "C3:G23" Should be "C3:G23"
$pt.ColumGrandTotals | should be $false
$pt.RowGrandTotals | should be $false
$pt.Fields["Company"].IsRowField | should be $true
$pt.Fields["PM"].IsDataField | should be $true
$pt.Fields["Name"].IsPageField | should be $true
} }
it "Generated a message on extending the Pivot table " { it "Generated a message on extending the Pivot table " {
$warnVar | Should not beNullOrEmpty $warnVar | Should not beNullOrEmpty
} }
} }
Context " # Create and append explicit and auto table and range extension" {
$path = "$env:TEMP\Test.xlsx"
#Test -Append automatically extends a table, even when it is not specified in the append command
Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company | Export-Excel -Path $path -TableName ProcTab -AutoNameRange -WorkSheetname NoOffset -ClearSheet
Get-Process | Select-Object -last 10 -Property Name, cpu, pm, handles, company | Export-Excel -Path $path -AutoNameRange -WorkSheetname NoOffset -Append
$Excel = Open-ExcelPackage $path
$dataWs = $Excel.Workbook.Worksheets["NoOffset"]
it "Created a new sheet and auto-extended a table and explicitly extended named ranges " {
$dataWs.Tables["ProcTab"].Address.Address | should be "A1:E21"
$dataWs.Names["CPU"].Rows | should be 20
$dataWs.Names["CPU"].Columns | should be 1
}
#Test extneding autofilter and range when explicitly specified in the append
$excel = Get-Process | Select-Object -first 10 -Property Name, cpu, pm, handles, company | Export-Excel -ExcelPackage $excel -RangeName procs -AutoFilter -WorkSheetname NoOffset -ClearSheet -PassThru
Get-Process | Select-Object -last 10 -Property Name, cpu, pm, handles, company | Export-Excel -ExcelPackage $excel -RangeName procs -AutoFilter -WorkSheetname NoOffset -Append
$Excel = Open-ExcelPackage $path
$dataWs = $Excel.Workbook.Worksheets["NoOffset"]
it "Created a new sheet and explicitly extended named range and autofilter " {
$dataWs.names["procs"].rows | should be 21
$dataWs.names["procs"].Columns | should be 5
$dataWs.Names["_xlnm._FilterDatabase"].Rows | should be 21 #2 x 10 data + 1 header
$dataWs.Names["_xlnm._FilterDatabase"].Columns | should be 5 #Name, cpu, pm, handles & company
$dataWs.Names["_xlnm._FilterDatabase"].AutoFilter | should be $true
}
}
Context "#Example 11 # Create and append with title, inc ranges and Pivot table" { Context "#Example 11 # Create and append with title, inc ranges and Pivot table" {
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
#Test New-PivotTableDefinition builds definition using -Pivotfilter and -PivotTotals options.
$ptDef = [ordered]@{} $ptDef = [ordered]@{}
$ptDef += New-PivotTableDefinition -PivotTableName "PT1" -SourceWorkSheet 'Sheet1' -PivotRows "Status" -PivotData @{'Status' = 'Count'} -PivotFilter "StartType" -IncludePivotChart -ChartType BarClustered3D -ChartTitle "Services by status" -ChartHeight 512 -ChartWidth 768 -ChartRow 10 -ChartColumn 0 -NoLegend $ptDef += New-PivotTableDefinition -PivotTableName "PT1" -SourceWorkSheet 'Sheet1' -PivotRows "Status" -PivotData @{'Status' = 'Count'} -PivotTotals Columns -PivotFilter "StartType" -IncludePivotChart -ChartType BarClustered3D -ChartTitle "Services by status" -ChartHeight 512 -ChartWidth 768 -ChartRow 10 -ChartColumn 0 -NoLegend -PivotColumns CanPauseAndContinue
$ptDef += New-PivotTableDefinition -PivotTableName "PT2" -SourceWorkSheet 'Sheet2' -PivotRows "Company" -PivotData @{'Company' = 'Count'} -IncludePivotChart -ChartType PieExploded3D -ShowPercent -WarningAction SilentlyContinue $ptDef += New-PivotTableDefinition -PivotTableName "PT2" -SourceWorkSheet 'Sheet2' -PivotRows "Company" -PivotData @{'Company' = 'Count'} -PivotTotalS Rows -IncludePivotChart -ChartType PieExploded3D -ShowPercent -WarningAction SilentlyContinue
it "Built a pivot definition using New-PivotTableDefinition " { it "Built a pivot definition using New-PivotTableDefinition " {
$ptDef.PT1.SourceWorkSheet | Should be 'Sheet1' $ptDef.PT1.SourceWorkSheet | Should be 'Sheet1'
@@ -528,11 +628,13 @@ Describe ExportExcel {
$ptDef.PT1.PivotFilter | Should be 'StartType' $ptDef.PT1.PivotFilter | Should be 'StartType'
$ptDef.PT1.IncludePivotChart | Should be $true $ptDef.PT1.IncludePivotChart | Should be $true
$ptDef.PT1.ChartType.tostring() | Should be 'BarClustered3D' $ptDef.PT1.ChartType.tostring() | Should be 'BarClustered3D'
$ptDef.PT1.PivotTotals | Should be 'Columns'
} }
Remove-Item -Path $path Remove-Item -Path $path
#Catch warning #Catch warning
$warnvar = $null $warnvar = $null
Get-Service | Select-Object -Property Status, Name, DisplayName, StartType | Export-Excel -Path $path -AutoSize -TableName "All Services" -TableStyle Medium1 -WarningAction SilentlyContinue -WarningVariable warnvar #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 AliceBlue -TitleBold -TitleSize 22 -PivotTableDefinition $ptDef
$Excel = Open-ExcelPackage $path $Excel = Open-ExcelPackage $path
$ws1 = $Excel.Workbook.Worksheets["Sheet1"] $ws1 = $Excel.Workbook.Worksheets["Sheet1"]
@@ -567,17 +669,21 @@ Describe ExportExcel {
$PT2 = $ptsheet2.PivotTables[0] $PT2 = $ptsheet2.PivotTables[0]
$PC1 = $ptsheet1.Drawings[0] $PC1 = $ptsheet1.Drawings[0]
$PC2 = $ptsheet2.Drawings[0] $PC2 = $ptsheet2.Drawings[0]
it "Created the correct pivot tables and charts from the definitions. " { it "Created the pivot tables linked to the right data. " {
$PT1.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref | $PT1.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref |
Should be ("A1:" + $ws1.Dimension.End.Address) Should be ("A1:" + $ws1.Dimension.End.Address)
$PT2.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref | $PT2.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref |
Should be ("A2:" + $ws2.Dimension.End.Address) #Title in row 1 Should be ("A2:" + $ws2.Dimension.End.Address) #Title in row 1
}
it "Set the other pivot tables and chart options from the definitions. " {
$pt1.PageFields[0].Name | Should be 'StartType' $pt1.PageFields[0].Name | Should be 'StartType'
$pt1.RowFields[0].Name | Should be 'Status' $pt1.RowFields[0].Name | Should be 'Status'
$pt1.DataFields[0].Field.name | Should be 'Status' $pt1.DataFields[0].Field.name | Should be 'Status'
$pt1.DataFields[0].Function | Should be 'Count' $pt1.DataFields[0].Function | Should be 'Count'
$pt1.ColumGrandTotals | should be $true
$pt1.RowGrandTotals | should be $false
$pt2.ColumGrandTotals | should be $false
$pt2.RowGrandTotals | should be $true
$pc1.ChartType | Should be 'BarClustered3D' $pc1.ChartType | Should be 'BarClustered3D'
$pc1.From.Column | Should be 0 #chart 1 at 0,10 chart 2 at 4,0 (default) $pc1.From.Column | Should be 0 #chart 1 at 0,10 chart 2 at 4,0 (default)
$pc2.From.Column | Should be 4 $pc2.From.Column | Should be 4
@@ -593,18 +699,21 @@ Describe ExportExcel {
Context "#Example 13 # Formatting and another way to do a pivot. " { Context "#Example 13 # Formatting and another way to do a pivot. " {
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
Remove-Item $path Remove-Item $path
#Test freezing top row/first column, adding formats and a pivot table - from Add-Pivot table not a specification variable - after the export
$excel = Get-Process | Select-Object -Property Name, Company, Handles, CPU, PM, NPM, WS | Export-Excel -Path $path -ClearSheet -WorkSheetname "Processes" -FreezeTopRowFirstColumn -PassThru $excel = Get-Process | Select-Object -Property Name, Company, Handles, CPU, PM, NPM, WS | Export-Excel -Path $path -ClearSheet -WorkSheetname "Processes" -FreezeTopRowFirstColumn -PassThru
$sheet = $excel.Workbook.Worksheets["Processes"] $sheet = $excel.Workbook.Worksheets["Processes"]
$sheet.Column(1) | Set-Format -Bold -AutoFit $sheet.Column(1) | Set-ExcelRange -Bold -AutoFit
$sheet.Column(2) | Set-Format -Width 29 -WrapText $sheet.Column(2) | Set-ExcelRange -Width 29 -WrapText
$sheet.Column(3) | Set-Format -HorizontalAlignment Right -NFormat "#,###" $sheet.Column(3) | Set-ExcelRange -HorizontalAlignment Right -NFormat "#,###"
Set-Format -Address $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NFormat "#,###" Set-ExcelRange -Address $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NFormat "#,###"
Set-Format -Address $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold Set-ExcelRange -Address $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold
Set-Format -Address $sheet.Row(1) -Bold -HorizontalAlignment Center 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 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 $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 Red -Bold -Italic -Underline -BackgroundColor Beige -BackgroundPattern LightUp -PatternColor Gray
foreach ($c in 5..9) {Set-Format $sheet.Column($c) -AutoFit } #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 Add-PivotTable -PivotTableName "PT_Procs" -ExcelPackage $excel -SourceWorkSheet 1 -PivotRows Company -PivotData @{'Name' = 'Count'} -IncludePivotChart -ChartType ColumnClustered -NoLegend
Close-ExcelPackage $excel Close-ExcelPackage $excel
@@ -659,14 +768,27 @@ Describe ExportExcel {
Context " # Chart from MultiSeries.ps1 in the Examples\charts Directory" { Context " # Chart from MultiSeries.ps1 in the Examples\charts Directory" {
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
Remove-Item -Path $path -ErrorAction SilentlyContinue Remove-Item -Path $path -ErrorAction SilentlyContinue
$data = invoke-sum (Get-Process) Company Handles, PM, VirtualMemorySize #Test we haven't missed any parameters on New-ChartDefinition which are on add chart or vice versa.
it "used Invoke-Sum to create a data set " {
$ParamChk1 = (get-command Add-ExcelChart ).Parameters.Keys.where({-not (get-command New-ExcelChartDefinition).Parameters.ContainsKey($_) }) | Sort-Object
$ParamChk2 = (get-command New-ExcelChartDefinition).Parameters.Keys.where({-not (get-command Add-ExcelChart ).Parameters.ContainsKey($_) })
it "Found the same parameters for Add-ExcelChart and New-ExcelChartDefinintion " {
$ParamChk1.count | Should be 3
$ParamChk1[0] | Should be "PassThru"
$ParamChk1[1] | Should be "PivotTable"
$ParamChk1[2] | Should be "Worksheet"
$ParamChk2.count | Should be 1
$ParamChk2[0] | Should be "Header"
}
#Test Invoke-Sum
$data = Invoke-Sum (Get-Process) Company Handles, PM, VirtualMemorySize
it "Used Invoke-Sum to create a data set " {
$data | Should not beNullOrEmpty $data | Should not beNullOrEmpty
$data.count | Should beGreaterThan 1 $data.count | Should beGreaterThan 1
$data[1].Name | Should not beNullOrEmpty $data[1].Name | Should not beNullOrEmpty
$data[1].Handles | Should not beNullOrEmpty $data[1].Handles | Should not beNullOrEmpty
$data[1].PM | Should not beNullOrEmpty $data[1].PM | Should not beNullOrEmpty
$data[1].VirtualMemorySize | Should not beNullOrEmpty $data[1].VirtualMemorySize | Should not beNullOrEmpty
} }
$c = New-ExcelChartDefinition -Title Stats -ChartType LineMarkersStacked -XRange "Processes[Name]" -YRange "Processes[PM]", "Processes[VirtualMemorySize]" -SeriesHeader 'PM', 'VMSize' $c = New-ExcelChartDefinition -Title Stats -ChartType LineMarkersStacked -XRange "Processes[Name]" -YRange "Processes[PM]", "Processes[VirtualMemorySize]" -SeriesHeader 'PM', 'VMSize'
@@ -684,6 +806,7 @@ Describe ExportExcel {
$c.ShowCategory | Should not be $true $c.ShowCategory | Should not be $true
$c.ShowPercent | Should not be $true $c.ShowPercent | Should not be $true
} }
#Test creating a chart using -ExcelChartDefinition.
$data | Export-Excel $path -AutoSize -TableName Processes -ExcelChartDefinition $c $data | Export-Excel $path -AutoSize -TableName Processes -ExcelChartDefinition $c
$excel = Open-ExcelPackage -Path $path $excel = Open-ExcelPackage -Path $path
$drawings = $excel.Workbook.Worksheets[1].drawings $drawings = $excel.Workbook.Worksheets[1].drawings
@@ -702,11 +825,16 @@ Describe ExportExcel {
Context " # variation of plot.ps1 from Examples Directory using Add chart outside ExportExcel" { Context " # variation of plot.ps1 from Examples Directory using Add chart outside ExportExcel" {
$path = "$env:TEMP\Test.xlsx" $path = "$env:TEMP\Test.xlsx"
#Test inserting a fomual
$excel = 0..360 | ForEach-Object {[pscustomobject][ordered]@{x = $_; Sinx = "=Sin(Radians(x)) "}} | Export-Excel -AutoNameRange -Path $path -WorkSheetname SinX -ClearSheet -FreezeFirstColumn -PassThru $excel = 0..360 | ForEach-Object {[pscustomobject][ordered]@{x = $_; Sinx = "=Sin(Radians(x)) "}} | Export-Excel -AutoNameRange -Path $path -WorkSheetname SinX -ClearSheet -FreezeFirstColumn -PassThru
#Test-Add Excel Chart to existing data. Test add Conditional formatting with a formula
Add-ExcelChart -Worksheet $excel.Workbook.Worksheets["Sinx"] -ChartType line -XRange "X" -YRange "Sinx" -SeriesHeader "Sin(x)" -Title "Graph of Sine X" -TitleBold -TitleSize 14 ` Add-ExcelChart -Worksheet $excel.Workbook.Worksheets["Sinx"] -ChartType line -XRange "X" -YRange "Sinx" -SeriesHeader "Sin(x)" -Title "Graph of Sine X" -TitleBold -TitleSize 14 `
-Column 2 -ColumnOffSetPixels 35 -Width 800 -XAxisTitleText "Degrees" -XAxisTitleBold -XAxisTitleSize 12 -XMajorUnit 30 -XMinorUnit 10 -XMinValue 0 -XMaxValue 361 -XAxisNumberformat "000" -XAxisPosition Bottom ` -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 -YAxisPosition Left -LegendPostion Bottom -LegendSize 8 -legendBold -YMinValue -1.25 -YMaxValue 1.25 -YMajorUnit 0.25 -YAxisNumberformat "0.00" -YAxisTitleText "Sine" -YAxisTitleBold -YAxisTitleSize 12 `
$d = $excel.Workbook.Worksheets["Sinx"].Drawings[0] -LegendSize 8 -legendBold -LegendPostion Bottom
Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets["Sinx"] -Range "B2:B362" -RuleType LessThan -ConditionValue "=B1" -ForeGroundColor Red
$ws = $Excel.Workbook.Worksheets["Sinx"]
$d = $ws.Drawings[0]
It "Controled the axes and title and legend of the chart " { It "Controled the axes and title and legend of the chart " {
$d.XAxis.MaxValue | Should be 361 $d.XAxis.MaxValue | Should be 361
$d.XAxis.MajorUnit | Should be 30 $d.XAxis.MajorUnit | Should be 30
@@ -731,6 +859,9 @@ Describe ExportExcel {
$d.ChartType.tostring() | Should be "line" $d.ChartType.tostring() | Should be "line"
$d.From.Column | Should be 2 $d.From.Column | Should be 2
} }
It "Appplied conditional formatting to the data " {
$ws.ConditionalFormatting[0].Formula | Should be "B1"
}
Close-ExcelPackage -ExcelPackage $excel -nosave Close-ExcelPackage -ExcelPackage $excel -nosave
} }
@@ -753,7 +884,7 @@ Describe ExportExcel {
$ct.ConditionalType | Should be "ContainsText" $ct.ConditionalType | Should be "ContainsText"
$ct.Text | Should be "Microsoft" $ct.Text | Should be "Microsoft"
} }
#Test -ConditionalFormat & -ConditionalText
Export-Excel -Path $path -ConditionalFormat $cf -ConditionalText $ct Export-Excel -Path $path -ConditionalFormat $cf -ConditionalText $ct
$excel = Open-ExcelPackage -Path $path $excel = Open-ExcelPackage -Path $path
$rows = $range -replace "^.*?(\d+)$", '$1' $rows = $range -replace "^.*?(\d+)$", '$1'
@@ -774,6 +905,7 @@ Describe ExportExcel {
Context " # Awkward multiple tables" { Context " # Awkward multiple tables" {
$path = "$Env:TEMP\test.xlsx" $path = "$Env:TEMP\test.xlsx"
#Test creating 3 on overlapping tables on the same page. Create rightmost the left most then middle.
remove-item -Path $path -ErrorAction SilentlyContinue remove-item -Path $path -ErrorAction SilentlyContinue
$r = Get-ChildItem -path C:\WINDOWS\system32 -File $r = Get-ChildItem -path C:\WINDOWS\system32 -File
@@ -798,7 +930,7 @@ Describe ExportExcel {
$ws.Tables["FileSize"].StyleName | should be "TableStyleMedium2" $ws.Tables["FileSize"].StyleName | should be "TableStyleMedium2"
} }
it "Created the ExtSize table in the right place with the right size " { it "Created the ExtSize table in the right place with the right size " {
$ws.Tables["ExtSize"].Address.Address | should be "A2:B14" #tile, then 12 rows x 2 columns of data $ws.Tables["ExtSize"].Address.Address | should be "A2:B14" #tile, then 12 rows x 2 columns of data
} }
it "Created the ExtCount table in the right place with the right size " { it "Created the ExtCount table in the right place with the right size " {
$ws.Tables["ExtCount"].Address.Address | should be "D2:E12" #title, then 10 rows x 2 columns of data $ws.Tables["ExtCount"].Address.Address | should be "D2:E12" #title, then 10 rows x 2 columns of data

View File

@@ -0,0 +1,63 @@
$path = "$Env:TEMP\test.xlsx"
remove-item -path $path -ErrorAction SilentlyContinue
ConvertFrom-Csv @"
Product, City, Gross, Net
Apple, London , 300, 250
Orange, London , 400, 350
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=@{
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"; LegendPostion="Bottom"}}}
$excel = Open-ExcelPackage $path
$ws1 = $excel.Workbook.Worksheets[1]
$ws2 = $excel.Workbook.Worksheets[2]
Describe "Creating workbook with a single line" {
Context "Data Page" {
It "Inserted the data and created the table " {
$ws1.Tables[0] | Should not beNullOrEmpty
$ws1.Tables[0].Address.Address | Should be "A1:D7"
$ws1.Tables[0].StyleName | Should be "TableStyleMedium13"
}
It "Applied conditional formatting " {
$ws1.ConditionalFormatting[0] | Should not beNullOrEmpty
$ws1.ConditionalFormatting[0].type.ToString() | Should be "DataBar"
$ws1.ConditionalFormatting[0].Color.G | Should beGreaterThan 100
$ws1.ConditionalFormatting[0].Color.R | Should beLessThan 100
$ws1.ConditionalFormatting[0].Address.Address | Should be "C2:C7"
}
It "Added the chart " {
$ws1.Drawings[0] | Should not beNullOrEmpty
$ws1.Drawings[0].ChartType.ToString() | Should be "DoughNut"
$ws1.Drawings[0].Series[0].Series | Should be "'Sheet1'!C2:C7"
}
}
Context "PivotTable" {
it "Created the PivotTable on a new page and made it active " {
$ws2 | Should not beNullOrEmpty
$ws2.PivotTables[0] | Should not beNullOrEmpty
$ws2.PivotTables[0].Fields.Count | Should be 4
$ws2.PivotTables[0].DataFields[0].Format | Should be "$#,##0.00"
$ws2.PivotTables[0].RowFields[0].Name | Should be "City"
$ws2.PivotTables[0].ColumnFields[0].Name | Should be "Product"
$ws2.PivotTables[0].RowGrandTotals | Should be $true
$ws2.PivotTables[0].ColumGrandTotals | Should be $true #Epplus's mis-spelling of column not mine
$ws2.View.TabSelected | Should be $true
}
it "Created the Pivot Chart " {
$ws2.Drawings[0] | Should not beNullOrEmpty
$ws2.Drawings[0].ChartType.ToString() | Should be ColumnClustered
$ws2.Drawings[0].YAxis.MajorUnit | Should be 500
$ws2.Drawings[0].YAxis.MinorUnit | Should be 100
$ws2.Drawings[0].YAxis.Format | Should be "$#,##0"
$ws2.Drawings[0].Legend.Position.ToString() | Should be "Bottom"
}
}
}

101
__tests__/First10Races.csv Normal file
View File

@@ -0,0 +1,101 @@
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
Australian,25/03/2018,4,Daniel Ricciardo,8,Red Bull Racing-TAG Heuer,12
Australian,25/03/2018,5,Fernando Alonso,10,McLaren-Renault,10
Australian,25/03/2018,6,Max Verstappen,4,Red Bull Racing-TAG Heuer,8
Australian,25/03/2018,7,Nico Hülkenberg,7,Renault,6
Australian,25/03/2018,8,Valtteri Bottas,15,Mercedes,4
Australian,25/03/2018,9,Stoffel Vandoorne,11,McLaren-Renault,2
Australian,25/03/2018,10,Carlos Sainz,9,Renault,1
Bahrain,08/04/2018,1,Sebastian Vettel,1,Ferrari,25
Bahrain,08/04/2018,2,Valtteri Bottas,3,Mercedes,18
Bahrain,08/04/2018,3,Lewis Hamilton,9,Mercedes,15
Bahrain,08/04/2018,4,Pierre Gasly,5,STR-Honda,12
Bahrain,08/04/2018,5,Kevin Magnussen,6,Haas-Ferrari,10
Bahrain,08/04/2018,6,Nico Hülkenberg,7,Renault,8
Bahrain,08/04/2018,7,Fernando Alonso,13,McLaren-Renault,6
Bahrain,08/04/2018,8,Stoffel Vandoorne,14,McLaren-Renault,4
Bahrain,08/04/2018,9,Marcus Ericsson,17,Sauber-Ferrari,2
Bahrain,08/04/2018,10,Esteban Ocon,8,Force India-Mercedes,1
Chinese,15/04/2018,1,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,25
Chinese,15/04/2018,2,Valtteri Bottas,3,Mercedes,18
Chinese,15/04/2018,3,Kimi Räikkönen,2,Ferrari,15
Chinese,15/04/2018,4,Lewis Hamilton,4,Mercedes,12
Chinese,15/04/2018,5,Max Verstappen,5,Red Bull Racing-TAG Heuer,10
Chinese,15/04/2018,6,Nico Hülkenberg,7,Renault,8
Chinese,15/04/2018,7,Fernando Alonso,13,McLaren-Renault,6
Chinese,15/04/2018,8,Sebastian Vettel,1,Ferrari,4
Chinese,15/04/2018,9,Carlos Sainz,9,Renault,2
Chinese,15/04/2018,10,Kevin Magnussen,11,Haas-Ferrari,1
Azerbaijan,29/04/2018,1,Lewis Hamilton,2,Mercedes,25
Azerbaijan,29/04/2018,2,Kimi Räikkönen,6,Ferrari,18
Azerbaijan,29/04/2018,3,Sergio Pérez,8,Force India-Mercedes,15
Azerbaijan,29/04/2018,4,Sebastian Vettel,1,Ferrari,12
Azerbaijan,29/04/2018,5,Carlos Sainz,9,Renault,10
Azerbaijan,29/04/2018,6,Charles Leclerc,13,Sauber-Ferrari,8
Azerbaijan,29/04/2018,7,Fernando Alonso,12,McLaren-Renault,6
Azerbaijan,29/04/2018,8,Lance Stroll,10,Williams-Mercedes,4
Azerbaijan,29/04/2018,9,Stoffel Vandoorne,16,McLaren-Renault,2
Azerbaijan,29/04/2018,10,Brendon Hartley,19,STR-Honda,1
Spanish,13/05/2018,1,Lewis Hamilton,1,Mercedes,25
Spanish,13/05/2018,2,Valtteri Bottas,2,Mercedes,18
Spanish,13/05/2018,3,Max Verstappen,5,Red Bull Racing-TAG Heuer,15
Spanish,13/05/2018,4,Sebastian Vettel,3,Ferrari,12
Spanish,13/05/2018,5,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,10
Spanish,13/05/2018,6,Kevin Magnussen,7,Haas-Ferrari,8
Spanish,13/05/2018,7,Carlos Sainz,9,Renault,6
Spanish,13/05/2018,8,Fernando Alonso,8,McLaren-Renault,4
Spanish,13/05/2018,9,Sergio Pérez,15,Force India-Mercedes,2
Spanish,13/05/2018,10,Charles Leclerc,14,Sauber-Ferrari,1
Monaco,27/05/2018,1,Daniel Ricciardo,1,Red Bull Racing-TAG Heuer,25
Monaco,27/05/2018,2,Sebastian Vettel,2,Ferrari,18
Monaco,27/05/2018,3,Lewis Hamilton,3,Mercedes,15
Monaco,27/05/2018,4,Kimi Räikkönen,4,Ferrari,12
Monaco,27/05/2018,5,Valtteri Bottas,5,Mercedes,10
Monaco,27/05/2018,6,Esteban Ocon,6,Force India-Mercedes,8
Monaco,27/05/2018,7,Pierre Gasly,10,STR-Honda,6
Monaco,27/05/2018,8,Nico Hülkenberg,11,Renault,4
Monaco,27/05/2018,9,Max Verstappen,20,Red Bull Racing-TAG Heuer,2
Monaco,27/05/2018,10,Carlos Sainz,8,Renault,1
Canadian,10/06/2018,1,Sebastian Vettel,1,Ferrari,25
Canadian,10/06/2018,2,Valtteri Bottas,2,Mercedes,18
Canadian,10/06/2018,3,Max Verstappen,3,Red Bull Racing-TAG Heuer,15
Canadian,10/06/2018,4,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,12
Canadian,10/06/2018,5,Lewis Hamilton,4,Mercedes,10
Canadian,10/06/2018,6,Kimi Räikkönen,5,Ferrari,8
Canadian,10/06/2018,7,Nico Hülkenberg,7,Renault,6
Canadian,10/06/2018,8,Carlos Sainz,9,Renault,4
Canadian,10/06/2018,9,Esteban Ocon,8,Force India-Mercedes,2
Canadian,10/06/2018,10,Charles Leclerc,13,Sauber-Ferrari,1
French,24/06/2018,1,Lewis Hamilton,1,Mercedes,25
French,24/06/2018,2,Max Verstappen,4,Red Bull Racing-TAG Heuer,18
French,24/06/2018,3,Kimi Räikkönen,6,Ferrari,15
French,24/06/2018,4,Daniel Ricciardo,5,Red Bull Racing-TAG Heuer,12
French,24/06/2018,5,Sebastian Vettel,3,Ferrari,10
French,24/06/2018,6,Kevin Magnussen,9,Haas-Ferrari,8
French,24/06/2018,7,Valtteri Bottas,2,Mercedes,6
French,24/06/2018,8,Carlos Sainz,7,Renault,4
French,24/06/2018,9,Nico Hülkenberg,12,Renault,2
French,24/06/2018,10,Charles Leclerc,8,Sauber-Ferrari,1
Austrian,01/07/2018,1,Max Verstappen,4,Red Bull Racing-TAG Heuer,25
Austrian,01/07/2018,2,Kimi Räikkönen,3,Ferrari,18
Austrian,01/07/2018,3,Sebastian Vettel,6,Ferrari,15
Austrian,01/07/2018,4,Romain Grosjean,5,Haas-Ferrari,12
Austrian,01/07/2018,5,Kevin Magnussen,8,Haas-Ferrari,10
Austrian,01/07/2018,6,Esteban Ocon,11,Force India-Mercedes,8
Austrian,01/07/2018,7,Sergio Pérez,15,Force India-Mercedes,6
Austrian,01/07/2018,8,Fernando Alonso,20,McLaren-Renault,4
Austrian,01/07/2018,9,Charles Leclerc,17,Sauber-Ferrari,2
Austrian,01/07/2018,10,Marcus Ericsson,18,Sauber-Ferrari,1
British,08/07/2018,1,Sebastian Vettel,2,Ferrari,25
British,08/07/2018,2,Lewis Hamilton,1,Mercedes,18
British,08/07/2018,3,Kimi Räikkönen,3,Ferrari,15
British,08/07/2018,4,Valtteri Bottas,4,Mercedes,12
British,08/07/2018,5,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,10
British,08/07/2018,6,Nico Hülkenberg,11,Renault,8
British,08/07/2018,7,Esteban Ocon,10,Force India-Mercedes,6
British,08/07/2018,8,Fernando Alonso,13,McLaren-Renault,4
British,08/07/2018,9,Kevin Magnussen,7,Haas-Ferrari,2
British,08/07/2018,10,Sergio Pérez,12,Force India-Mercedes,1
1 Race Date FinishPosition Driver GridPosition Team Points
2 Australian 25/03/2018 1 Sebastian Vettel 3 Ferrari 25
3 Australian 25/03/2018 2 Lewis Hamilton 1 Mercedes 18
4 Australian 25/03/2018 3 Kimi Räikkönen 2 Ferrari 15
5 Australian 25/03/2018 4 Daniel Ricciardo 8 Red Bull Racing-TAG Heuer 12
6 Australian 25/03/2018 5 Fernando Alonso 10 McLaren-Renault 10
7 Australian 25/03/2018 6 Max Verstappen 4 Red Bull Racing-TAG Heuer 8
8 Australian 25/03/2018 7 Nico Hülkenberg 7 Renault 6
9 Australian 25/03/2018 8 Valtteri Bottas 15 Mercedes 4
10 Australian 25/03/2018 9 Stoffel Vandoorne 11 McLaren-Renault 2
11 Australian 25/03/2018 10 Carlos Sainz 9 Renault 1
12 Bahrain 08/04/2018 1 Sebastian Vettel 1 Ferrari 25
13 Bahrain 08/04/2018 2 Valtteri Bottas 3 Mercedes 18
14 Bahrain 08/04/2018 3 Lewis Hamilton 9 Mercedes 15
15 Bahrain 08/04/2018 4 Pierre Gasly 5 STR-Honda 12
16 Bahrain 08/04/2018 5 Kevin Magnussen 6 Haas-Ferrari 10
17 Bahrain 08/04/2018 6 Nico Hülkenberg 7 Renault 8
18 Bahrain 08/04/2018 7 Fernando Alonso 13 McLaren-Renault 6
19 Bahrain 08/04/2018 8 Stoffel Vandoorne 14 McLaren-Renault 4
20 Bahrain 08/04/2018 9 Marcus Ericsson 17 Sauber-Ferrari 2
21 Bahrain 08/04/2018 10 Esteban Ocon 8 Force India-Mercedes 1
22 Chinese 15/04/2018 1 Daniel Ricciardo 6 Red Bull Racing-TAG Heuer 25
23 Chinese 15/04/2018 2 Valtteri Bottas 3 Mercedes 18
24 Chinese 15/04/2018 3 Kimi Räikkönen 2 Ferrari 15
25 Chinese 15/04/2018 4 Lewis Hamilton 4 Mercedes 12
26 Chinese 15/04/2018 5 Max Verstappen 5 Red Bull Racing-TAG Heuer 10
27 Chinese 15/04/2018 6 Nico Hülkenberg 7 Renault 8
28 Chinese 15/04/2018 7 Fernando Alonso 13 McLaren-Renault 6
29 Chinese 15/04/2018 8 Sebastian Vettel 1 Ferrari 4
30 Chinese 15/04/2018 9 Carlos Sainz 9 Renault 2
31 Chinese 15/04/2018 10 Kevin Magnussen 11 Haas-Ferrari 1
32 Azerbaijan 29/04/2018 1 Lewis Hamilton 2 Mercedes 25
33 Azerbaijan 29/04/2018 2 Kimi Räikkönen 6 Ferrari 18
34 Azerbaijan 29/04/2018 3 Sergio Pérez 8 Force India-Mercedes 15
35 Azerbaijan 29/04/2018 4 Sebastian Vettel 1 Ferrari 12
36 Azerbaijan 29/04/2018 5 Carlos Sainz 9 Renault 10
37 Azerbaijan 29/04/2018 6 Charles Leclerc 13 Sauber-Ferrari 8
38 Azerbaijan 29/04/2018 7 Fernando Alonso 12 McLaren-Renault 6
39 Azerbaijan 29/04/2018 8 Lance Stroll 10 Williams-Mercedes 4
40 Azerbaijan 29/04/2018 9 Stoffel Vandoorne 16 McLaren-Renault 2
41 Azerbaijan 29/04/2018 10 Brendon Hartley 19 STR-Honda 1
42 Spanish 13/05/2018 1 Lewis Hamilton 1 Mercedes 25
43 Spanish 13/05/2018 2 Valtteri Bottas 2 Mercedes 18
44 Spanish 13/05/2018 3 Max Verstappen 5 Red Bull Racing-TAG Heuer 15
45 Spanish 13/05/2018 4 Sebastian Vettel 3 Ferrari 12
46 Spanish 13/05/2018 5 Daniel Ricciardo 6 Red Bull Racing-TAG Heuer 10
47 Spanish 13/05/2018 6 Kevin Magnussen 7 Haas-Ferrari 8
48 Spanish 13/05/2018 7 Carlos Sainz 9 Renault 6
49 Spanish 13/05/2018 8 Fernando Alonso 8 McLaren-Renault 4
50 Spanish 13/05/2018 9 Sergio Pérez 15 Force India-Mercedes 2
51 Spanish 13/05/2018 10 Charles Leclerc 14 Sauber-Ferrari 1
52 Monaco 27/05/2018 1 Daniel Ricciardo 1 Red Bull Racing-TAG Heuer 25
53 Monaco 27/05/2018 2 Sebastian Vettel 2 Ferrari 18
54 Monaco 27/05/2018 3 Lewis Hamilton 3 Mercedes 15
55 Monaco 27/05/2018 4 Kimi Räikkönen 4 Ferrari 12
56 Monaco 27/05/2018 5 Valtteri Bottas 5 Mercedes 10
57 Monaco 27/05/2018 6 Esteban Ocon 6 Force India-Mercedes 8
58 Monaco 27/05/2018 7 Pierre Gasly 10 STR-Honda 6
59 Monaco 27/05/2018 8 Nico Hülkenberg 11 Renault 4
60 Monaco 27/05/2018 9 Max Verstappen 20 Red Bull Racing-TAG Heuer 2
61 Monaco 27/05/2018 10 Carlos Sainz 8 Renault 1
62 Canadian 10/06/2018 1 Sebastian Vettel 1 Ferrari 25
63 Canadian 10/06/2018 2 Valtteri Bottas 2 Mercedes 18
64 Canadian 10/06/2018 3 Max Verstappen 3 Red Bull Racing-TAG Heuer 15
65 Canadian 10/06/2018 4 Daniel Ricciardo 6 Red Bull Racing-TAG Heuer 12
66 Canadian 10/06/2018 5 Lewis Hamilton 4 Mercedes 10
67 Canadian 10/06/2018 6 Kimi Räikkönen 5 Ferrari 8
68 Canadian 10/06/2018 7 Nico Hülkenberg 7 Renault 6
69 Canadian 10/06/2018 8 Carlos Sainz 9 Renault 4
70 Canadian 10/06/2018 9 Esteban Ocon 8 Force India-Mercedes 2
71 Canadian 10/06/2018 10 Charles Leclerc 13 Sauber-Ferrari 1
72 French 24/06/2018 1 Lewis Hamilton 1 Mercedes 25
73 French 24/06/2018 2 Max Verstappen 4 Red Bull Racing-TAG Heuer 18
74 French 24/06/2018 3 Kimi Räikkönen 6 Ferrari 15
75 French 24/06/2018 4 Daniel Ricciardo 5 Red Bull Racing-TAG Heuer 12
76 French 24/06/2018 5 Sebastian Vettel 3 Ferrari 10
77 French 24/06/2018 6 Kevin Magnussen 9 Haas-Ferrari 8
78 French 24/06/2018 7 Valtteri Bottas 2 Mercedes 6
79 French 24/06/2018 8 Carlos Sainz 7 Renault 4
80 French 24/06/2018 9 Nico Hülkenberg 12 Renault 2
81 French 24/06/2018 10 Charles Leclerc 8 Sauber-Ferrari 1
82 Austrian 01/07/2018 1 Max Verstappen 4 Red Bull Racing-TAG Heuer 25
83 Austrian 01/07/2018 2 Kimi Räikkönen 3 Ferrari 18
84 Austrian 01/07/2018 3 Sebastian Vettel 6 Ferrari 15
85 Austrian 01/07/2018 4 Romain Grosjean 5 Haas-Ferrari 12
86 Austrian 01/07/2018 5 Kevin Magnussen 8 Haas-Ferrari 10
87 Austrian 01/07/2018 6 Esteban Ocon 11 Force India-Mercedes 8
88 Austrian 01/07/2018 7 Sergio Pérez 15 Force India-Mercedes 6
89 Austrian 01/07/2018 8 Fernando Alonso 20 McLaren-Renault 4
90 Austrian 01/07/2018 9 Charles Leclerc 17 Sauber-Ferrari 2
91 Austrian 01/07/2018 10 Marcus Ericsson 18 Sauber-Ferrari 1
92 British 08/07/2018 1 Sebastian Vettel 2 Ferrari 25
93 British 08/07/2018 2 Lewis Hamilton 1 Mercedes 18
94 British 08/07/2018 3 Kimi Räikkönen 3 Ferrari 15
95 British 08/07/2018 4 Valtteri Bottas 4 Mercedes 12
96 British 08/07/2018 5 Daniel Ricciardo 6 Red Bull Racing-TAG Heuer 10
97 British 08/07/2018 6 Nico Hülkenberg 11 Renault 8
98 British 08/07/2018 7 Esteban Ocon 10 Force India-Mercedes 6
99 British 08/07/2018 8 Fernando Alonso 13 McLaren-Renault 4
100 British 08/07/2018 9 Kevin Magnussen 7 Haas-Ferrari 2
101 British 08/07/2018 10 Sergio Pérez 12 Force India-Mercedes 1

View File

@@ -0,0 +1,101 @@
$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"
Remove-Item -Path $path -ErrorAction SilentlyContinue
#Read race results, and group by race name : export 1 row to get headers, leaving enough rows aboce to put in a link for each race
$results = Import-Csv -Path $dataPath | Group-Object -Property RACE
$topRow = $lastDataRow = 1 + $results.Count
$excel = $results[0].Group[0] | Export-Excel -Path $path -StartRow $TopRow -BoldTopRow -PassThru
#export each group (race) below the last one, without headers, and create a range for each using the group name (Race)
foreach ($r in $results) {
$excel = $R.Group | Export-Excel -ExcelPackage $excel -NoHeader -StartRow ($lastDataRow +1) -RangeName $R.Name -PassThru -AutoSize
$lastDataRow += $R.Group.Count
}
$worksheet = $excel.Workbook.Worksheets[1]
$columns = $worksheet.Dimension.Columns
1..$columns | foreach {Add-ExcelName -Range $worksheet.cells[$topRow,$_,$lastDataRow,$_]} #Test Add-Excel Name on its own (outside Export-Excel)
$scwarnVar = $null
Set-ExcelColumn -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 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 #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 #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.
#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")} | #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]
$m = $results | measure -sum -Property count
$expectedRows = 1 + $m.count + $m.sum
}
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.Names[$results[0].Name] | should not benullorEmpty
$sheet.Names[$results[-1].Name] | should not benullorEmpty
}
it "Added hyperlinks to the named ranges " {
$sheet.cells["a1"].Hyperlink.Display | should match $results[0].Name
$sheet.cells["a1"].Hyperlink.ReferenceAddress | should match $results[0].Name
}
}
Context "Adding calculated column" {
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 "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, 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
$sheet.ConditionalFormatting[0].Address.Start.Row | should be ($results.Count + 1)
$sheet.ConditionalFormatting[0].Icon3.Type.ToString() | Should be "Num"
$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 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 "TableStyleLight4"
$sheet.Tables[0].ShowColumnStripes | should be $true
$sheet.Tables[0].ShowRowStripes | should not be $true
}
}
}

View File

@@ -1,4 +1,4 @@
$data1 = ConvertFrom-Csv -InputObject @" $data1 = ConvertFrom-Csv -InputObject @"
ID,Product,Quantity,Price,Total ID,Product,Quantity,Price,Total
12001,Nails,37,3.99,147.63 12001,Nails,37,3.99,147.63
12002,Hammer,5,12.10,60.5 12002,Hammer,5,12.10,60.5
@@ -29,33 +29,33 @@ Describe "Join Worksheet" {
$data1 | Export-Excel -Path $path -WorkSheetname Oxford $data1 | Export-Excel -Path $path -WorkSheetname Oxford
$data2 | Export-Excel -Path $path -WorkSheetname Abingdon $data2 | Export-Excel -Path $path -WorkSheetname Abingdon
$data3 | Export-Excel -Path $path -WorkSheetname Banbury $data3 | Export-Excel -Path $path -WorkSheetname Banbury
$ptdef = New-PivotTableDefinition -PivotTableName "Summary" -PivotRows "Store" -PivotColumns "Product" -PivotData @{"Total"="SUM"} -IncludePivotChart -ChartTitle "Sales Breakdown" -ChartType ColumnStacked -ChartColumn 10 $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 "Summary" -TableStyle Light1 -AutoSize -BoldTopRow -FreezePane 2,1 -Title "Store Sales Summary" -TitleBold -TitleSize 14 -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 -PivotTableDefinition $ptdef
$excel = Export-Excel -path $path -WorkSheetname Summary -Activate -HideSheet * -UnHideSheet "Total","Summary" -PassThru $excel = Export-Excel -path $path -WorkSheetname SummaryPivot -Activate -HideSheet * -UnHideSheet "Total","SummaryPivot" -PassThru
# Open-ExcelPackage -Path $path # Open-ExcelPackage -Path $path
$ws = $excel.Workbook.Worksheets["Total"] $ws = $excel.Workbook.Worksheets["Total"]
$pt = $excel.Workbook.Worksheets["Summary"].pivottables[0] $pt = $excel.Workbook.Worksheets["SummaryPivot"].pivottables[0]
$pc = $excel.Workbook.Worksheets["Summary"].Drawings[0] $pc = $excel.Workbook.Worksheets["SummaryPivot"].Drawings[0]
} }
Context "Export-Excel setting spreadsheet visibility" { Context "Export-Excel setting spreadsheet visibility" {
it "Hid the worksheets " { it "Hid the worksheets " {
$excel.Workbook.Worksheets["Oxford"].Hidden | Should be $true $excel.Workbook.Worksheets["Oxford"].Hidden | Should be 'Hidden'
$excel.Workbook.Worksheets["Banbury"].Hidden | Should be $true $excel.Workbook.Worksheets["Banbury"].Hidden | Should be 'Hidden'
$excel.Workbook.Worksheets["Abingdon"].Hidden | Should be $true $excel.Workbook.Worksheets["Abingdon"].Hidden | Should be 'Hidden'
} }
it "Un-hid two of the worksheets " { it "Un-hid two of the worksheets " {
$excel.Workbook.Worksheets["Total"].Hidden | Should be $false $excel.Workbook.Worksheets["Total"].Hidden | Should be 'Visible'
$excel.Workbook.Worksheets["Summary"].Hidden | Should be $false $excel.Workbook.Worksheets["SummaryPivot"].Hidden | Should be 'Visible'
} }
it "Activated the correct worksheet " { it "Activated the correct worksheet " {
$excel.Workbook.worksheets["Summary"].View.TabSelected | Should be $true $excel.Workbook.worksheets["SummaryPivot"].View.TabSelected | Should be $true
$excel.Workbook.worksheets["Total"].View.TabSelected | Should be $false $excel.Workbook.worksheets["Total"].View.TabSelected | Should be $false
} }
} }
Context "Merging 3 blocks" { Context "Merging 3 blocks" {
it "Created sheet of the right size with a title and a table " { it "Created sheet of the right size with a title and a table " {
$ws.Dimension.Address | Should be "A1:F16" $ws.Dimension.Address | Should be "A1:F16"
$ws.Tables[0].Address.Address | Should be "A2:F16" $ws.Tables[0].Address.Address | Should be "A2:F16"

View File

@@ -0,0 +1,24 @@
Describe "Password Support" {
Context "Password protected sheet" {
BeforeAll {
$password = "YouMustRememberThis"
$path = "$env:TEMP\Test.xlsx"
Remove-Item $path -ErrorAction SilentlyContinue
Get-Service | Select-Object -First 10 | Export-excel -password $password -Path $Path -DisplayPropertySet
}
it "Threw an error when the password was omitted " {
{Open-ExcelPackage -Path $path } | should throw
}
it "Was able to append when the password was included " {
{Get-Service | Select-Object -First 10 |
Export-excel -password $password -Path $Path -Append } | should not throw
}
it "Kept the password on the file when it was saved " {
{Import-Excel $Path } | should throw
}
it "Could read the file when the password was included " {
(import-excel $path -Password $password).count | should be 20
}
}
}

114
__tests__/RangePassing.ps1 Normal file
View File

@@ -0,0 +1,114 @@
$path = "$env:temp\test.xlsx"
describe "Consistent passing of ranges." {
Context "Conditional Formatting" {
Remove-Item -path $path -ErrorAction SilentlyContinue
$excel = Get-Service | Export-Excel -Path $path -WorksheetName Services -PassThru -AutoSize -DisplayPropertySet -AutoNameRange -Title "Services on $Env:COMPUTERNAME"
it "accepts named ranges, cells['name'], worksheet + Name, worksheet + column " {
{Add-ConditionalFormatting $excel.Services.Names["Status"] -StrikeThru -RuleType ContainsText -ConditionValue "Stopped" } | Should not throw
$excel.Services.ConditionalFormatting.Count | Should be 1
{Add-ConditionalFormatting $excel.Services.Cells["Name"] -Italic -RuleType ContainsText -ConditionValue "SVC" } | Should not throw
$excel.Services.ConditionalFormatting.Count | Should be 2
$warnvar = $null
Add-ConditionalFormatting $excel.Services.Column(3) `
-underline -RuleType ContainsText -ConditionValue "Windows" -WarningVariable warnvar -WarningAction SilentlyContinue
$warnvar | should not beNullOrEmpty
$excel.Services.ConditionalFormatting.Count | Should be 2
$warnvar = $null
Add-ConditionalFormatting $excel.Services.Column(3) -WorkSheet $excel.Services`
-underline -RuleType ContainsText -ConditionValue "Windows" -WarningVariable warnvar -WarningAction SilentlyContinue
$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
$excel.Services.ConditionalFormatting.Count | Should be 4
}
Close-ExcelPackage -NoSave $excel
$excel = Get-Service | Export-Excel -Path $path -WorksheetName Services -PassThru -AutoSize -DisplayPropertySet -TableName servicetable -Title "Services on $Env:COMPUTERNAME"
it "accepts table, table.Address and worksheet + 'C:C' " {
{Add-ConditionalFormatting $excel.Services.Tables[0] `
-Italic -RuleType ContainsText -ConditionValue "Svc" } | Should not throw
$excel.Services.ConditionalFormatting.Count | Should be 1
{Add-ConditionalFormatting $excel.Services.Tables["ServiceTable"].Address `
-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
$excel.Services.ConditionalFormatting.Count | Should be 3
}
Close-ExcelPackage -NoSave $excel
}
Context "Formating (Set-ExcelRange or its alias set-Format) " {
it "accepts Named Range, cells['Name'], cells['A1:Z9'], row, Worksheet + 'A1:Z9'" {
$excel = Get-Service | Export-Excel -Path test2.xlsx -WorksheetName Services -PassThru -AutoSize -DisplayPropertySet -RangeName servicerange -Title "Services on $Env:COMPUTERNAME"
{set-format $excel.Services.Names["serviceRange"] -Bold } | Should Not Throw
$excel.Services.cells["B2"].Style.Font.Bold | Should be $true
{Set-ExcelRange -Range $excel.Services.Cells["serviceRange"] -italic:$true } | Should not throw
$excel.Services.cells["C3"].Style.Font.Italic | Should be $true
{set-format $excel.Services.Row(4) -underline -Bold:$false } | Should not throw
$excel.Services.cells["A4"].Style.Font.UnderLine | Should be $true
$excel.Services.cells["A4"].Style.Font.Bold | Should not be $true
{Set-ExcelRange $excel.Services.Cells["A3:B3"] -StrikeThru } | Should not throw
$excel.Services.cells["B3"].Style.Font.Strike | Should be $true
{Set-ExcelRange -WorkSheet $excel.Services -Range "A5:B6" -FontSize 8 } | Should not throw
$excel.Services.cells["A5"].Style.Font.Size | Should be 8
}
Close-ExcelPackage -NoSave $excel
it "Accepts Table, Table.Address , worksheet + Name, Column," {
$excel = Get-Service | Export-Excel -Path test2.xlsx -WorksheetName Services -PassThru -AutoNameRange -AutoSize -DisplayPropertySet -TableName servicetable -Title "Services on $Env:COMPUTERNAME"
{set-ExcelRange $excel.Services.Tables[0] -Italic } | Should not throw
$excel.Services.cells["C3"].Style.Font.Italic | Should be $true
{set-format $excel.Services.Tables["ServiceTable"].Address -Underline } | Should not throw
$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.cells["C4"].Style.Font.Color.Rgb | Should be "FFFF0000"
}
Close-ExcelPackage -NoSave $excel
}
Context "PivotTables" {
it "Accepts Named range, .Cells['Name'], name&Worksheet, cells['A1:Z9'], worksheet&'A1:Z9' "{
$excel = Get-Service | Export-Excel -Path $path -WorksheetName Services -PassThru -AutoSize -DisplayPropertySet -RangeName servicerange -Title "Services on $Env:COMPUTERNAME"
$ws = $excel.Workbook.Worksheets[1] #can get a worksheet by name or index - starting at 1
$end = $ws.Dimension.End.Address
#can get a named ranged by name or index - starting at zero
{Add-PivotTable -ExcelPackage $excel -PivotTableName pt0 -SourceRange $ws.Names[0]`
-PivotRows Status -PivotData Name } | Should not throw
$excel.Workbook.Worksheets["pt0"] | Should not beNullOrEmpty
{Add-PivotTable -ExcelPackage $excel -PivotTableName pt1 -SourceRange $ws.Names["servicerange"]`
-PivotRows Status -PivotData Name } | Should not throw
$excel.Workbook.Worksheets["pt1"] | Should not beNullOrEmpty
#Can specify the range for a pivot as NamedRange or Table or TableAddress or Worksheet + "A1:Z10" or worksheet + RangeName, or worksheet.cells["A1:Z10"] or worksheet.cells["RangeName"]
{Add-PivotTable -ExcelPackage $excel -PivotTableName pt2 -SourceRange "servicerange" -SourceWorkSheet $ws `
-PivotRows Status -PivotData Name } | Should not throw
$excel.Workbook.Worksheets["pt2"] | Should not beNullOrEmpty
{Add-PivotTable -ExcelPackage $excel -PivotTableName pt3 -SourceRange $ws.cells["servicerange"]`
-PivotRows Status -PivotData Name } | Should not throw
$excel.Workbook.Worksheets["pt3"] | Should not beNullOrEmpty
{Add-PivotTable -ExcelPackage $excel -PivotTableName pt4 -SourceRange $ws.cells["A2:$end"]`
-PivotRows Status -PivotData Name } | Should not throw
$excel.Workbook.Worksheets["pt4"] | Should not beNullOrEmpty
{Add-PivotTable -ExcelPackage $excel -PivotTableName pt5 -SourceRange "A2:$end" -SourceWorkSheet $ws `
-PivotRows Status -PivotData Name } | Should not throw
$excel.Workbook.Worksheets["pt5"] | Should not beNullOrEmpty
Close-ExcelPackage -NoSave $excel
}
it "Accepts Table, Table.Addres " {
$excel = Get-Service | Export-Excel -Path $path -WorksheetName Services -PassThru -AutoSize -DisplayPropertySet -TableName servicetable -Title "Services on $Env:COMPUTERNAME"
$ws = $excel.Workbook.Worksheets["Services"] #can get a worksheet by name or index - starting at 1
#Can get a table by name or -stating at zero. Can specify the range for a pivot as or Table or TableAddress
{Add-PivotTable -ExcelPackage $excel -PivotTableName pt1 -SourceRange $ws.tables["servicetable"]`
-PivotRows Status -PivotData Name } | Should not throw
$excel.Workbook.Worksheets["pt1"] | Should not beNullOrEmpty
{Add-PivotTable -ExcelPackage $excel -PivotTableName pt2 -SourceRange $ws.tables[0].Address `
-PivotRows Status -PivotData Name } | Should not throw
$excel.Workbook.Worksheets["pt2"] | Should not beNullOrEmpty
Close-ExcelPackage -NoSave $excel
}
}
}

View File

@@ -36,16 +36,17 @@ Describe "Number format expansion and setting" {
} }
Context "Expand-NumberFormat function" { Context "Expand-NumberFormat function" {
It "Expanded named number formats as expected " { It "Expanded named number formats as expected " {
Expand-NumberFormat 'Number' | Should be "0.00" $r = [regex]::Escape([cultureinfo]::CurrentCulture.NumberFormat.CurrencySymbol)
Expand-NumberFormat 'Percentage' | Should be "0.00%" Expand-NumberFormat 'Currency' | Should match "^[$r\(\)\[\] RED0#\?\-;,.]+$"
Expand-NumberFormat 'Scientific' | Should be "0.00E+00" Expand-NumberFormat 'Number' | Should be "0.00"
Expand-NumberFormat 'Currency' | Should be ([cultureinfo]::CurrentCulture.NumberFormat.CurrencySymbol + "#,##0.00") Expand-NumberFormat 'Percentage' | Should be "0.00%"
Expand-NumberFormat 'Fraction' | Should be "# ?/?" Expand-NumberFormat 'Scientific' | Should be "0.00E+00"
Expand-NumberFormat 'Short Date' | Should be "mm-dd-yy" Expand-NumberFormat 'Fraction' | Should be "# ?/?"
Expand-NumberFormat 'Short Time' | Should be "h:mm" Expand-NumberFormat 'Short Date' | Should be "mm-dd-yy"
Expand-NumberFormat 'Long Time' | Should be "h:mm:ss" Expand-NumberFormat 'Short Time' | Should be "h:mm"
Expand-NumberFormat 'Date-Time' | Should be "m/d/yy h:mm" Expand-NumberFormat 'Long Time' | Should be "h:mm:ss"
Expand-NumberFormat 'Text' | Should be "@" Expand-NumberFormat 'Date-Time' | Should be "m/d/yy h:mm"
Expand-NumberFormat 'Text' | Should be "@"
} }
} }
Context "Apply-NumberFormat" { Context "Apply-NumberFormat" {
@@ -53,39 +54,39 @@ Describe "Number format expansion and setting" {
Remove-Item -Path $path -ErrorAction SilentlyContinue Remove-Item -Path $path -ErrorAction SilentlyContinue
$n = [datetime]::Now.ToOADate() $n = [datetime]::Now.ToOADate()
$excel = 1..32 | ForEach-Object {$n} | Export-Excel -Path $path -PassThru $excel = 1..32 | ForEach-Object {$n} | Export-Excel -Path $path -show -WorksheetName s2 -PassThru
$ws = $excel.Workbook.Worksheets[1] $ws = $excel.Workbook.Worksheets[1]
Set-Format -WorkSheet $ws -Range "A1" -numberFormat 'General' Set-ExcelRange -WorkSheet $ws -Range "A1" -numberFormat 'General'
Set-Format -WorkSheet $ws -Range "A2" -numberFormat 'Number' Set-ExcelRange -WorkSheet $ws -Range "A2" -numberFormat 'Number'
Set-Format -WorkSheet $ws -Range "A3" -numberFormat 'Percentage' Set-ExcelRange -WorkSheet $ws -Range "A3" -numberFormat 'Percentage'
Set-Format -WorkSheet $ws -Range "A4" -numberFormat 'Scientific' Set-ExcelRange -WorkSheet $ws -Range "A4" -numberFormat 'Scientific'
Set-Format -WorkSheet $ws -Range "A5" -numberFormat 'Fraction' Set-ExcelRange -WorkSheet $ws -Range "A5" -numberFormat 'Fraction'
Set-Format -WorkSheet $ws -Range "A6" -numberFormat 'Short Date' Set-ExcelRange -WorkSheet $ws -Range "A6" -numberFormat 'Short Date'
Set-Format -WorkSheet $ws -Range "A7" -numberFormat 'Short Time' Set-ExcelRange -WorkSheet $ws -Range "A7" -numberFormat 'Short Time'
Set-Format -WorkSheet $ws -Range "A8" -numberFormat 'Long Time' Set-ExcelRange -WorkSheet $ws -Range "A8" -numberFormat 'Long Time'
Set-Format -WorkSheet $ws -Range "A9" -numberFormat 'Date-Time' Set-ExcelRange -WorkSheet $ws -Range "A9" -numberFormat 'Date-Time'
Set-Format -WorkSheet $ws -Range "A10" -numberFormat 'Currency' Set-ExcelRange -WorkSheet $ws -Range "A10" -numberFormat 'Currency'
Set-Format -WorkSheet $ws -Range "A11" -numberFormat 'Text' Set-ExcelRange -WorkSheet $ws -Range "A11" -numberFormat 'Text'
Set-Format -WorkSheet $ws -Range "A12" -numberFormat 'h:mm AM/PM' Set-ExcelRange -WorkSheet $ws -Range "A12" -numberFormat 'h:mm AM/PM'
Set-Format -WorkSheet $ws -Range "A13" -numberFormat 'h:mm:ss AM/PM' Set-ExcelRange -WorkSheet $ws -Range "A13" -numberFormat 'h:mm:ss AM/PM'
Set-Format -WorkSheet $ws -Range "A14" -numberFormat 'mm:ss' Set-ExcelRange -WorkSheet $ws -Range "A14" -numberFormat 'mm:ss'
Set-Format -WorkSheet $ws -Range "A15" -numberFormat '[h]:mm:ss' Set-ExcelRange -WorkSheet $ws -Range "A15" -numberFormat '[h]:mm:ss'
Set-Format -WorkSheet $ws -Range "A16" -numberFormat 'mmss.0' Set-ExcelRange -WorkSheet $ws -Range "A16" -numberFormat 'mmss.0'
Set-Format -WorkSheet $ws -Range "A17" -numberFormat 'd-mmm-yy' Set-ExcelRange -WorkSheet $ws -Range "A17" -numberFormat 'd-mmm-yy'
Set-Format -WorkSheet $ws -Range "A18" -numberFormat 'd-mmm' Set-ExcelRange -WorkSheet $ws -Range "A18" -numberFormat 'd-mmm'
Set-Format -WorkSheet $ws -Range "A19" -numberFormat 'mmm-yy' Set-ExcelRange -WorkSheet $ws -Range "A19" -numberFormat 'mmm-yy'
Set-Format -WorkSheet $ws -Range "A20" -numberFormat '0' Set-ExcelRange -WorkSheet $ws -Range "A20" -numberFormat '0'
Set-Format -WorkSheet $ws -Range "A21" -numberFormat '0.00' Set-ExcelRange -WorkSheet $ws -Range "A21" -numberFormat '0.00'
Set-Format -Address $ws.Cells[ "A22"] -NumberFormat '#,##0' Set-ExcelRange -Address $ws.Cells[ "A22"] -NumberFormat '#,##0'
Set-Format -Address $ws.Cells[ "A23"] -NumberFormat '#,##0.00' Set-ExcelRange -Address $ws.Cells[ "A23"] -NumberFormat '#,##0.00'
Set-Format -Address $ws.Cells[ "A24"] -NumberFormat '#,' Set-ExcelRange -Address $ws.Cells[ "A24"] -NumberFormat '#,'
Set-Format -Address $ws.Cells[ "A25"] -NumberFormat '#.0,,' Set-ExcelRange -Address $ws.Cells[ "A25"] -NumberFormat '#.0,,'
Set-Format -Address $ws.Cells[ "A26"] -NumberFormat '0%' Set-ExcelRange -Address $ws.Cells[ "A26"] -NumberFormat '0%'
Set-Format -Address $ws.Cells[ "A27"] -NumberFormat '0.00%' Set-ExcelRange -Address $ws.Cells[ "A27"] -NumberFormat '0.00%'
Set-Format -Address $ws.Cells[ "A28"] -NumberFormat '0.00E+00' Set-ExcelRange -Address $ws.Cells[ "A28"] -NumberFormat '0.00E+00'
Set-Format -Address $ws.Cells[ "A29"] -NumberFormat '# ?/?' Set-ExcelRange -Address $ws.Cells[ "A29"] -NumberFormat '# ?/?'
Set-Format -Address $ws.Cells[ "A30"] -NumberFormat '# ??/??' Set-ExcelRange -Address $ws.Cells[ "A30"] -NumberFormat '# ??/??'
Set-Format -Address $ws.Cells[ "A31"] -NumberFormat '@' Set-ExcelRange -Address $ws.Cells[ "A31"] -NumberFormat '@'
Close-ExcelPackage -ExcelPackage $excel Close-ExcelPackage -ExcelPackage $excel
@@ -94,8 +95,6 @@ Describe "Number format expansion and setting" {
} }
It "Set formats which translate to the correct format ID " { It "Set formats which translate to the correct format ID " {
$ws.Cells[10,1].Style.Numberformat.format | # Set as "Currency"
Should match ("^" + ([regex]::Escape([cultureinfo]::CurrentCulture.NumberFormat.CurrencySymbol)))
$ws.Cells[ 1,1].Style.Numberformat.NumFmtID | Should be 0 # Set as General $ws.Cells[ 1,1].Style.Numberformat.NumFmtID | Should be 0 # Set as General
$ws.Cells[20,1].Style.Numberformat.NumFmtID | Should be 1 # Set as 0 $ws.Cells[20,1].Style.Numberformat.NumFmtID | Should be 1 # Set as 0
$ws.Cells[ 2,1].Style.Numberformat.NumFmtID | Should be 2 # Set as "Number" $ws.Cells[ 2,1].Style.Numberformat.NumFmtID | Should be 2 # Set as "Number"
@@ -130,36 +129,36 @@ Describe "Number format expansion and setting" {
} }
} }
Describe "Set-Column, Set-Row and Set Format" { Describe "Set-ExcelColumn, Set-ExcelRow and Set-ExcelRange" {
BeforeAll { BeforeAll {
Remove-Item -Path $path -ErrorAction SilentlyContinue Remove-Item -Path $path -ErrorAction SilentlyContinue
$excel = $data| Export-Excel -Path $path -AutoNameRange -PassThru $excel = $data| Export-Excel -Path $path -AutoNameRange -PassThru
$ws = $excel.Workbook.Worksheets["Sheet1"] $ws = $excel.Workbook.Worksheets["Sheet1"]
$c = Set-Column -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 Blue -Bold -HorizontalAlignment Right -VerticalAlignment Top
$r = Set-Row -PassThru -Worksheet $ws -StartColumn 3 -BorderAround Thin -Italic -Underline -FontSize 14 -Value {"=sum($columnName`2:$columnName$endrow)" } -VerticalAlignment Bottom $r = Set-ExcelRow -PassThru -Worksheet $ws -StartColumn 3 -BorderAround Thin -Italic -Underline -FontSize 14 -Value {"=sum($columnName`2:$columnName$endrow)" } -VerticalAlignment Bottom
Set-Format -Address $excel.Workbook.Worksheets["Sheet1"].cells["b3"] -HorizontalAlignment Right -VerticalAlignment Center -BorderAround Thick -BorderColor Red -StrikeThru Set-ExcelRange -Address $excel.Workbook.Worksheets["Sheet1"].cells["b3"] -HorizontalAlignment Right -VerticalAlignment Center -BorderAround Thick -BorderColor Red -StrikeThru
Set-Format -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["c3"] -BorderColor Red -BorderTop DashDot -BorderLeft DashDotDot -BorderBottom Dashed -BorderRight Dotted
Set-Format -WorkSheet $ws -Range "E3" -Bold:$false -FontShift Superscript -HorizontalAlignment Left Set-ExcelRange -WorkSheet $ws -Range "E3" -Bold:$false -FontShift Superscript -HorizontalAlignment Left
Set-Format -WorkSheet $ws -Range "E1" -ResetFont -HorizontalAlignment General Set-ExcelRange -WorkSheet $ws -Range "E1" -ResetFont -HorizontalAlignment General
Set-Format -Address $ws.cells["E7"] -ResetFont -WrapText -BackgroundColor AliceBlue -BackgroundPattern DarkTrellis -PatternColor Red -NumberFormat "£#,###.00" Set-ExcelRange -Address $ws.cells["E7"] -ResetFont -WrapText -BackgroundColor AliceBlue -BackgroundPattern DarkTrellis -PatternColor Red -NumberFormat "£#,###.00"
Set-Format -Address $ws.Column(1) -Width 0 Set-ExcelRange -Address $ws.Column(1) -Width 0
Set-Format -Address $ws.Column(2) -AutoFit Set-ExcelRange -Address $ws.Column(2) -AutoFit
Set-Format -Address $ws.Cells["E:E"] -AutoFit Set-ExcelRange -Address $ws.Cells["E:E"] -AutoFit
Set-Format -Address $ws.row(5) -Height 0 Set-ExcelRange -Address $ws.row(5) -Height 0
$rr = $r.row $rr = $r.row
Set-Format -WorkSheet $ws -Range "B$rr" -Value "Total" Set-ExcelRange -WorkSheet $ws -Range "B$rr" -Value "Total"
$BadHideWarnvar = $null $BadHideWarnvar = $null
Set-Format -WorkSheet $ws -Range "D$rr" -Formula "=E$rr/C$rr" -Hidden -WarningVariable "BadHideWarnvar" -WarningAction SilentlyContinue Set-ExcelRange -WorkSheet $ws -Range "D$rr" -Formula "=E$rr/C$rr" -Hidden -WarningVariable "BadHideWarnvar" -WarningAction SilentlyContinue
$rr ++ $rr ++
Set-Format -WorkSheet $ws -Range "B$rr" -Value ([datetime]::Now) Set-ExcelRange -WorkSheet $ws -Range "B$rr" -Value ([datetime]::Now)
Close-ExcelPackage $excel Close-ExcelPackage $excel -Calculate
$excel = Open-ExcelPackage $path $excel = Open-ExcelPackage $path
$ws = $excel.Workbook.Worksheets["Sheet1"] $ws = $excel.Workbook.Worksheets["Sheet1"]
} }
Context "Set-Row and Set-Column" { Context "Set-ExcelRow and Set-ExcelColumn" {
it "Set a row and a column to have zero width/height " { it "Set a row and a column to have zero width/height " {
$r | Should not beNullorEmpty $r | Should not beNullorEmpty
# $c | Should not beNullorEmpty ## can't see why but this test breaks in appveyor # $c | Should not beNullorEmpty ## can't see why but this test breaks in appveyor
@@ -167,7 +166,8 @@ Describe "Set-Column, Set-Row and Set Format" {
$ws.Row(5).height | Should be 0 $ws.Row(5).height | Should be 0
} }
it "Set a column formula, with numberformat, color, bold face and alignment " { it "Set a column formula, with numberformat, color, bold face and alignment " {
$ws.cells["e2"].Formula | Should be "=Quantity*Price" $ws.cells["e2"].Formula | Should be "Quantity*Price"
$ws.cells["e2"].Value | Should be 147.63
$ws.cells["e2"].Style.Font.Color.rgb | Should be "FF0000FF" $ws.cells["e2"].Style.Font.Color.rgb | Should be "FF0000FF"
$ws.cells["e2"].Style.Font.Bold | Should be $true $ws.cells["e2"].Style.Font.Bold | Should be $true
$ws.cells["e2"].Style.Font.VerticalAlign | Should be "None" $ws.cells["e2"].Style.Font.VerticalAlign | Should be "None"
@@ -189,7 +189,8 @@ Describe "Set-Column, Set-Row and Set Format" {
$ws.cells["E7"].style.Border.Left.Style | Should be "None" $ws.cells["E7"].style.Border.Left.Style | Should be "None"
$ws.cells["E7"].style.Border.Right.Style | Should be "Thin" $ws.cells["E7"].style.Border.Right.Style | Should be "Thin"
$ws.cells["C7"].style.Font.size | Should be 14 $ws.cells["C7"].style.Font.size | Should be 14
$ws.cells["C7"].Formula | Should be "=sum(C2:C6)" $ws.cells["C7"].Formula | Should be "sum(C2:C6)"
$ws.cells["C7"].value | Should be 81
$ws.cells["C7"].style.Font.UnderLine | Should be $true $ws.cells["C7"].style.Font.UnderLine | Should be $true
$ws.cells["C6"].style.Font.UnderLine | Should be $false $ws.cells["C6"].style.Font.UnderLine | Should be $false
} }
@@ -212,9 +213,9 @@ Describe "Set-Column, Set-Row and Set Format" {
} }
} }
Context "Set-Format value setting " { Context "Set-ExcelRange value setting " {
it "Inserted a formula " { it "Inserted a formula " {
$ws.Cells["D7"].Formula | Should be "=E7/C7" $ws.Cells["D7"].Formula | Should be "E7/C7"
} }
it "Inserted a value " { it "Inserted a value " {
$ws.Cells["B7"].Value | Should be "Total" $ws.Cells["B7"].Value | Should be "Total"
@@ -224,15 +225,15 @@ Describe "Set-Column, Set-Row and Set Format" {
} }
} }
Context "Set-Column Value Setting" { Context "Set-ExcelColumn Value Setting" {
BeforeAll { BeforeAll {
Remove-Item -Path $path -ErrorAction SilentlyContinue Remove-Item -Path $path -ErrorAction SilentlyContinue
$excel = $DriverData | Export-Excel -PassThru -Path $path -AutoSize -AutoNameRange $excel = $DriverData | Export-Excel -PassThru -Path $path -AutoSize -AutoNameRange
$ws = $excel.Workbook.Worksheets[1] $ws = $excel.Workbook.Worksheets[1]
Set-Column -Worksheet $ws -Heading "Link" -AutoSize -Value {"https://en.wikipedia.org" + $worksheet.cells["B$Row"].value } Set-ExcelColumn -Worksheet $ws -Heading "Link" -AutoSize -Value {"https://en.wikipedia.org" + $worksheet.cells["B$Row"].value }
$c = Set-Column -PassThru -Worksheet $ws -Heading "NextBirthday" -Value { $c = Set-ExcelColumn -PassThru -Worksheet $ws -Heading "NextBirthday" -Value {
$bmonth = $worksheet.cells["C$Row"].value.month ; $bDay = $worksheet.cells["C$Row"].value.day $bmonth = $worksheet.cells["C$Row"].value.month ; $bDay = $worksheet.cells["C$Row"].value.day
$cMonth = [datetime]::Now.Month ; $cday = [datetime]::Now.day ; $cyear = [datetime]::Now.Year $cMonth = [datetime]::Now.Month ; $cday = [datetime]::Now.day ; $cyear = [datetime]::Now.Year
if (($cmonth -gt $bmonth) -or (($cMonth -eq $bmonth) -and ($cday -ge $bDay))){ if (($cmonth -gt $bmonth) -or (($cMonth -eq $bmonth) -and ($cday -ge $bDay))){
@@ -240,10 +241,10 @@ Describe "Set-Column, Set-Row and Set Format" {
} }
else {[datetime]::new($cyear, $bmonth, $bday) } else {[datetime]::new($cyear, $bmonth, $bday) }
} }
Set-Column -Worksheet $ws -Heading "Age" -Value "=INT((NOW()-DateOfBirth)/365)" Set-ExcelColumn -Worksheet $ws -Heading "Age" -Value "=INT((NOW()-DateOfBirth)/365)"
Set-Format -Address $c,$ws.column(3) -NumberFormat 'Short Date' -AutoSize Set-ExcelRange -Address $c,$ws.column(3) -NumberFormat 'Short Date' -AutoSize
Close-ExcelPackage -ExcelPackage $excel Close-ExcelPackage -ExcelPackage $excel -Calculate
$excel = Open-ExcelPackage $path $excel = Open-ExcelPackage $path
$ws = $excel.Workbook.Worksheets["Sheet1"] $ws = $excel.Workbook.Worksheets["Sheet1"]
} }
@@ -266,20 +267,77 @@ Describe "Set-Column, Set-Row and Set Format" {
Describe "Conditional Formatting" { Describe "Conditional Formatting" {
BeforeAll { BeforeAll {
Remove-Item $path Remove-Item $path
$data = Get-Process | where company | select company,name,pm,handles,*mem* $data = Get-Process | Where-Object company | Select-Object company,name,pm,handles,*mem*
$cfmt = New-ConditionalFormattingIconSet -Range "c:c" -ConditionalFormat ThreeIconSet -IconType Arrows $cfmt = New-ConditionalFormattingIconSet -Range "c:c" -ConditionalFormat ThreeIconSet -IconType Arrows
$data | Export-Excel -path $Path -AutoSize -ConditionalFormat $cfmt $data | Export-Excel -path $Path -AutoSize -ConditionalFormat $cfmt
$excel = Open-ExcelPackage -Path $path $excel = Open-ExcelPackage -Path $path
$ws = $excel.Workbook.Worksheets[1] $ws = $excel.Workbook.Worksheets[1]
} }
Context "Using a pre-prepared 3 Arrows rule" { Context "Using a pre-prepared 3 Arrows rule" {
it "Set the right type, IconSet and range " { it "Set the right type, IconSet and range " {
$ws.ConditionalFormatting[0].IconSet | Should be "Arrows" $ws.ConditionalFormatting[0].IconSet | Should be "Arrows"
$ws.ConditionalFormatting[0].Address.Address | Should be "c:c" $ws.ConditionalFormatting[0].Address.Address | Should be "c:c"
$ws.ConditionalFormatting[0].Type.ToString() | Should be "ThreeIconSet" $ws.ConditionalFormatting[0].Type.ToString() | Should be "ThreeIconSet"
} }
} }
} }
$path = "$Env:TEMP\test.xlsx"
$data2 = ConvertFrom-Csv -InputObject @"
ID,Product,Quantity,Price,Total
12001,Nails,37,3.99,147.63
12002,Hammer,5,12.10,60.5
12003,Saw,12,15.37,184.44
12010,Drill,20,8,160
12011,Crowbar,7,23.48,164.36
12001,Nails,53,3.99,211.47
12002,Hammer,6,12.10,72.60
12003,Saw,10,15.37,153.70
12010,Drill,10,8,80
12012,Pliers,2,14.99,29.98
12001,Nails,20,3.99,79.80
12002,Hammer,2,12.10,24.20
12010,Drill,11,8,88
12012,Pliers,3,14.99,44.97
"@
Describe "Table Formatting" {
BeforeAll {
Remove-Item $path
$excel = $data2 | Export-excel -path $path -WorksheetName Hardware -AutoNameRange -AutoSize -BoldTopRow -FreezeTopRow -PassThru
$ws = $excel.Workbook.Worksheets[1]
#test showfilter & TotalSettings
$Table = Add-ExcelTable -PassThru -Range $ws.cells[$($ws.Dimension.address)] -TableStyle Light1 -TableName HardwareTable -TotalSettings @{"Total"="Sum"} -ShowFirstColumn -ShowFilter:$false
#test expnading named number formats
Set-ExcelColumn -Worksheet $ws -Column 4 -NumberFormat 'Currency'
Set-ExcelColumn -Worksheet $ws -Column 5 -NumberFormat 'Currency'
$PtDef =New-PivotTableDefinition -PivotTableName Totals -PivotRows Product -PivotData @{"Total"="Sum"} -PivotNumberFormat Currency -PivotTotals None -PivotTableSyle Dark2
Export-excel -ExcelPackage $excel -WorksheetName Hardware -PivotTableDefinition $PtDef
$excel= Open-ExcelPackage -Path $path
$ws1 = $excel.Workbook.Worksheets["Hardware"]
$ws2 = $excel.Workbook.Worksheets["Totals"]
}
Context "Setting and not clearing when Export-Excel touches the file again."{
it "Set the Table Options " {
$ws1.Tables[0].Address.Address | should be "A1:E16"
$ws1.Tables[0].Name | should be "HardwareTable"
$ws1.Tables[0].ShowFirstColumn | should be $true
$ws1.Tables[0].ShowLastColumn | should not be $true
$ws1.Tables[0].ShowTotal | should be $true
$ws1.Tables[0].Columns["Total"].TotalsRowFunction | Should be "Sum"
$ws1.Tables[0].StyleName | should be "TableStyleLight1"
$ws1.Cells["D4"].Style.Numberformat.Format | Should match ([regex]::Escape([cultureinfo]::CurrentCulture.NumberFormat.CurrencySymbol))
$ws1.Cells["E5"].Style.Numberformat.Format | Should match ([regex]::Escape([cultureinfo]::CurrentCulture.NumberFormat.CurrencySymbol))
}
it "Set the Pivot Options " {
$ws2.PivotTables[0].DataFields[0].Format | Should match ([regex]::Escape([cultureinfo]::CurrentCulture.NumberFormat.CurrencySymbol))
$ws2.PivotTables[0].ColumGrandTotals | Should be $false
$ws2.PivotTables[0].StyleName | Should be "PivotStyleDark2"
}
}
}

Binary file not shown.

View File

@@ -93,29 +93,29 @@ Function Compare-WorkSheet {
try { $oneFile = ((Resolve-Path -Path $Referencefile -ErrorAction Stop).path -eq (Resolve-Path -Path $Differencefile -ErrorAction Stop).path)} try { $oneFile = ((Resolve-Path -Path $Referencefile -ErrorAction Stop).path -eq (Resolve-Path -Path $Differencefile -ErrorAction Stop).path)}
Catch { Write-Warning -Message "Could not Resolve the filenames." ; return } Catch { Write-Warning -Message "Could not Resolve the filenames." ; return }
#If we have one file , we mush have two different worksheet names. If we have two files we can a single string or two strings. #If we have one file , we must have two different worksheet names. If we have two files we can have a single string or two strings.
if ($onefile -and ( ($WorkSheetName.count -ne 2) -or $WorkSheetName[0] -eq $WorkSheetName[1] ) ) { if ($onefile -and ( ($WorkSheetName.count -ne 2) -or $WorkSheetName[0] -eq $WorkSheetName[1] ) ) {
Write-Warning -Message "If both the Reference and difference file are the same then worksheet name must provide 2 different names" Write-Warning -Message "If both the Reference and difference file are the same then worksheet name must provide 2 different names"
return return
} }
if ($WorkSheetName.count -eq 2) {$worksheet1 = $WorkSheetName[0] ; $WorkSheet2 = $WorkSheetName[1]} if ($WorkSheetName.count -eq 2) {$worksheet1 = $WorkSheetName[0] ; $workSheet2 = $WorkSheetName[1]}
elseif ($WorkSheetName -is [string]) {$worksheet1 = $WorkSheet2 = $WorkSheetName} elseif ($WorkSheetName -is [string]) {$worksheet1 = $workSheet2 = $WorkSheetName}
else {Write-Warning -Message "You must provide either a single worksheet name or two names." ; return } else {Write-Warning -Message "You must provide either a single worksheet name or two names." ; return }
$params= @{ ErrorAction = [System.Management.Automation.ActionPreference]::Stop } $params= @{ ErrorAction = [System.Management.Automation.ActionPreference]::Stop }
foreach ($p in @("HeaderName","NoHeader","StartRow")) {if ($PSBoundParameters[$p]) {$params[$p] = $PSBoundParameters[$p]}} foreach ($p in @("HeaderName","NoHeader","StartRow")) {if ($PSBoundParameters[$p]) {$params[$p] = $PSBoundParameters[$p]}}
try { try {
$Sheet1 = Import-Excel -Path $Referencefile -WorksheetName $WorkSheet1 @params $sheet1 = Import-Excel -Path $Referencefile -WorksheetName $WorkSheet1 @params
$Sheet2 = Import-Excel -Path $Differencefile -WorksheetName $WorkSheet2 @Params $sheet2 = Import-Excel -Path $Differencefile -WorksheetName $WorkSheet2 @Params
} }
Catch {Write-Warning -Message "Could not read the worksheet from $Referencefile and/or $Differencefile." ; return } Catch {Write-Warning -Message "Could not read the worksheet from $Referencefile and/or $Differencefile." ; return }
#Get Column headings and create a hash table of Name to column letter. #Get Column headings and create a hash table of Name to column letter.
$headings = $Sheet1[-1].psobject.Properties.name # This preserves the sequence - using get-member would sort them alphabetically! $headings = $Sheet1[-1].psobject.Properties.name # This preserves the sequence - using get-member would sort them alphabetically!
$headings | ForEach-Object -Begin {$columns = @{} ; $i=65 } -Process {$Columns[$_] = [char]($i ++) } $headings | ForEach-Object -Begin {$columns = @{} ; $i= 1 } -Process {$Columns[$_] = [OfficeOpenXml.ExcelAddress]::GetAddress(1,($i ++)) -replace "\d","" }
#Make a list of property headings using the Property (default "*") and ExcludeProperty parameters #Make a list of property headings using the Property (default "*") and ExcludeProperty parameters
if ($Key -eq "Name" -and $NoHeader) {$key = "p1"} if ($Key -eq "Name" -and $NoHeader) {$Key = "p1"}
$propList = @() $propList = @()
foreach ($p in $Property) {$propList += ($headings.where({$_ -like $p}) )} foreach ($p in $Property) {$propList += ($headings.where({$_ -like $p}) )}
foreach ($p in $ExcludeProperty) {$propList = $propList.where({$_ -notlike $p}) } foreach ($p in $ExcludeProperty) {$propList = $propList.where({$_ -notlike $p}) }
@@ -124,12 +124,12 @@ Function Compare-WorkSheet {
if ($propList.Count -eq 0) {Write-Warning -Message "No Columns are selected with -Property = '$Property' and -excludeProperty = '$ExcludeProperty'." ; return} if ($propList.Count -eq 0) {Write-Warning -Message "No Columns are selected with -Property = '$Property' and -excludeProperty = '$ExcludeProperty'." ; return}
#Add RowNumber, Sheetname and file name to every row #Add RowNumber, Sheetname and file name to every row
$FirstDataRow = $startRow + 1 $firstDataRow = $startRow + 1
if ($Headername -or $NoHeader) {$FirstDataRow -- } if ($Headername -or $NoHeader) {$firstDataRow -- }
$i = $FirstDataRow ; foreach ($row in $Sheet1) {Add-Member -InputObject $row -MemberType NoteProperty -Name "_Row" -Value ($i ++) $i = $firstDataRow ; foreach ($row in $Sheet1) {Add-Member -InputObject $row -MemberType NoteProperty -Name "_Row" -Value ($i ++)
Add-Member -InputObject $row -MemberType NoteProperty -Name "_Sheet" -Value $worksheet1 Add-Member -InputObject $row -MemberType NoteProperty -Name "_Sheet" -Value $worksheet1
Add-Member -InputObject $row -MemberType NoteProperty -Name "_File" -Value $Referencefile} Add-Member -InputObject $row -MemberType NoteProperty -Name "_File" -Value $Referencefile}
$i = $FirstDataRow ; foreach ($row in $Sheet2) {Add-Member -InputObject $row -MemberType NoteProperty -Name "_Row" -Value ($i ++) $i = $firstDataRow ; foreach ($row in $Sheet2) {Add-Member -InputObject $row -MemberType NoteProperty -Name "_Row" -Value ($i ++)
Add-Member -InputObject $row -MemberType NoteProperty -Name "_Sheet" -Value $worksheet2 Add-Member -InputObject $row -MemberType NoteProperty -Name "_Sheet" -Value $worksheet2
Add-Member -InputObject $row -MemberType NoteProperty -Name "_File" -Value $Differencefile} Add-Member -InputObject $row -MemberType NoteProperty -Name "_File" -Value $Differencefile}
@@ -198,7 +198,7 @@ Function Compare-WorkSheet {
#if nothing was found write a message which wont be redirected #if nothing was found write a message which wont be redirected
if (-not $diff) {Write-Host "Comparison of $Referencefile::$worksheet1 and $Differencefile::$WorkSheet2 returned no results." } if (-not $diff) {Write-Host "Comparison of $Referencefile::$worksheet1 and $Differencefile::$WorkSheet2 returned no results." }
if ($show) { if ($Show) {
Start-Process -FilePath $Referencefile Start-Process -FilePath $Referencefile
if (-not $oneFile) { Start-Process -FilePath $Differencefile } if (-not $oneFile) { Start-Process -FilePath $Differencefile }
if ($GridView) { Write-Warning -Message "-GridView is ignored when -Show is specified" } if ($GridView) { Write-Warning -Message "-GridView is ignored when -Show is specified" }