mirror of
https://github.com/dfinke/ImportExcel.git
synced 2025-12-06 00:23:20 +00:00
Changed Export-Excel.ps1 #1 @ Line 197 Made new parameter sets . Default, and table already existed and use path. Added DefaultPackage and TablePackage A New parameter "Package" allows an ExcelPackage object returned by -passThru to be passed in ~Line 400 code to use package or path depending on path passed. (also added Open-ExcelPackage to get the object without exporting and Close-ExcelPackage to close it nicely - these are in their own file) #2. @ Line 256 added new parameter excludeProperty to remove unwanted properties without needing to go through select-object ~Line 459 added logic to exclude the properties specified in the new parameter #3 . @ Line 262 Added new parameter Append ~Line 420 code to read the existing headers and move the insertion point below the current data (normal behaviour is to check if headers exist when adding data in the process block, which makes this change wonderfully easy) ~Line 510 changed basis for identifying named ranges and changed scope for rangeName so it can be used on other sheets #4. ~Line 550. Remove any existing Pivot table before trying to [re]create it. Added formatting.ps1 which applies conditional and normal formats - requires an ExcelPackage to be open. Added Open-ExcelPackage.ps1 (which contains a close function as well to get the the object and save it ) open allows the sheet to be loaded into a package object without needing to export . Updated .psm1 to add the formating and open/close ps1 files.
205 lines
12 KiB
PowerShell
205 lines
12 KiB
PowerShell
Function Add-ConditionalFormatting {
|
|
<#
|
|
.Synopsis Adds contitional formatting to worksheet
|
|
.Example
|
|
$excel = $avdata | Export-Excel -Path (Join-path $FilePath "\Machines.XLSX" ) -WorksheetName "Server Anti-Virus" -AutoSize -FreezeTopRow -AutoFilter -PassThru
|
|
|
|
Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Address "b":b1048576" -ForeGroundColor "RED" -RuleType ContainsText -ConditionValue "2003"
|
|
Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Address "i2:i1048576" -ForeGroundColor "RED" -RuleType ContainsText -ConditionValue "Disabled"
|
|
$excel.Workbook.Worksheets[1].Cells["D1:G1048576"].Style.Numberformat.Format = [cultureinfo]::CurrentCulture.DateTimeFormat.ShortDatePattern
|
|
$excel.Workbook.Worksheets[1].Row(1).style.font.bold = $true
|
|
$excel.Save() ; $excel.Dispose()
|
|
|
|
Here Export-Excel is called with the -passThru parameter so the Excel Package object is stored in $Excel
|
|
The desired worksheet is selected and the then columns B and i are conditially formatted (excluding the top row) to show
|
|
Fixed formats are then applied to dates in columns D..G and the top row is formatted
|
|
Finally the workbook is saved and the Excel closed.
|
|
|
|
#>
|
|
Param (
|
|
[OfficeOpenXml.ExcelWorksheet]$WorkSheet ,
|
|
[OfficeOpenXml.ExcelAddress]$Range ,
|
|
[Parameter(Mandatory=$true,ParameterSetName="NamedRule",Position=3)]
|
|
[OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType]$RuleType ,
|
|
[Alias("ForeGroundColour")]
|
|
[System.Drawing.Color]$ForeGroundColor,
|
|
[Parameter(Mandatory=$true,ParameterSetName="DataBar")]
|
|
[Alias("DataBarColour")]
|
|
[System.Drawing.Color]$DataBarColor,
|
|
[Parameter(Mandatory=$true,ParameterSetName="ThreeIconSet")]
|
|
[OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting3IconsSetType]$ThreeIconsSet,
|
|
[Parameter(Mandatory=$true,ParameterSetName="FourIconSet")]
|
|
[OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting4IconsSetType]$FourIconsSet,
|
|
[Parameter(Mandatory=$true,ParameterSetName="FiveIconSet")]
|
|
[OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting5IconsSetType]$FiveIconsSet,
|
|
$ConditionValue,
|
|
$ConditionValue2,
|
|
[System.Drawing.Color]$BackgroundColor,
|
|
[OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern,
|
|
[System.Drawing.Color]$PatternColor,
|
|
$NumberFormat,
|
|
[switch]$Bold,
|
|
[switch]$Italic,
|
|
[switch]$Underline,
|
|
[switch]$StrikeThru
|
|
)
|
|
|
|
If ($ThreeIconsSet) {$rule = $WorkSheet.ConditionalFormatting.AddThreeIconSet($Range , $ThreeIconsSet)}
|
|
elseif ($FourIconsSet) {$rule = $WorkSheet.ConditionalFormatting.AddFourIconSet( $Range , $FourIconsSet) }
|
|
elseif ($FiveIconsSet) {$rule = $WorkSheet.ConditionalFormatting.AddFiveIconSet( $Range , $IconType) }
|
|
elseif ($DataBarColor) {$rule = $WorkSheet.ConditionalFormatting.AddDatabar( $Range , $DataBarColor) }
|
|
else { $rule = ($WorkSheet.ConditionalFormatting)."Add$RuleType"($Range)}
|
|
|
|
if ($ConditionValue -and $RuleType -match "Top|Botom") {$rule.Rank = $ConditionValue }
|
|
if ($ConditionValue -and $RuleType -match "StdDev") {$rule.StdDev = $ConditionValue }
|
|
if ($ConditionValue -and $RuleType -match "Than|Equal|Expression") {$rule.Formula = $ConditionValue }
|
|
if ($ConditionValue -and $RuleType -match "Text|With") {$rule.Text = $ConditionValue }
|
|
if ($ConditionValue -and
|
|
$ConditionValue2 -and $RuleType -match "Between") {$rule.Formula = $ConditionValue
|
|
$rule.Formula2 = $ConditionValue2}
|
|
$rule.Style.Font.Bold = $Bold
|
|
$rule.Style.Font.Italic = $Italic
|
|
$rule.Style.Font.Underline = $Underline
|
|
$rule.Style.Font.Strike = $StrikeThru
|
|
|
|
if ($ForeGroundColor) {$rule.Style.Font.Color = $ForeGroundColor}
|
|
if ($BackgroundColor) {$rule.Style.Fill.BackgroundColor = $BackgroundColor }
|
|
if ($BackgroundPattern) {$rule.Style.Fill.PatternType = $BackgroundPattern }
|
|
if ($PatternColor) {$rule.Style.Fill.PatternColor = $PatternColor}
|
|
if ($NumberFormat) {$rule.Style.NumberFormat.Format = $NumberFormat}
|
|
}
|
|
|
|
Function Set-Format {
|
|
Param (
|
|
#A row, Column or block of cells to format
|
|
[Parameter(ValueFromPipeline=$true)]
|
|
$Address ,
|
|
#Number format to apply to cells e.g. "dd/MM/yyyy HH:mm", "£#,##0.00;[Red]-£#,##0.00", "0.00%" , "##/##" , "0.0E+0" etc
|
|
[Alias("NFormat")]
|
|
$NumberFormat,
|
|
#Style of border to draw around the range
|
|
[OfficeOpenXml.Style.ExcelBorderStyle]$BorderAround,
|
|
#Colour for the text - if none specified it will be left as it it is
|
|
[System.Drawing.Color]$FontColor,
|
|
#Clear Bold, Italic, StrikeThrough and Underline and set colour to black
|
|
[switch]$ResetFont,
|
|
#Make text bold
|
|
[switch]$Bold,
|
|
#Make text italic
|
|
[switch]$Italic,
|
|
#Underline the text using the underline style in -underline type
|
|
[switch]$Underline,
|
|
#Should Underline use single or double, normal or accounting mode : default is single normal
|
|
[OfficeOpenXml.Style.ExcelUnderLineType]$UnderLineType = [OfficeOpenXml.Style.ExcelUnderLineType]::Single,
|
|
#StrikeThrough text
|
|
[switch]$StrikeThru,
|
|
#Subscript or superscript
|
|
[OfficeOpenXml.Style.ExcelVerticalAlignmentFont]$FontShift,
|
|
#Font to use - Excel defaults to Calibri
|
|
[String]$FontName,
|
|
#Point size for the text
|
|
[float]$FontSize,
|
|
#Change background colour
|
|
[System.Drawing.Color]$BackgroundColor,
|
|
#Background pattern - solid by default
|
|
[OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern =[OfficeOpenXml.Style.ExcelFillStyle]::Solid ,
|
|
#Secondary colour for background pattern
|
|
[Alias("PatternColour")]
|
|
[System.Drawing.Color]$PatternColor,
|
|
#Turn on text wrapping
|
|
[switch]$WrapText,
|
|
#Position cell contents to left, right or centre ...
|
|
[OfficeOpenXml.Style.ExcelHorizontalAlignment]$HorizontalAlignment,
|
|
#Position cell contents to top bottom or centre
|
|
[OfficeOpenXml.Style.ExcelVerticalAlignment]$VerticalAlignment,
|
|
#Degrees to rotate text. Up to +90 for anti-clockwise ("upwards"), or to -90 for clockwise.
|
|
[ValidateRange(-90,90)]
|
|
[int]$TextRotation ,
|
|
#Autofit cells to width (columns or ranges only)
|
|
[switch]$AutoFit,
|
|
#Set cells to a fixed width (columns or ranges only), ignored if Autofit is specified
|
|
[float]$Width,
|
|
#Set cells to a fixed hieght (rows or ranges only)
|
|
[float]$Height,
|
|
#Hide a row or column (not a range)
|
|
[switch]$Hidden
|
|
)
|
|
process {
|
|
Foreach ($range in $Address) {
|
|
if ($ResetFont) {$Range.Style.Font.Color.SetColor("Black")
|
|
$Range.Style.Font.Bold = $false
|
|
$Range.Style.Font.Italic = $false
|
|
$Range.Style.Font.UnderLine = $false
|
|
$Range.Style.Font.Strike = $falsee
|
|
}
|
|
if ($Underline) {$Range.Style.Font.UnderLine = $true
|
|
$Range.Style.Font.UnderLineType =$UnderLineType
|
|
}
|
|
if ($Bold) {$Range.Style.Font.Bold = $true }
|
|
if ($Italic) {$Range.Style.Font.Italic = $true }
|
|
if ($StrikeThru) {$Range.Style.Font.Strike = $true }
|
|
if ($FontShift) {$Range.Style.Font.VerticalAlign = $FontShift }
|
|
if ($FontColor) {$Range.Style.Font.Color.SetColor( $FontColor ) }
|
|
if ($BorderRound) {$Range.Style.Border.BorderAround( $BorderAround ) }
|
|
if ($NumberFormat) {$Range.Style.Numberformat.Format= $NumberFormat }
|
|
if ($TextRotation) {$Range.Style.TextRotation = $TextRotation }
|
|
if ($WrapText) {$Range.Style.WrapText = $true }
|
|
if ($HorizontalAlignment) {$Range.Style.HorizontalAlignment= $HorizontalAlignment }
|
|
if ($VerticalAlignment) {$Range.Style.VerticalAlignment = $VerticalAlignment }
|
|
|
|
if ($BackgroundColor) {
|
|
$Range.Style.Fill.PatternType = $BackgroundPattern
|
|
$Range.Style.Fill.BackgroundColor.SetColor($BackgroundColor)
|
|
if ($PatternColor) {
|
|
$range.Style.Fill.PatternColor.SetColor( $PatternColor)
|
|
}
|
|
}
|
|
|
|
if ($Height) {
|
|
if ($Range -is [OfficeOpenXml.ExcelRow] ) {$Range.Height = $Height }
|
|
elseif ($Range -is [OfficeOpenXml.ExcelRange] ) {
|
|
($range.Start.Row)..($range.Start.Row + $range.Rows) |
|
|
ForEach-Object {$ws.Row($_).Height = $Height }
|
|
}
|
|
else {Write-Warning -Message ("Can set the height of a row or a range but not a {0} object" -f ($Range.GetType().name)) }
|
|
}
|
|
if ($AutoFit) {
|
|
if ($Range -is [OfficeOpenXml.ExcelColumn]) {$Range.AutoFit() }
|
|
elseif ($Range -is [OfficeOpenXml.ExcelRange] ) {$Range.AutoFitColumns() }
|
|
else {Write-Warning -Message ("Can autofit a column or a range but not a {0} object" -f ($Range.GetType().name)) }
|
|
|
|
}
|
|
elseif ($Width) {
|
|
if ($Range -is [OfficeOpenXml.ExcelColumn]) {$Range.Width = $Width}
|
|
elseif ($Range -is [OfficeOpenXml.ExcelRange] ) {
|
|
($range.Start.Column)..($range.Start.Column+ $range.Columns) |
|
|
ForEach-Object {$ws.Column($_).Width = $Width}
|
|
}
|
|
else {Write-Warning -Message ("Can set the width of a column or a range but not a {0} object" -f ($Range.GetType().name)) }
|
|
}
|
|
if ($Hidden) {
|
|
if ($Range -is [OfficeOpenXml.ExcelRow] -or
|
|
$Range -is [OfficeOpenXml.ExcelColumn] ) {$Range.Hidden = $True}
|
|
else {Write-Warning -Message ("Can hide a row or a column but not a {0} object" -f ($Range.GetType().name)) }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#Argument completer for colours. If we have PS 5 or Tab expansion++ then we'll register it. Otherwise it does nothing.
|
|
Function ColorCompletion{
|
|
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
|
|
[System.Drawing.KnownColor].GetFields() | Where-Object {$_.IsStatic -and $_.name -like "$wordToComplete*" } |
|
|
Sort-Object name | ForEach-Object {New-CompletionResult $_.name $_.name
|
|
}
|
|
}
|
|
|
|
if (Get-Command -Name register-argumentCompleter -ErrorAction SilentlyContinue) {
|
|
Register-ArgumentCompleter -CommandName Export-Excel -ParameterName TitleBackgroundColor -ScriptBlock $Function:ColorCompletion
|
|
Register-ArgumentCompleter -CommandName Add-ConditionalFormatting -ParameterName ForeGroundColor -ScriptBlock $Function:ColorCompletion
|
|
Register-ArgumentCompleter -CommandName Add-ConditionalFormatting -ParameterName DataBarColor -ScriptBlock $Function:ColorCompletion
|
|
Register-ArgumentCompleter -CommandName Add-ConditionalFormatting -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
|
Register-ArgumentCompleter -CommandName Set-Format -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
|
Register-ArgumentCompleter -CommandName Set-Format -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
|
Register-ArgumentCompleter -CommandName Set-Format -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
|
} |