From 23a2ac394fcb27261b5a24f55828f44077c344e6 Mon Sep 17 00:00:00 2001 From: dfinke Date: Tue, 14 Sep 2021 15:44:32 -0400 Subject: [PATCH] Add try/catch, warning, and tests --- Public/Open-ExcelPackage.ps1 | 27 +++++++++------- __tests__/Open-ExcelPackage.tests.ps1 | 39 +++++++++++++++++++++++ __tests__/UnsupportedWorkSheetNames.xlsx | Bin 0 -> 21137 bytes 3 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 __tests__/Open-ExcelPackage.tests.ps1 create mode 100644 __tests__/UnsupportedWorkSheetNames.xlsx diff --git a/Public/Open-ExcelPackage.ps1 b/Public/Open-ExcelPackage.ps1 index a645e07..7c0d077 100644 --- a/Public/Open-ExcelPackage.ps1 +++ b/Public/Open-ExcelPackage.ps1 @@ -1,10 +1,10 @@ -function Open-ExcelPackage { +function Open-ExcelPackage { [CmdLetBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword","")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")] [OutputType([OfficeOpenXml.ExcelPackage])] param( #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. [switch]$KillExcel, #The password for a protected worksheet, as a [normal] string (not a secure string). @@ -13,7 +13,7 @@ [switch]$Create ) - if($KillExcel) { + if ($KillExcel) { Get-Process -Name "excel" -ErrorAction Ignore | Stop-Process while (Get-Process -Name "excel" -ErrorAction Ignore) {} } @@ -24,21 +24,26 @@ #Create the directory if required. $targetPath = Split-Path -Parent -Path $Path if (!(Test-Path -Path $targetPath)) { - Write-Debug "Base path $($targetPath) does not exist, creating" - $null = New-item -ItemType Directory -Path $targetPath -ErrorAction Ignore + Write-Debug "Base path $($targetPath) does not exist, creating" + $null = New-item -ItemType Directory -Path $targetPath -ErrorAction Ignore } 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 ($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 + try { + Add-Member -InputObject $pkgobj -MemberType ScriptProperty -Name $w.name -Value $sb -ErrorAction Stop + } + catch { + Write-Warning "Could not add sheet $($w.name) as 'short cut', you need to access it via `$wb.Worksheets['$($w.name)'] " + } } return $pkgobj } } - else {Write-Warning "Could not find $path" } - } + else { Write-Warning "Could not find $path" } +} diff --git a/__tests__/Open-ExcelPackage.tests.ps1 b/__tests__/Open-ExcelPackage.tests.ps1 new file mode 100644 index 0000000..1056bcb --- /dev/null +++ b/__tests__/Open-ExcelPackage.tests.ps1 @@ -0,0 +1,39 @@ +#Requires -Modules Pester + +if (-not (Get-command Import-Excel -ErrorAction SilentlyContinue)) { + Import-Module $PSScriptRoot\..\ImportExcel.psd1 +} + +<# +Methods +------- +Dispose +Equals +GetAsByteArray +GetHashCode +GetType +Load +Save +SaveAs +ToString + +Properties +---------- + +Compatibility +Compression +DoAdjustDrawings +Encryption +File +Package +Stream +Workbook +#> + +Describe "Test Open Excel Package" -Tag Open-ExcelPackage { + It "Should handle opening a workbook with Worksheet Names that will cause errors" { + $xlFilename = "$PSScriptRoot\UnsupportedWorkSheetNames.xlsx" + + { Open-ExcelPackage -Path $xlFilename -ErrorAction Stop } | Should -Not -Throw + } +} \ No newline at end of file diff --git a/__tests__/UnsupportedWorkSheetNames.xlsx b/__tests__/UnsupportedWorkSheetNames.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b27620b1396804566798d9937c5c536ce50290e9 GIT binary patch literal 21137 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 literal 0 HcmV?d00001