From 3ce485a1449f11bf5ee62221272060f97b19eb1d Mon Sep 17 00:00:00 2001 From: dfinke Date: Thu, 13 Jun 2019 15:38:28 -0400 Subject: [PATCH] Initial pass at adding ChartTrendLine --- New-ExcelChart.ps1 | 121 ++++++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 55 deletions(-) diff --git a/New-ExcelChart.ps1 b/New-ExcelChart.ps1 index fa40d58..6d66f2b 100644 --- a/New-ExcelChart.ps1 +++ b/New-ExcelChart.ps1 @@ -97,11 +97,12 @@ #> [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()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system State')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification = 'Does not change system State')] param( $Title = "Chart Title", $Header, [OfficeOpenXml.Drawing.Chart.eChartType]$ChartType = "ColumnStacked", + [OfficeOpenXml.Drawing.Chart.eTrendLine[]]$ChartTrendLine, $XRange, $YRange, $Width = 500, @@ -138,11 +139,12 @@ $YMinValue, [OfficeOpenXml.Drawing.Chart.eAxisPosition]$YAxisPosition ) - if ( $Header ) {Write-Warning "The header parameter is ignored."} #Nothing was done with it when creating a chart. + if ( $Header ) { Write-Warning "The header parameter is ignored." } #Nothing was done with it when creating a chart. #might be able to do [PSCustomObject]$PsboundParameters, the defaults here match those in Add-Excel Chart [PSCustomObject]@{ Title = $Title ChartType = $ChartType + ChartTrendLine = $ChartTrendLine XRange = $XRange YRange = $YRange Width = $Width @@ -151,14 +153,14 @@ RowOffSetPixels = $RowOffSetPixels Column = $Column ColumnOffSetPixels = $ColumnOffSetPixels - LegendPosition = $LegendPosition + LegendPosition = $LegendPosition LegendSize = $LegendSize Legendbold = $LegendBold - NoLegend = $NoLegend -as [Boolean] + NoLegend = $NoLegend -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 XAxisTitleText = $XAxisTitleText XAxisTitleBold = $XAxisTitleBold -as [Boolean] @@ -170,7 +172,7 @@ XMinValue = $XMinValue XAxisPosition = $XAxisPosition YAxisTitleText = $YAxisTitleText - YAxisTitleBold = $YAxisTitleBold -as [Boolean] + YAxisTitleBold = $YAxisTitleBold -as [Boolean] YAxisTitleSize = $YAxisTitleSize YAxisNumberformat = $YAxisNumberformat YMajorUnit = $YMajorUnit @@ -326,24 +328,25 @@ function Add-ExcelChart { and is marked off in units of 0.25 shown to two decimal places. The key will for the chart will be at the bottom in 8 point bold type and the line will be named "Sin(x)". #> - [cmdletbinding(DefaultParameterSetName='Worksheet')] + [cmdletbinding(DefaultParameterSetName = 'Worksheet')] [OutputType([OfficeOpenXml.Drawing.Chart.ExcelChart])] param( - [Parameter(ParameterSetName='Workshet',Mandatory=$true)] + [Parameter(ParameterSetName = 'Workshet', Mandatory = $true)] [OfficeOpenXml.ExcelWorksheet]$Worksheet, - [Parameter(ParameterSetName='PivotTable',Mandatory=$true)] + [Parameter(ParameterSetName = 'PivotTable', Mandatory = $true)] [OfficeOpenXml.Table.PivotTable.ExcelPivotTable]$PivotTable , [String]$Title, #$Header, Not used but referenced previously [OfficeOpenXml.Drawing.Chart.eChartType]$ChartType = "ColumnStacked", + [OfficeOpenXml.Drawing.Chart.eTrendLine[]]$ChartTrendLine, $XRange, $YRange, - [int]$Width = 500, - [int]$Height = 350, - [int]$Row = 0, - [int]$RowOffSetPixels = 10, - [int]$Column = 6, - [int]$ColumnOffSetPixels = 5, + [int]$Width = 500, + [int]$Height = 350, + [int]$Row = 0, + [int]$RowOffSetPixels = 10, + [int]$Column = 6, + [int]$ColumnOffSetPixels = 5, [OfficeOpenXml.Drawing.Chart.eLegendPosition]$LegendPosition, $LegendSize, [Switch]$LegendBold, @@ -372,11 +375,11 @@ function Add-ExcelChart { $YMinValue, [OfficeOpenXml.Drawing.Chart.eAxisPosition]$YAxisPosition, [Switch]$PassThru - ) + ) try { if ($PivotTable) { $Worksheet = $PivotTable.WorkSheet - $chart = $Worksheet.Drawings.AddChart(("Chart" + $PivotTable.Name ),$ChartType,$PivotTable) + $chart = $Worksheet.Drawings.AddChart(("Chart" + $PivotTable.Name ), $ChartType, $PivotTable) } else { $ChartName = 'Chart' + (Split-Path -Leaf ([System.IO.path]::GetTempFileName())) -replace 'tmp|\.', '' @@ -384,75 +387,83 @@ function Add-ExcelChart { $chartDefCount = @($YRange).Count if ($chartDefCount -eq 1) { $Series = $chart.Series.Add($YRange, $XRange) - if ($SeriesHeader) { $Series.Header = $SeriesHeader} - else { $Series.Header = 'Series 1'} + if ($ChartType -notmatch "stacked|3D$|pie|Doughnut|Cone|Cylinder|Pyramid") { + foreach ($trendLine in $ChartTrendLine) { + $null = $Series.TrendLines.Add($trendLine) + } + } + else { + Write-Warning "Chart trend line is not supported for chart type: $ChartType" + } + if ($SeriesHeader) { $Series.Header = $SeriesHeader } + else { $Series.Header = 'Series 1' } } else { for ($idx = 0; $idx -lt $chartDefCount; $idx += 1) { if ($Yrange.count -eq $xrange.count) { - $Series = $chart.Series.Add($YRange[$idx], $XRange[$idx]) + $Series = $chart.Series.Add($YRange[$idx], $XRange[$idx]) } else { - $Series = $chart.Series.Add($YRange[$idx], $XRange) + $Series = $chart.Series.Add($YRange[$idx], $XRange) } if ($SeriesHeader.Count -gt 0) { - if ($SeriesHeader[$idx] -match '^=') {$Series.HeaderAddress = $SeriesHeader[$idx] -replace '^=',''} - else {$Series.Header = $SeriesHeader[$idx] } + if ($SeriesHeader[$idx] -match '^=') { $Series.HeaderAddress = $SeriesHeader[$idx] -replace '^=', '' } + else { $Series.Header = $SeriesHeader[$idx] } } - else { $Series.Header = "Series $($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 ($TitleBold) { $chart.Title.Font.Bold = $true } + if ($TitleSize) { $chart.Title.Font.Size = $TitleSize } } if ($NoLegend) { $chart.Legend.Remove() } else { - if ($PSBoundParameters.ContainsKey('LegendPosition')) {$chart.Legend.Position = $LegendPosition} - if ($PSBoundParameters.ContainsKey('LegendBold')) {$chart.Legend.Font.Bold = [boolean]$LegendBold} - if ($LegendSize) {$chart.Legend.Font.Size = $LegendSize} + if ($PSBoundParameters.ContainsKey('LegendPosition')) { $chart.Legend.Position = $LegendPosition } + if ($PSBoundParameters.ContainsKey('LegendBold')) { $chart.Legend.Font.Bold = [boolean]$LegendBold } + if ($LegendSize) { $chart.Legend.Font.Size = $LegendSize } } - if ($XAxisTitleText) { + if ($XAxisTitleText) { $chart.XAxis.Title.Text = $XAxisTitleText - if ($PSBoundParameters.ContainsKey('XAxisTitleBold')) { - $chart.XAxis.Title.Font.Bold = [boolean]$XAxisTitleBold + if ($PSBoundParameters.ContainsKey('XAxisTitleBold')) { + $chart.XAxis.Title.Font.Bold = [boolean]$XAxisTitleBold } - if ($XAxisTitleSize) {$chart.XAxis.Title.Font.Size = $XAxisTitleSize} + 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 ($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) { + if ($YAxisTitleText) { $chart.YAxis.Title.Text = $YAxisTitleText if ($PSBoundParameters.ContainsKey('YAxisTitleBold')) { - $chart.YAxis.Title.Font.Bold = [boolean]$YAxisTitleBold + $chart.YAxis.Title.Font.Bold = [boolean]$YAxisTitleBold } - if ($YAxisTitleSize) {$chart.YAxis.Title.Font.Size = $YAxisTitleSize} + 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 ($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.Datalabel.ShowCategory = [boolean]$ShowCategory + $chart.Datalabel.ShowPercent = [boolean]$ShowPercent } $chart.SetPosition($Row, $RowOffsetPixels, $Column, $ColumnOffsetPixels) $chart.SetSize($Width, $Height) - if ($PassThru) {return $chart} + if ($PassThru) { return $chart } } - catch {Write-Warning -Message "Failed adding Chart to worksheet '$($WorkSheet).name': $_"} + catch { Write-Warning -Message "Failed adding Chart to worksheet '$($WorkSheet).name': $_" } }