diff --git a/AddConditionalFormatting.ps1 b/AddConditionalFormatting.ps1 index 61414cf..5b5ac19 100644 --- a/AddConditionalFormatting.ps1 +++ b/AddConditionalFormatting.ps1 @@ -185,7 +185,7 @@ $Address = "$($Address.Row):$($Address.Row)" } elseif ($Address -is [OfficeOpenXml.ExcelColumn]) { - $Address = [OfficeOpenXml.ExcelAddress]::new(1,$address.ColumnMin,1,$address.ColumnMax).Address -replace '1','' + $Address = (New-Object 'OfficeOpenXml.ExcelAddress' @(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 '^.*!',''} diff --git a/AddDataValidation.ps1 b/AddDataValidation.ps1 index 65c2a5b..5328089 100644 --- a/AddDataValidation.ps1 +++ b/AddDataValidation.ps1 @@ -69,9 +69,9 @@ } 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 (-not $WorkSheet -and $Range.worksheet) {$WorkSheet = $Range.worksheet} + if (-not $WorkSheet -and $Range.worksheet) {$WorkSheet = $Range.worksheet} if ($Range.Address) {$Range = $Range.Address} - + if ($Range -isnot [string] -or -not $WorkSheet) {Write-Warning -Message "You need to provide a worksheet and range of cells." ;return} #else we assume Range is a range. diff --git a/ConvertFromExcelData.ps1 b/ConvertFromExcelData.ps1 index 3421bc1..6b18fc1 100644 --- a/ConvertFromExcelData.ps1 +++ b/ConvertFromExcelData.ps1 @@ -3,7 +3,7 @@ function ConvertFrom-ExcelData { .SYNOPSIS Reads data from a sheet, and for each row, calls a custom scriptblock with a list of property names and the row of data. - + .EXAMPLE ConvertFrom-ExcelData .\testSQLGen.xlsx { param($propertyNames, $record) diff --git a/DoTests.ps1 b/DoTests.ps1 index ce81979..c55ff58 100644 --- a/DoTests.ps1 +++ b/DoTests.ps1 @@ -10,7 +10,7 @@ $PSVersionTable.PSVersion ## Create the zip before the tests run ## Otherwise the EPPlus.dll is in use after the Pester run -$ModuleVersion = (Get-Content -Raw .\ImportExcel.psd1) | Invoke-Expression | ForEach-Object ModuleVersion +$ModuleVersion = (Invoke-Command -ScriptBlock ([scriptblock]::Create((Get-Content -Raw .\ImportExcel.psd1)))).moduleVersion if (!$DontCreateZip) { $dest = "ImportExcel-{0}-{1}.zip" -f $ModuleVersion, (Get-Date).ToString("yyyyMMddHHmmss") diff --git a/Export-Excel.ps1 b/Export-Excel.ps1 index 46ed816..e5d19a4 100644 --- a/Export-Excel.ps1 +++ b/Export-Excel.ps1 @@ -84,9 +84,9 @@ .PARAMETER RangeName Makes the data in the worksheet a named range. .PARAMETER TableName - Makes the data in the worksheet a table with a name, and applies a style to it. Name must not contain spaces. + Makes the data in the worksheet a table with a name, and applies a style to it. The name must not contain spaces. If a style is specified without a name, table1, table2 etc. will be used. .PARAMETER TableStyle - Selects the style for the named table - defaults to 'Medium6'. + Selects the style for the named table - if a name is specified without a style, 'Medium6' is used as a default. .PARAMETER BarChart Creates a "quick" bar chart using the first text column as labels and the first numeric column as values .PARAMETER ColumnChart @@ -418,15 +418,15 @@ .LINK https://github.com/dfinke/ImportExcel #> - [CmdletBinding(DefaultParameterSetName = 'Default')] + [CmdletBinding(DefaultParameterSetName = 'Now')] [OutputType([OfficeOpenXml.ExcelPackage])] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")] Param( - [Parameter(ParameterSetName = "Default", Position = 0)] - [Parameter(ParameterSetName = "Table" , Position = 0)] + + [Parameter(Mandatory = $true, ParameterSetName = "Path", Position = 0)] [String]$Path, - [Parameter(Mandatory = $true, ParameterSetName = "PackageDefault")] - [Parameter(Mandatory = $true, ParameterSetName = "PackageTable")] + [Parameter(Mandatory = $true, ParameterSetName = "Package")] + [OfficeOpenXml.ExcelPackage]$ExcelPackage, [Parameter(ValueFromPipeline = $true)] [Alias('TargetData')] @@ -462,8 +462,8 @@ [Switch]$FreezeFirstColumn, [Switch]$FreezeTopRowFirstColumn, [Int[]]$FreezePane, - [Parameter(ParameterSetName = 'Default')] - [Parameter(ParameterSetName = 'PackageDefault')] + + [Switch]$AutoFilter, [Switch]$BoldTopRow, [Switch]$NoHeader, @@ -478,11 +478,11 @@ elseif ($_[0] -notmatch '[a-z]') { throw 'Tablename starts with an invalid character.' } else { $true } })] - [Parameter(ParameterSetName = 'Table' , Mandatory = $true, ValueFromPipelineByPropertyName)] - [Parameter(ParameterSetName = 'PackageTable' , Mandatory = $true, ValueFromPipelineByPropertyName)] + + [String]$TableName, - [Parameter(ParameterSetName = 'Table')] - [Parameter(ParameterSetName = 'PackageTable')] + + [OfficeOpenXml.Table.TableStyles]$TableStyle, [Switch]$Barchart, [Switch]$PieChart, @@ -793,9 +793,12 @@ Add-ExcelName -RangeName $targetRangeName -Range $ws.Cells[$targetRow, ($StartColumn + $c ), $LastRow, ($StartColumn + $c )] try {#this test can throw with some names, surpress any error if ([OfficeOpenXml.FormulaParsing.ExcelUtilities.ExcelAddressUtil]::IsValidAddress(($targetRangeName -replace '\W' , '_' ))) { - Write-Warning "AutoNameRange: Property name '$targetRangeName' is also a valid Excel address and may cause issues. Consider renaming the property name." + Write-Warning -Message "AutoNameRange: Property name '$targetRangeName' is also a valid Excel address and may cause issues. Consider renaming the property." } - } Catch {} + } + Catch { + Write-Warning -Message "AutoNameRange: Testing '$targetRangeName' caused an error. This should be harmless, but a change of property name may be needed.." + } } } catch {Write-Warning -Message "Failed adding named ranges to worksheet '$WorksheetName': $_" } @@ -803,14 +806,17 @@ #Empty string is not allowed as a name for ranges or tables. if ($RangeName) { Add-ExcelName -Range $ws.Cells[$dataRange] -RangeName $RangeName} - if ($TableName) { + #Allow table to be inserted by specifying Name, or Style or both; only process autoFilter if there is no table (they clash). + if ($TableName) { if ($PSBoundParameters.ContainsKey('TableStyle')) { Add-ExcelTable -Range $ws.Cells[$dataRange] -TableName $TableName -TableStyle $TableStyle } else {Add-ExcelTable -Range $ws.Cells[$dataRange] -TableName $TableName} } - - if ($AutoFilter) { + elseif ($PSBoundParameters.ContainsKey('TableStyle')) { + Add-ExcelTable -Range $ws.Cells[$dataRange] -TableName "" -TableStyle $TableStyle + } + elseif ($AutoFilter) { try { $ws.Cells[$dataRange].AutoFilter = $true Write-Verbose -Message "Enabled autofilter. " @@ -1235,7 +1241,7 @@ function Select-Worksheet { } } -Function Add-ExcelName { +function Add-ExcelName { <# .SYNOPSIS Adds a named-range to an existing Excel worksheet. @@ -1299,9 +1305,8 @@ function Add-ExcelTable { #The range of cells to assign to a table. [Parameter(Mandatory=$true)] [OfficeOpenXml.ExcelRange]$Range, - #The name for the Table - this should be unqiue in the Workbook. - [Parameter(Mandatory=$true)] - [String]$TableName, + #The name for the Table - this should be unqiue in the Workbook - auto generated names will be used if this is left empty. + [String]$TableName = "", #The Style for the table, by default "Medium6" is used [OfficeOpenXml.Table.TableStyles]$TableStyle = 'Medium6', #By default the header row is shown - it can be turned off with -ShowHeader:$false. @@ -1324,32 +1329,37 @@ function Add-ExcelTable { [Switch]$PassThru ) try { - if ([OfficeOpenXml.FormulaParsing.ExcelUtilities.ExcelAddressUtil]::IsValidAddress($TableName)) { - Write-Warning -Message "$tableName reads as an Excel address, and so is not allowed as a table name." - return - } - if ($tableName -notMatch '^[A-Z]') { - Write-Warning -Message "$tableName is not allowed as a table name because it does not begin with a letter." - return - } - if ($TableName -match "\W") { - Write-Warning -Message "At least one character in $TableName is illegal in a table name and will be replaced with '_' . " - $TableName = $TableName -replace '\W', '_' - } - $ws = $Range.Worksheet - #if the table exists in this worksheet, update it. - if ($ws.Tables[$TableName]) { - $tbl =$ws.Tables[$TableName] - $tbl.TableXml.table.ref = $Range.Address - Write-Verbose -Message "Re-defined table '$TableName', now at $($Range.Address)." - } - elseif ($ws.Workbook.Worksheets.Tables.Name -contains $TableName) { - Write-Warning -Message "The Table name '$TableName' is already used on a different worksheet." - return + if ($TableName -eq "" -or $null -eq $TableName) { + $tbl = $Range.Worksheet.Tables.Add($Range, "") } else { - $tbl = $ws.Tables.Add($Range, $TableName) - Write-Verbose -Message "Defined table '$TableName' at $($Range.Address)" + if ([OfficeOpenXml.FormulaParsing.ExcelUtilities.ExcelAddressUtil]::IsValidAddress($TableName)) { + Write-Warning -Message "$TableName reads as an Excel address, and so is not allowed as a table name." + return + } + if ($TableName -notMatch '^[A-Z]') { + Write-Warning -Message "$TableName is not allowed as a table name because it does not begin with a letter." + return + } + if ($TableName -match "\W") { + Write-Warning -Message "At least one character in $TableName is illegal in a table name and will be replaced with '_' . " + $TableName = $TableName -replace '\W', '_' + } + $ws = $Range.Worksheet + #if the table exists in this worksheet, update it. + if ($ws.Tables[$TableName]) { + $tbl =$ws.Tables[$TableName] + $tbl.TableXml.table.ref = $Range.Address + Write-Verbose -Message "Re-defined table '$TableName', now at $($Range.Address)." + } + elseif ($ws.Workbook.Worksheets.Tables.Name -contains $TableName) { + Write-Warning -Message "The Table name '$TableName' is already used on a different worksheet." + return + } + else { + $tbl = $ws.Tables.Add($Range, $TableName) + Write-Verbose -Message "Defined table '$($tbl.Name)' at $($Range.Address)" + } } #it seems that show total changes some of the others, so the sequence matters. if ($PSBoundParameters.ContainsKey('ShowHeader')) {$tbl.ShowHeader = [bool]$ShowHeader} @@ -1358,7 +1368,7 @@ function Add-ExcelTable { foreach ($k in $TotalSettings.keys) { if (-not $tbl.Columns[$k]) {Write-Warning -Message "Table does not have a Column '$k'."} elseif ($TotalSettings[$k] -notin @("Average", "Count", "CountNums", "Max", "Min", "None", "StdDev", "Sum", "Var") ) { - Write-wanring "'$($TotalSettings[$k])' is not a valid total function." + Write-Warning -Message "'$($TotalSettings[$k])' is not a valid total function." } else {$tbl.Columns[$k].TotalsRowFunction = $TotalSettings[$k]} } diff --git a/Export-charts.ps1 b/Export-charts.ps1 index e51d894..d78a9a6 100644 --- a/Export-charts.ps1 +++ b/Export-charts.ps1 @@ -1,49 +1,49 @@ <# .Synopsis - Exports the charts in an Excel spreadSheet + Exports the charts in an Excel spreadSheet .Example Export-Charts .\test.xlsx Exports the charts in test.xlsx to JPEG files in the current directory. .Example - Export-Charts -path .\test,xlsx -destination [System.Environment+SpecialFolder]::MyDocuments -outputType PNG -passthrough - Exports the charts to PNG files in MyDocuments , and returns file objects representing the newly created files + Export-Charts -path .\test,xlsx -destination [System.Environment+SpecialFolder]::MyDocuments -outputType PNG -passthrough + Exports the charts to PNG files in MyDocuments , and returns file objects representing the newly created files #> Param ( - #Path to the Excel file whose chars we will export. - $Path = "C:\Users\public\Documents\stats.xlsx", - #If specified, output file objects representing the image files - [switch]$Passthru, - #Format to write - JPG by default + #Path to the Excel file whose chars we will export. + $Path = "C:\Users\public\Documents\stats.xlsx", + #If specified, output file objects representing the image files + [switch]$Passthru, + #Format to write - JPG by default [ValidateSet("JPG","PNG","GIF")] - $OutputType = "JPG", - #Folder to write image files to (defaults to same one as the Excel file is in) + $OutputType = "JPG", + #Folder to write image files to (defaults to same one as the Excel file is in) $Destination ) -#if no output folder was specified, set destination to the folder where the Excel file came from -if (-not $Destination) {$Destination = Split-Path -Path $Path -Parent } +#if no output folder was specified, set destination to the folder where the Excel file came from +if (-not $Destination) {$Destination = Split-Path -Path $Path -Parent } -#Call up Excel and tell it to open the file. -try { $excelApp = New-Object -ComObject "Excel.Application" } -catch { Write-Warning "Could not start Excel application - which usually means it is not installed." ; return } +#Call up Excel and tell it to open the file. +try { $excelApp = New-Object -ComObject "Excel.Application" } +catch { Write-Warning "Could not start Excel application - which usually means it is not installed." ; return } -try { $excelWorkBook = $excelApp.Workbooks.Open($Path) } -catch { Write-Warning -Message "Could not Open $Path." ; return } +try { $excelWorkBook = $excelApp.Workbooks.Open($Path) } +catch { Write-Warning -Message "Could not Open $Path." ; return } -#For each worksheet, for each chart, jump to the chart, create a filename of "WorksheetName_ChartTitle.jpg", and export the file. +#For each worksheet, for each chart, jump to the chart, create a filename of "WorksheetName_ChartTitle.jpg", and export the file. foreach ($excelWorkSheet in $excelWorkBook.Worksheets) { - #note somewhat unusual way of telling excel we want all the charts. + #note somewhat unusual way of telling excel we want all the charts. foreach ($excelchart in $excelWorkSheet.ChartObjects([System.Type]::Missing)) { - #if you don't go to the chart the image will be zero size ! + #if you don't go to the chart the image will be zero size ! $excelApp.Goto($excelchart.TopLeftCell,$true) $imagePath = Join-Path -Path $Destination -ChildPath ($excelWorkSheet.Name + "_" + ($excelchart.Chart.ChartTitle.Text -split "\s\d\d:\d\d,")[0] + ".$OutputType") - if ( $excelchart.Chart.Export($imagePath, $OutputType, $false) ) { # Export returs true/false for success/failure - if ($Passthru) {Get-Item -Path $imagePath } # when succesful return a file object (-Passthru) or print a verbose message, write warning for any failures + if ( $excelchart.Chart.Export($imagePath, $OutputType, $false) ) { # Export returs true/false for success/failure + if ($Passthru) {Get-Item -Path $imagePath } # when succesful return a file object (-Passthru) or print a verbose message, write warning for any failures else {Write-Verbose -Message "Exported $imagePath"} - } - else {Write-Warning -Message "Failure exporting $imagePath" } + } + else {Write-Warning -Message "Failure exporting $imagePath" } } } $excelApp.DisplayAlerts = $false diff --git a/Get-ExcelSheetInfo.ps1 b/Get-ExcelSheetInfo.ps1 index bb00ee3..edccf04 100644 --- a/Get-ExcelSheetInfo.ps1 +++ b/Get-ExcelSheetInfo.ps1 @@ -29,7 +29,7 @@ Function Get-ExcelSheetInfo { $stream = New-Object -TypeName System.IO.FileStream -ArgumentList $Path,'Open','Read','ReadWrite' $xl = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream $workbook = $xl.Workbook - + if ($workbook -and $workbook.Worksheets) { $workbook.Worksheets | Select-Object -Property name,index,hidden,@{ diff --git a/Get-ExcelWorkbookInfo.ps1 b/Get-ExcelWorkbookInfo.ps1 index 564e139..ab4c845 100644 --- a/Get-ExcelWorkbookInfo.ps1 +++ b/Get-ExcelWorkbookInfo.ps1 @@ -1,8 +1,8 @@ Function Get-ExcelWorkbookInfo { - <# - .SYNOPSIS + <# + .SYNOPSIS Retrieve information of an Excel workbook. - .DESCRIPTION + .DESCRIPTION The Get-ExcelWorkbookInfo cmdlet retrieves information (LastModifiedBy, LastPrinted, Created, Modified, ...) fron an Excel workbook. These are the same details that are visible in Windows Explorer when right clicking the Excel file, selecting Properties and check the Details tabpage. .PARAMETER Path Specifies the path to the Excel file. This parameter is required. @@ -10,22 +10,22 @@ Get-ExcelWorkbookInfo .\Test.xlsx CorePropertiesXml : #document - Title : - Subject : + Title : + Subject : Author : Konica Minolta User - Comments : - Keywords : + Comments : + Keywords : LastModifiedBy : Bond, James (London) GBR LastPrinted : 2017-01-21T12:36:11Z Created : 17/01/2017 13:51:32 - Category : - Status : + Category : + Status : ExtendedPropertiesXml : #document Application : Microsoft Excel - HyperlinkBase : + HyperlinkBase : AppVersion : 14.0300 Company : Secret Service - Manager : + Manager : Modified : 10/02/2017 12:45:37 CustomPropertiesXml : #document @@ -35,8 +35,8 @@ .LINK https://github.com/dfinke/ImportExcel - #> - + #> + [CmdletBinding()] Param ( [Alias('FullName')] @@ -52,12 +52,12 @@ $xl = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream $workbook = $xl.Workbook $workbook.Properties - + $stream.Close() $stream.Dispose() $xl.Dispose() $xl = $null - } + } Catch { throw "Failed retrieving Excel workbook information for '$Path': $_" } diff --git a/Get-HtmlTable.ps1 b/Get-HtmlTable.ps1 index a64d320..3aefbb3 100644 --- a/Get-HtmlTable.ps1 +++ b/Get-HtmlTable.ps1 @@ -11,7 +11,7 @@ function Get-HtmlTable { ) $r = Invoke-WebRequest $url -UseDefaultCredentials: $UseDefaultCredentials - + $table = $r.ParsedHtml.getElementsByTagName("table")[$tableIndex] $propertyNames=$Header $totalRows=@($table.rows).count @@ -19,7 +19,7 @@ function Get-HtmlTable { for ($idx = $FirstDataRow; $idx -lt $totalRows; $idx++) { $row = $table.rows[$idx] - $cells = @($row.cells) + $cells = @($row.cells) if(!$propertyNames) { if($cells[0].tagName -eq 'th') { @@ -28,7 +28,7 @@ function Get-HtmlTable { $propertyNames = @(1..($cells.Count + 2) | Foreach-Object { "P$_" }) } continue - } + } $result = [ordered]@{} diff --git a/GetExcelTable.ps1 b/GetExcelTable.ps1 index dce52dc..4fa2742 100644 --- a/GetExcelTable.ps1 +++ b/GetExcelTable.ps1 @@ -96,7 +96,7 @@ function ConvertFrom-ExcelColumnName { $sum } -ipmo .\ImportExcel.psd1 -Force +Import-Module .\ImportExcel.psd1 -Force #Get-ExcelTableName .\testTable.xlsx | Get-ExcelTable .\testTable.xlsx Get-ExcelTable .\testTable.xlsx Table3 \ No newline at end of file diff --git a/Import-Html.ps1 b/Import-Html.ps1 index f467568..2deadcc 100644 --- a/Import-Html.ps1 +++ b/Import-Html.ps1 @@ -2,19 +2,19 @@ function Import-Html { [CmdletBinding()] param( - $url, + $url, $index, $Header, [int]$FirstDataRow=0, [Switch]$UseDefaultCredentials ) - + $xlFile = [System.IO.Path]::GetTempFileName() -replace "tmp","xlsx" - rm $xlFile -ErrorAction Ignore + Remove-Item $xlFile -ErrorAction Ignore Write-Verbose "Exporting to Excel file $($xlFile)" $data = Get-HtmlTable -url $url -tableIndex $index -Header $Header -FirstDataRow $FirstDataRow -UseDefaultCredentials: $UseDefaultCredentials - + $data | Export-Excel $xlFile -Show -AutoSize } \ No newline at end of file diff --git a/ImportExcel.psm1 b/ImportExcel.psm1 index 908e80e..c6e8bc1 100644 --- a/ImportExcel.psm1 +++ b/ImportExcel.psm1 @@ -48,6 +48,7 @@ if ($PSVersionTable.PSVersion.Major -ge 5) { . $PSScriptRoot\Plot.ps1 Function New-Plot { + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification='New-Plot does not change system state')] Param() [PSPlot]::new() @@ -296,7 +297,7 @@ function Import-Excel { .SYNOPSIS Create objects containing the column number and the column name for each of the different header types. #> - + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification="Name would be incorrect, and command is not exported")] Param ( [Parameter(Mandatory)] [Int[]]$Columns, diff --git a/Install.ps1 b/Install.ps1 index 5d792c4..6b367dd 100644 --- a/Install.ps1 +++ b/Install.ps1 @@ -1,5 +1,5 @@ -<# - .SYNOPSIS +<# + .SYNOPSIS Download the module files from GitHub. .DESCRIPTION @@ -90,7 +90,7 @@ Process { } $WebClient = New-Object System.Net.WebClient - + $Files | ForEach-Object { $WebClient.DownloadFile("$GitPath/$_","$installDirectory\$_") Write-Verbose "$ModuleName installed module file '$_'" diff --git a/Invoke-Sum.ps1 b/Invoke-Sum.ps1 index 2b5bfa5..7343098 100644 --- a/Invoke-Sum.ps1 +++ b/Invoke-Sum.ps1 @@ -18,7 +18,7 @@ function Invoke-Sum { $h.$key=[ordered]@{} } - foreach($m in $measure) { + foreach($m in $measure) { $value = $item.$m if($value -is [string] -or $value -is [System.Enum]) { $value = 1 @@ -27,15 +27,15 @@ function Invoke-Sum { $h.$key.$m+=$value } } - + foreach ($entry in $h.GetEnumerator()){ - + $nh=[ordered]@{Name=$entry.key} - + foreach ($item in $entry.value.getenumerator()) { $nh.($item.key)=$item.value - } - + } + [pscustomobject]$nh } } \ No newline at end of file diff --git a/LoadPSD1.ps1 b/LoadPSD1.ps1 index dc21ac4..68a9ec5 100644 --- a/LoadPSD1.ps1 +++ b/LoadPSD1.ps1 @@ -1,3 +1,3 @@ -if((Get-Module -list ImportExcel) -eq $null) { +if($null -eq (Get-Module -ListAvailable ImportExcel) ) { Import-Module $PSScriptRoot\ImportExcel.psd1 -force } \ No newline at end of file diff --git a/Merge-worksheet.ps1 b/Merge-worksheet.ps1 index 4ef6978..01ae37e 100644 --- a/Merge-worksheet.ps1 +++ b/Merge-worksheet.ps1 @@ -316,10 +316,10 @@ } Function Merge-MultipleSheets { - <# - .Synopsis + <# + .Synopsis Merges Worksheets into a single Worksheet with differences marked up. - .Description + .Description The Merge Worksheet command combines two sheets. Merge-MultipleSheets is designed to merge more than two. So if asked to merge sheets A,B,C which contain Services, with a Name, Displayname and Start mode, where "Name" is @@ -353,30 +353,32 @@ Function Merge-MultipleSheets { sheet. However if Sheet B is the reference sheet, A and C will be seen to have an item removed; and if B is processed before C, the extra item is known when C is processed and so C is considered to be missing that item. - .Example + .Example dir Server*.xlsx | Merge-MulipleSheets -WorksheetName Services -OutputFile Test2.xlsx -OutputSheetName Services -Show Here we are auditing servers and each one has a workbook in the current directory which contains a "Services" Worksheet (the result of Get-WmiObject -Class win32_service | Select-Object -Property Name, Displayname, Startmode) No key is specified so the key is assumed to be the "Name" column. The files are merged and the result is opened on completion. - .Example + .Example dir Serv*.xlsx | Merge-MulipleSheets -WorksheetName Software -Key "*" -ExcludeProperty Install* -OutputFile Test2.xlsx -OutputSheetName Software -Show The server audit files in the previous example also have "Software" worksheet, but no single field on that sheet works as a key. Specifying "*" for the key produces a compound key using all non-excluded fields (and the installation date and file location are excluded). - .Example + .Example Merge-MulipleSheets -Path hotfixes.xlsx -WorksheetName Serv* -Key hotfixid -OutputFile test2.xlsx -OutputSheetName hotfixes -HideRowNumbers -Show This time all the servers have written their hotfix information to their own worksheets in a shared Excel workbook named "Hotfixes.xlsx" (the information was obtained by running Get-Hotfix | Sort-Object -Property description,hotfixid | Select-Object -Property Description,HotfixID) This ignores any sheets which are not named "Serv*", and uses the HotfixID as the key; in this version the row numbers are hidden. - #> - [cmdletbinding()] - #[Alias("Merge-MulipleSheets")] #There was a spelling error in the first release. This was there to ensure things didn't break but intelisense gave the alias first. - param ( + #> + [cmdletbinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification="False positives when initializing variable in begin block")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification="MultipleSheet would be incorrect")] + #[Alias("Merge-MulipleSheets")] #There was a spelling error in the first release. This was there to ensure things didn't break but intelisense gave the alias first. + param ( #Paths to the files to be merged. Files are also accepted [Parameter(Mandatory=$true,ValueFromPipeline=$true)] $Path , @@ -418,9 +420,9 @@ Function Merge-MultipleSheets { #If specified, opens the output workbook. [Switch]$Show ) - begin { $filestoProcess = @() } - process { $filestoProcess += $Path} - end { + begin { $filestoProcess = @() } + process { $filestoProcess += $Path} + end { if ($filestoProcess.Count -eq 1 -and $WorksheetName -match '\*') { Write-Progress -Activity "Merging sheets" -CurrentOperation "Expanding * to names of sheets in $($filestoProcess[0]). " $excel = Open-ExcelPackage -Path $filestoProcess @@ -532,5 +534,5 @@ Function Merge-MultipleSheets { if ($Passthru) {$excel} else {Close-ExcelPackage -ExcelPackage $excel -Show:$Show} Write-Progress -Activity "Merging sheets" -Completed - } + } } diff --git a/New-ConditionalFormattingIconSet.ps1 b/New-ConditionalFormattingIconSet.ps1 index 49ad983..acd7547 100644 --- a/New-ConditionalFormattingIconSet.ps1 +++ b/New-ConditionalFormattingIconSet.ps1 @@ -27,6 +27,7 @@ function New-ConditionalFormattingIconSet { Add-Add-ConditionalFormatting New-ConditionalText #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system State')] param( [Parameter(Mandatory=$true)] $Range, diff --git a/New-ConditionalText.ps1 b/New-ConditionalText.ps1 index 3f32fb6..0f7690d 100644 --- a/New-ConditionalText.ps1 +++ b/New-ConditionalText.ps1 @@ -42,8 +42,8 @@ function New-ConditionalText { Add-Add-ConditionalFormatting New-ConditionalFormattingIconSet #> - [cmdletbinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system State')] param( #[Parameter(Mandatory=$true)] [Alias("ConditionValue")] diff --git a/New-ExcelChart.ps1 b/New-ExcelChart.ps1 index b298c07..fa40d58 100644 --- a/New-ExcelChart.ps1 +++ b/New-ExcelChart.ps1 @@ -97,6 +97,7 @@ #> [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')] param( $Title = "Chart Title", $Header, diff --git a/New-PSItem.ps1 b/New-PSItem.ps1 index b186dcc..4e10276 100644 --- a/New-PSItem.ps1 +++ b/New-PSItem.ps1 @@ -1,3 +1,5 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Scope='Function', Target='New*', Justification='Does not change system State')] +param() function New-PSItem { $totalArgs = $args.Count diff --git a/PivotTable.ps1 b/PivotTable.ps1 index 7694039..7f69d2c 100644 --- a/PivotTable.ps1 +++ b/PivotTable.ps1 @@ -312,6 +312,7 @@ function New-PivotTableDefinition { 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. #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system State')] param( [Parameter(Mandatory)] [Alias("PivtoTableName")]#Previous typo - use alias to avoid breaking scripts diff --git a/RemoveWorksheet.ps1 b/RemoveWorksheet.ps1 index 06c6a9c..1e919c5 100644 --- a/RemoveWorksheet.ps1 +++ b/RemoveWorksheet.ps1 @@ -15,7 +15,8 @@ C:\> dir c:\reports\*.xlsx | Remove-WorkSheet Removes 'Sheet1' from all the xlsx files in the c:\reports directory -#> + #> + [cmdletbinding(SupportsShouldProcess=$true)] param( # [Parameter(ValueFromPipelineByPropertyName)] [Parameter(ValueFromPipelineByPropertyName)] @@ -34,9 +35,10 @@ if ($pkg) { foreach ($wsn in $WorksheetName) { - $pkg.Workbook.Worksheets.Delete($wsn) + if ($PSCmdlet.ShouldProcess($FullName,"Remove Sheet $wsn")) { + $pkg.Workbook.Worksheets.Delete($wsn) + } } - Close-ExcelPackage -ExcelPackage $pkg -Show:$Show } } diff --git a/Send-SqlDataToExcel.ps1 b/Send-SqlDataToExcel.ps1 index 64fd9ac..874ee87 100644 --- a/Send-SqlDataToExcel.ps1 +++ b/Send-SqlDataToExcel.ps1 @@ -90,6 +90,8 @@ Export-Excel #> [CmdletBinding(DefaultParameterSetName="none")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '', Justification="Allowed to use DBSessions Global variable from GETSQL Module")] + param ( [Parameter(ParameterSetName="SQLConnection", Mandatory=$true)] [Parameter(ParameterSetName="ODBCConnection", Mandatory=$true)] diff --git a/Set-CellStyle.ps1 b/Set-CellStyle.ps1 index a99d9be..0968512 100644 --- a/Set-CellStyle.ps1 +++ b/Set-CellStyle.ps1 @@ -1,4 +1,7 @@ -function Set-CellStyle { +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Scope='Function', Target='Set*', Justification='Does not change system state')] +param() + +function Set-CellStyle { param( $WorkSheet, $Row, diff --git a/Set-Column.ps1 b/Set-Column.ps1 index 73c93f7..ecbcd7d 100644 --- a/Set-Column.ps1 +++ b/Set-Column.ps1 @@ -44,6 +44,8 @@ [cmdletbinding()] [Alias("Set-Column")] [OutputType([OfficeOpenXml.ExcelColumn],[String])] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system state')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification="Variables created for script block which may be passed as a parameter, but not used in the script")] Param ( #If specifying the worksheet by name, the ExcelPackage object which contains the worksheet also needs to be passed. [Parameter(ParameterSetName="Package",Mandatory=$true)] @@ -138,7 +140,7 @@ process { if ($null -eq $workSheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return} if ($Column -eq 0 ) {$Column = $endColumn + 1 } - $columnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1","" + $columnName = (New-Object 'OfficeOpenXml.ExcelCellAddress' @(1, $column)).Address -replace "1","" 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 ($PSBoundParameters.ContainsKey('Heading')) { diff --git a/Set-Row.ps1 b/Set-Row.ps1 index 1fd6a1f..4984237 100644 --- a/Set-Row.ps1 +++ b/Set-Row.ps1 @@ -33,6 +33,8 @@ [cmdletbinding()] [Alias("Set-Row")] [OutputType([OfficeOpenXml.ExcelRow],[String])] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system state')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification="Variables created for script block which may be passed as a parameter, but not used in the script")] Param ( #An Excel package object - e.g. from Export-Excel -PassThru - requires a sheet name. [Parameter(ParameterSetName="Package",Mandatory=$true)] @@ -143,7 +145,7 @@ #Fill in the data if ($PSBoundParameters.ContainsKey('Value')) {foreach ($column in ($StartColumn..$endColumn)) { #We might want the column name in a script block - $columnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1","" + $columnName = (New-Object -TypeName OfficeOpenXml.ExcelCellAddress @(1,$column)).Address -replace "1","" if ($Value -is [scriptblock] ) { #re-create the script block otherwise variables from this function are out of scope. $cellData = & ([scriptblock]::create( $Value )) @@ -177,7 +179,7 @@ if ($PSBoundParameters.ContainsKey($p)) {$params[$p] = $PSBoundParameters[$p]} } if ($params.Count) { - $theRange = [OfficeOpenXml.ExcelAddress]::New($Row, $StartColumn, $Row, $endColumn) + $theRange = New-Object -TypeName OfficeOpenXml.ExcelAddress @($Row, $StartColumn, $Row, $endColumn) Set-ExcelRange -WorkSheet $Worksheet -Range $theRange @params } #endregion diff --git a/Set-WorkSheetProtection.ps1 b/Set-WorkSheetProtection.ps1 index fef0683..95de184 100644 --- a/Set-WorkSheetProtection.ps1 +++ b/Set-WorkSheetProtection.ps1 @@ -9,6 +9,7 @@ Set-WorkSheetProtection -WorkSheet $planSheet -IsProtected -AllowAll -AllowInsertColumns:$false -AllowDeleteColumns:$false -UnLockAddress "A:N" Turns on protection for the worksheet in $planSheet, checks all the allow boxes excel Insert and Delete columns and unlocks columns A-N #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system state')] param ( #The worksheet where protection is to be applied. [Parameter(Mandatory=$true)] diff --git a/SetFormat.ps1 b/SetFormat.ps1 index 2bd7461..05d0b74 100644 --- a/SetFormat.ps1 +++ b/SetFormat.ps1 @@ -32,6 +32,7 @@ #> [cmdletbinding()] [Alias("Set-Format")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system state')] Param ( #One or more row(s), Column(s) and/or block(s) of cells to format. [Parameter(ValueFromPipeline = $true,Position=0)] diff --git a/Update-FirstObjectProperties.ps1 b/Update-FirstObjectProperties.ps1 index f19935b..b053337 100644 --- a/Update-FirstObjectProperties.ps1 +++ b/Update-FirstObjectProperties.ps1 @@ -1,6 +1,11 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Scope='Function', Target='Update*', Justification='Does not change system state')] +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Scope='Function', Target='Update*', Justification='Property would be incorrect')] + +param() + Function Update-FirstObjectProperties { - <# - .SYNOPSIS + <# + .SYNOPSIS Updates the first object to contain all the properties of the object with the most properties in the array. .DESCRIPTION @@ -30,7 +35,7 @@ Function Update-FirstObjectProperties { $Array = $Obj1, $Obj2, $Obj3 $Array | Out-GridView -Title 'Not showing Member3 and Member4' $Array | Update-FirstObjectProperties | Out-GridView -Title 'All properties are visible' - + Updates the fist object of the array by adding Member3 and Member4. .EXAMPLE @@ -79,7 +84,7 @@ Function Update-FirstObjectProperties { $Union = @() $Input | ForEach-Object { If ($Union.Count) { - $_ | Get-Member | Where {-not ($Union[0] | Get-Member $_.Name)} | ForEach-Object { + $_ | Get-Member | Where-Object {-not ($Union[0] | Get-Member $_.Name)} | ForEach-Object { $Union[0] | Add-Member -MemberType NoteProperty -Name $_.Name -Value $Null } } diff --git a/__tests__/Compare-WorkSheet.tests.ps1 b/__tests__/Compare-WorkSheet.tests.ps1 index ff44c7c..b1c52f4 100644 --- a/__tests__/Compare-WorkSheet.tests.ps1 +++ b/__tests__/Compare-WorkSheet.tests.ps1 @@ -114,7 +114,7 @@ Describe "Compare Worksheet" { Context "More complex comparison: output check and different worksheet names " { BeforeAll { - [System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property RequiredServices, CanPauseAndContinue, CanShutdown, CanStop, + [System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property RequiredServices, CanPauseAndContinue, CanShutdown, CanStop, DisplayName, DependentServices, MachineName, ServiceName, ServicesDependedOn, ServiceHandle, Status, ServiceType, StartType -ExcludeProperty Name $s | Export-Excel -Path $env:temp\server1.xlsx -WorkSheetname Server1 #$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 @@ -328,7 +328,7 @@ Describe "Merge Multiple sheets" { $ws.Cells[12,9 ].Value | Should be $ws.Cells[12,5].Value $ws.Cells[12,10].Value | Should be $ws.Cells[12,6].Value } - it "Creared Conditional formatting rules " { + it "Created Conditional formatting rules " { $cf=$ws.ConditionalFormatting $cf.Count | Should be 17 $cf[16].Address.Address | Should be 'B2:B1048576' diff --git a/__tests__/Join-Worksheet.tests.ps1 b/__tests__/Join-Worksheet.tests.ps1 index 43ff7ed..dd5cd6d 100644 --- a/__tests__/Join-Worksheet.tests.ps1 +++ b/__tests__/Join-Worksheet.tests.ps1 @@ -91,9 +91,9 @@ Describe "Join Worksheet part 1" { } $path = "$env:TEMP\Test.xlsx" Remove-item -Path $path -ErrorAction SilentlyContinue -IF ($PSVersionTable.PSVersion.Major -gt 5) {Write-warning -message "Part 2 Does not run on V6"; return} +#switched from WMI to CIM objects so test runs on V6 Describe "Join Worksheet part 2" { - Get-WmiObject -Class win32_logicaldisk | + Get-CimInstance -ClassName win32_logicaldisk | Select-Object -Property DeviceId,VolumeName, Size,Freespace | Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000" Get-NetAdapter | @@ -122,6 +122,6 @@ Describe "Join Worksheet part 2" { $ws.Cells["A$NextRow"].Value | Should be $excel.Workbook.Worksheets[2].Cells["A2"].value $ws.Cells["B$NextRow"].Value | Should be $excel.Workbook.Worksheets[2].Cells["B2"].value } - } -} + } +} diff --git a/compare-worksheet.ps1 b/compare-worksheet.ps1 index 946e133..fb8edf6 100644 --- a/compare-worksheet.ps1 +++ b/compare-worksheet.ps1 @@ -69,6 +69,8 @@ Only the unchanged rows are highlighted. #> [cmdletbinding(DefaultParameterSetName)] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '', Justification="Write host used for sub-warning level message to operator which does not form output")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification="False positives when initializing variable in begin block")] Param( #First file to compare. [parameter(Mandatory=$true,Position=0)] @@ -219,11 +221,9 @@ } elseif ($diff -and $FontColor) {Write-Warning -Message "To match rows to set changed cells, you must specify -Key and it must match one of the included properties." } - #if nothing was found write a message which wont be redirected + #if nothing was found write a message which will not be redirected if (-not $diff) {Write-Host "Comparison of $Referencefile::$worksheet1 and $Differencefile::$WorkSheet2 returned no results." } - - if ($Show) { Start-Process -FilePath $Referencefile if (-not $oneFile) { Start-Process -FilePath $Differencefile } diff --git a/plot.ps1 b/plot.ps1 index 52935d1..4a54ea1 100644 --- a/plot.ps1 +++ b/plot.ps1 @@ -1,6 +1,8 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification="False positives")] +param() class PSPlot { hidden $path - hidden $pkg + hidden $pkg hidden $ws hidden $chart @@ -11,62 +13,62 @@ class PSPlot { } [PSPlot] Plot($yValues) { - + $this.NewChart() - + $xValues = 0..$yValues.Count $xCol = 'A' $yCol = 'B' - $this.AddDataToSheet($xCol,$yCol,'x','y',$xValues,$yValues) + $this.AddDataToSheet($xCol,$yCol,'x','y',$xValues,$yValues) $this.AddSeries($xCol,$yCol,$yValues) $this.SetChartPosition($yCol) - + return $this } [PSPlot] Plot($yValues,[string]$options) { $this.NewChart() - + $xValues = 0..$yValues.Count $xCol = 'A' $yCol = 'B' - $this.AddDataToSheet($xCol,$yCol,'x','y',$xValues,$yValues) + $this.AddDataToSheet($xCol,$yCol,'x','y',$xValues,$yValues) $this.AddSeries($xCol,$yCol,$yValues) - $this.SetMarkerInfo($options) + $this.SetMarkerInfo($options) $this.SetChartPosition($yCol) return $this } [PSPlot] Plot($xValues,$yValues) { - - $this.NewChart() + + $this.NewChart() $xCol = 'A' $yCol = 'B' - $this.AddDataToSheet($xCol,$yCol,'x','y',$xValues,$yValues) + $this.AddDataToSheet($xCol,$yCol,'x','y',$xValues,$yValues) $this.AddSeries($xCol,$yCol,$yValues) $this.SetChartPosition($yCol) return $this } - + [PSPlot] Plot($xValues,$yValues,[string]$options) { - $this.NewChart() + $this.NewChart() $xCol = 'A' $yCol = 'B' - $this.AddDataToSheet($xCol,$yCol,'x','y',$xValues,$yValues) + $this.AddDataToSheet($xCol,$yCol,'x','y',$xValues,$yValues) $this.AddSeries($xCol,$yCol,$yValues) - + $this.SetMarkerInfo($options) $this.SetChartPosition($yCol) @@ -75,19 +77,19 @@ class PSPlot { } [PSPlot] Plot($xValues,$yValues,$x1Values,$y1Values) { - - $this.NewChart() + + $this.NewChart() $xCol = 'A' $yCol = 'B' - $this.AddDataToSheet($xCol,$yCol,'x','y',$xValues,$yValues) + $this.AddDataToSheet($xCol,$yCol,'x','y',$xValues,$yValues) $this.AddSeries($xCol,$yCol,$yValues) $xCol=$this.GetNextColumnName($yCol) $yCol=$this.GetNextColumnName($xCol) - $this.AddDataToSheet($xCol,$yCol,'x1','y1',$x1Values,$y1Values) + $this.AddDataToSheet($xCol,$yCol,'x1','y1',$x1Values,$y1Values) $this.AddSeries($xCol,$yCol,$y1Values) $this.SetChartPosition($yCol) @@ -96,32 +98,32 @@ class PSPlot { } [PSPlot] Plot($xValues,$yValues,$x1Values,$y1Values,$x2Values,$y2Values) { - - $this.NewChart() + + $this.NewChart() $xCol = 'A' $yCol = 'B' - $this.AddDataToSheet($xCol,$yCol,'x','y',$xValues,$yValues) + $this.AddDataToSheet($xCol,$yCol,'x','y',$xValues,$yValues) $this.AddSeries($xCol,$yCol,$yValues) $xCol=$this.GetNextColumnName($yCol) $yCol=$this.GetNextColumnName($xCol) - $this.AddDataToSheet($xCol,$yCol,'x1','y1',$x1Values,$y1Values) + $this.AddDataToSheet($xCol,$yCol,'x1','y1',$x1Values,$y1Values) $this.AddSeries($xCol,$yCol,$y1Values) $xCol=$this.GetNextColumnName($yCol) $yCol=$this.GetNextColumnName($xCol) - $this.AddDataToSheet($xCol,$yCol,'x2','y2',$x2Values,$y2Values) + $this.AddDataToSheet($xCol,$yCol,'x2','y2',$x2Values,$y2Values) $this.AddSeries($xCol,$yCol,$y2Values) $this.SetChartPosition($yCol) return $this } - + [PSPLot] SetChartPosition($yCol) { $columnNumber = $this.GetColumnNumber($yCol)+1 $this.chart.SetPosition(1,0,$columnNumber,0) @@ -131,29 +133,29 @@ class PSPlot { AddSeries($xCol,$yCol,$yValues) { $yRange = "{0}2:{0}{1}" -f $yCol,($yValues.Count+1) - $xRange = "{0}2:{0}{1}" -f $xCol,($yValues.Count+1) - $Series=$this.chart.Series.Add($yRange,$xRange) + $xRange = "{0}2:{0}{1}" -f $xCol,($yValues.Count+1) + $Series=$this.chart.Series.Add($yRange,$xRange) } hidden SetMarkerInfo([string]$options) { $c=$options.Substring(0,1) $m=$options.Substring(1) - + $cmap=@{r='red';g='green';b='blue';i='indigo';v='violet';c='cyan'} $mmap=@{Ci='Circle';Da='Dash';di='diamond';do='dot';pl='plus';sq='square';tr='triangle'} - + $this.chart.Series[0].Marker = $mmap.$m $this.chart.Series[0].MarkerColor = $cmap.$c $this.chart.Series[0].MarkerLineColor = $cmap.$c } hidden [string]GetNextColumnName($columnName) { - return $this.GetColumnName($this.GetColumnNumber($columnName)+1) + return $this.GetColumnName($this.GetColumnNumber($columnName)+1) } hidden [int]GetColumnNumber($columnName) { $sum=0 - + $columnName.ToCharArray() | ForEach-Object { $sum*=26 @@ -179,20 +181,20 @@ class PSPlot { $count=$yValues.Count $this.ws.Cells["$($xColumn)1"].Value=$xHeader $this.ws.Cells["$($yColumn)1"].Value=$yHeader - - for ($idx= 0; $idx-lt $count; $idx++) { - $row=$idx+2 + + for ($idx= 0; $idx-lt $count; $idx++) { + $row=$idx+2 $this.ws.Cells["$($xColumn)$($row)"].Value=$xValues[$idx] $this.ws.Cells["$($yColumn)$($row)"].Value=$yValues[$idx] } } - hidden NewChart() { + hidden NewChart() { $chartType="XYScatter" #$chartType="line" $this.chart=$this.ws.Drawings.AddChart("plot", $chartType) $this.chart.Title.Text = 'Plot' - $this.chart.Legend.Remove() + $this.chart.Legend.Remove() $this.SetChartSize(300,300) }