From 62c8d74a59cf721685e95171b6b1adf4a95e958a Mon Sep 17 00:00:00 2001 From: muschebubusche <65829739+muschebubusche@users.noreply.github.com> Date: Tue, 26 Oct 2021 19:01:25 +0200 Subject: [PATCH] Add selective column import --- Public/Import-Excel.ps1 | 60 ++++++- __tests__/ImportExcelHeaderName.tests.ps1 | 180 +++++++++++++++++--- __tests__/testImportExcel.xlsx | Bin 0 -> 2635 bytes __tests__/testImportExcelHeaderOnly.xlsx | Bin 0 -> 2579 bytes __tests__/testImportExcelImportColumns.xlsx | Bin 0 -> 2655 bytes __tests__/testImportExcelSparse.xlsx | Bin 0 -> 2666 bytes 6 files changed, 218 insertions(+), 22 deletions(-) create mode 100644 __tests__/testImportExcel.xlsx create mode 100644 __tests__/testImportExcelHeaderOnly.xlsx create mode 100644 __tests__/testImportExcelImportColumns.xlsx create mode 100644 __tests__/testImportExcelSparse.xlsx diff --git a/Public/Import-Excel.ps1 b/Public/Import-Excel.ps1 index f020979..6e4b3bf 100644 --- a/Public/Import-Excel.ps1 +++ b/Public/Import-Excel.ps1 @@ -35,7 +35,8 @@ [string[]]$AsText, [string[]]$AsDate, [ValidateNotNullOrEmpty()] - [String]$Password + [String]$Password, + [Int[]]$ImportColumns ) end { $sw = [System.Diagnostics.Stopwatch]::StartNew() @@ -92,6 +93,26 @@ throw "Failed creating property names: $_" ; return } } + function Clear-ExcelPackage { + <# + .SYNOPSIS + Clear given ExcelPackage from specified columns. + #> + param ( + # Column from where the cleaning will start. + [Parameter(Mandatory)] + [Int] + $Start, + # Count of columns that will be removed. + [Parameter(Mandatory)] + [Int] + $Count + ) + + $Worksheet.DeleteColumn($Start, $Count) + # Return $ExcelPackage to update the variable + return $ExcelPackage + } foreach ($Path in $Paths) { if ($path) { $extension = [System.IO.Path]::GetExtension($Path) @@ -141,7 +162,42 @@ $columns = ($StartColumn..$EndColumn).Where( { $colHash[$_] }) } else { - $Columns = $StartColumn .. $EndColumn ; if ($StartColumn -gt $EndColumn) { Write-Warning -Message "Selecting columns $StartColumn to $EndColumn might give odd results." } + if ($ImportColumns) { + $end = $Worksheet.Dimension.End.Column + if (($StartColumn -ne 1) -or ($EndColumn -ne $end)) { Write-Warning -Message "If ImportColumns is set than individual StartColumn and EndColumn will be ignored." } + # Variable to store all removed columns + $removedColumns = 0 + # Preparation run + $start = 1 + $count = $ImportColumns[0] - 1 + $ExcelPackage = Clear-ExcelPackage -Start $start -Count $count + $removedColumns = $removedColumns + $count + for ($i = 0; $i -lt $ImportColumns.Count; $i++) { + # Check if the current iteration is the last one for cleanup meassures + if ($i -eq ($ImportColumns.Count - 1)) { $lastLoop = $true } + if ($lastLoop) { + # Only clean up if the endcolumn does not match the last entry in the $ImportColumns array + if ($ImportColumns[$i] -ne $end) { + $start = $ImportColumns.Count + 1 + $count = $end - ($removedColumns + $ImportColumns.Count) + } else { + # This means that the endcolumn gets imported + continue + } + } else { + # Calculate the StartColumn and ColumnCount for the removal + $start = ($i + 1) + 1 # 1 is from the preparation run + $count = $ImportColumns[$i + 1] - ($removedColumns + $start) + $removedColumns = $removedColumns + $count + } + $ExcelPackage = Clear-ExcelPackage -Start $start -Count $count + } + # Create new array out of the $ImportColumns.Count for the further processing + $columns = 1..$ImportColumns.Count + } + else { + $Columns = $StartColumn .. $EndColumn ; if ($StartColumn -gt $EndColumn) { Write-Warning -Message "Selecting columns $StartColumn to $EndColumn might give odd results." } + } if ($NoHeader) { $rows = $StartRow..$EndRow ; if ($StartRow -gt $EndRow) { Write-Warning -Message "Selecting rows $StartRow to $EndRow might give odd results." } } elseif ($HeaderName) { $rows = $StartRow..$EndRow } else { diff --git a/__tests__/ImportExcelHeaderName.tests.ps1 b/__tests__/ImportExcelHeaderName.tests.ps1 index 0594a88..85ae5a5 100644 --- a/__tests__/ImportExcelHeaderName.tests.ps1 +++ b/__tests__/ImportExcelHeaderName.tests.ps1 @@ -1,33 +1,66 @@ +#Requires -Modules Pester + +if (-not (Get-command Import-Excel -ErrorAction SilentlyContinue)) { + Import-Module $PSScriptRoot\..\ImportExcel.psd1 +} Describe "Import-Excel on a sheet with no headings" { BeforeAll { - $xlfile = "TestDrive:\testImportExcel.xlsx" - $xlfileHeaderOnly = "TestDrive:\testImportExcelHeaderOnly.xlsx" - $xl = "" | Export-excel $xlfile -PassThru + $xlfile = "$PSScriptRoot\testImportExcel.xlsx" + $xlfileHeaderOnly = "$PSScriptRoot\testImportExcelHeaderOnly.xlsx" + $xlfileImportColumns = "$PSScriptRoot\testImportExcelImportColumns.xlsx" - Set-ExcelRange -Worksheet $xl.Sheet1 -Range A1 -Value 'A' - Set-ExcelRange -Worksheet $xl.Sheet1 -Range B1 -Value 'B' - Set-ExcelRange -Worksheet $xl.Sheet1 -Range C1 -Value 'C' + # Create $xlfile if it does not exist + if (!(Test-Path -Path $xlfile)) { + $xl = "" | Export-excel $xlfile -PassThru - Set-ExcelRange -Worksheet $xl.Sheet1 -Range A2 -Value 'D' - Set-ExcelRange -Worksheet $xl.Sheet1 -Range B2 -Value 'E' - Set-ExcelRange -Worksheet $xl.Sheet1 -Range C2 -Value 'F' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range A1 -Value 'A' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range B1 -Value 'B' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range C1 -Value 'C' + + Set-ExcelRange -Worksheet $xl.Sheet1 -Range A2 -Value 'D' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range B2 -Value 'E' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range C2 -Value 'F' + + Set-ExcelRange -Worksheet $xl.Sheet1 -Range A3 -Value 'G' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range B3 -Value 'H' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range C3 -Value 'I' + + Close-ExcelPackage $xl + } - Set-ExcelRange -Worksheet $xl.Sheet1 -Range A3 -Value 'G' - Set-ExcelRange -Worksheet $xl.Sheet1 -Range B3 -Value 'H' - Set-ExcelRange -Worksheet $xl.Sheet1 -Range C3 -Value 'I' + # Create $xlfileHeaderOnly if it does not exist + if (!(Test-Path -Path $xlfileHeaderOnly)) { + $xl = "" | Export-excel $xlfileHeaderOnly -PassThru - Close-ExcelPackage $xl + Set-ExcelRange -Worksheet $xl.Sheet1 -Range A1 -Value 'A' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range B1 -Value 'B' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range C1 -Value 'C' - # crate $xlfileHeaderOnly - $xl = "" | Export-excel $xlfileHeaderOnly -PassThru + Close-ExcelPackage $xl + } - Set-ExcelRange -Worksheet $xl.Sheet1 -Range A1 -Value 'A' - Set-ExcelRange -Worksheet $xl.Sheet1 -Range B1 -Value 'B' - Set-ExcelRange -Worksheet $xl.Sheet1 -Range C1 -Value 'C' + # Create $xlfileImportColumns if it does not exist + if (!(Test-Path -Path $xlfileImportColumns)) { + $xl = "" | Export-Excel $xlfileImportColumns -PassThru - Close-ExcelPackage $xl + Set-ExcelRange -Worksheet $xl.Sheet1 -Range A1 -Value 'A' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range B1 -Value 'B' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range C1 -Value 'C' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range D1 -Value 'D' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range E1 -Value 'E' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range F1 -Value 'F' + + Set-ExcelRange -Worksheet $xl.Sheet1 -Range A2 -Value '1' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range B2 -Value '2' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range C2 -Value '3' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range D2 -Value '4' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range E2 -Value '5' + Set-ExcelRange -Worksheet $xl.Sheet1 -Range F2 -Value '6' + + Close-ExcelPackage $xl + } } It "Import-Excel should have this shape" { @@ -167,7 +200,7 @@ Describe "Import-Excel on a sheet with no headings" { } It "Should" { - $xlfile = "TestDrive:\testImportExcelSparse.xlsx" + $xlfile = "$PSScriptRoot\testImportExcelSparse.xlsx" $xl = "" | Export-excel $xlfile -PassThru Set-ExcelRange -Worksheet $xl.Sheet1 -Range A1 -Value 'Chuck' @@ -224,4 +257,111 @@ Describe "Import-Excel on a sheet with no headings" { $actual[0].P2 | Should -Be 'B' $actual[0].P3 | Should -Be 'C' } + + It "Should import correct data if -ImportColumns is used with the first column" { + $actual = @(Import-Excel $xlfileImportColumns -ImportColumns @(1,2,4,5)) + $actualNames = $actual[0].psobject.properties.Name + + $actualNames.Count | Should -Be 4 + $actualNames[0] | Should -Be 'A' + $actualNames[2] | Should -Be 'D' + + $actual.Count | Should -Be 1 + $actual[0].A | Should -Be 1 + $actual[0].B | Should -Be 2 + $actual[0].D | Should -Be 4 + $actual[0].E | Should -Be 5 + } + + It "Should import correct data if -ImportColumns is used with the first column" { + $actual = @(Import-Excel $xlfileImportColumns -ImportColumns @(1,3,4,5)) + $actualNames = $actual[0].psobject.properties.Name + + $actualNames.Count | Should -Be 4 + $actualNames[0] | Should -Be 'A' + $actualNames[2] | Should -Be 'D' + + $actual.Count | Should -Be 1 + $actual[0].A | Should -Be 1 + $actual[0].C | Should -Be 3 + $actual[0].D | Should -Be 4 + $actual[0].E | Should -Be 5 + } + + It "Should import correct data if -ImportColumns is used without the first column" { + $actual = @(Import-Excel $xlfileImportColumns -ImportColumns @(2,3,6)) + $actualNames = $actual[0].psobject.properties.Name + + $actualNames.Count | Should -Be 3 + $actualNames[0] | Should -Be 'B' + $actualNames[2] | Should -Be 'F' + + $actual.Count | Should -Be 1 + $actual[0].B | Should -Be 2 + $actual[0].C | Should -Be 3 + $actual[0].F | Should -Be 6 + } + + It "Should import correct data if -ImportColumns is used without the first column" { + $actual = @(Import-Excel $xlfileImportColumns -ImportColumns @(2,5,6)) + $actualNames = $actual[0].psobject.properties.Name + + $actualNames.Count | Should -Be 3 + $actualNames[0] | Should -Be 'B' + $actualNames[2] | Should -Be 'F' + + $actual.Count | Should -Be 1 + $actual[0].B | Should -Be 2 + $actual[0].E | Should -Be 5 + $actual[0].F | Should -Be 6 + } + + It "Should import correct data if -ImportColumns is used with only 1 column" { + $actual = @(Import-Excel $xlfile -ImportColumns @(2)) + $actualNames = $actual[0].psobject.properties.Name + + $actualNames.Count | Should -Be 1 + $actualNames[0] | Should -Be 'B' + + $actual.Count | Should -Be 2 + $actual[0].B | Should -Be 'E' + } + + It "Should import correct data if -ImportColumns is used with only 1 column which is also the last" { + $actual = @(Import-Excel $xlfile -ImportColumns @(3)) + $actualNames = $actual[0].psobject.properties.Name + + $actualNames.Count | Should -Be 1 + $actualNames[0] | Should -Be 'C' + + $actual.Count | Should -Be 2 + $actual[1].C | Should -Be 'I' + } + + It "Should import correct data if -ImportColumns contains all columns" { + $actual = @(Import-Excel $xlfileImportColumns -ImportColumns @(1,2,3,4,5,6)) + $actualNames = $actual[0].psobject.properties.Name + + $actualNames.Count | Should -Be 6 + $actualNames[0] | Should -Be 'A' + $actualNames[2] | Should -Be 'C' + + $actual.Count | Should -Be 1 + $actual[0].A | Should -Be 1 + $actual[0].B | Should -Be 2 + $actual[0].C | Should -Be 3 + $actual[0].D | Should -Be 4 + $actual[0].E | Should -Be 5 + $actual[0].F | Should -Be 6 + } + + It "Should ignore -StartColumn and -EndColumn if -ImportColumns is set aswell" { + $actual = @(Import-Excel $xlfileImportColumns -ImportColumns @(5) -StartColumn 2 -EndColumn 7) + $actualNames = $actual[0].psobject.properties.Name + + $actualNames.Count | Should -Be 1 + $actualNames[0] | Should -Be 'E' + + $actual[0].E | Should -Be '5' + } } \ No newline at end of file diff --git a/__tests__/testImportExcel.xlsx b/__tests__/testImportExcel.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9f975792e091fbdb8d502ecaaa9baf3ae7a7bc94 GIT binary patch literal 2635 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 literal 0 HcmV?d00001 diff --git a/__tests__/testImportExcelImportColumns.xlsx b/__tests__/testImportExcelImportColumns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..be83bff2147a392d257522da6bedeb04168e0b07 GIT binary patch literal 2655 zcmZ`*2{csuA0G{4muxYFMx_WdnJ7;p$}(P!u|4Z#7~90yvP>_LG9iR4*|YS7B$<>p z!&v5-p2(6VO@uLpqD+!{cl1Ah!+Y<0&$+*I&$-{%%r65H0xrXwp0;l- zZrzsW1A%nGAdoZ&1adJY28Q7S!?1QyLHJNN?Z|*rl=LnuFha5oi>KS?)+?Kp4J%hF z+t(U3 z)C`wyNmDoz*W{p-Mhih;RirVt-e5|J&+!PWwApSjJqIpRo-_!~CX80_lSCEm23|}j z_aNYq!Vk>tatmkPpPahylsp%AT2pnW&;B4Prqvp`nG8$0+Tyn25valtX1oeR5Az2=Nz zj(kI%|5iSE7<;MVn?`yiKHNldtkl%N9HEhYd3Jkg)P!r+H$!SyJWyqRxFX;ZQd@wmJsZ8GGHnOpw4oGSoRMwAaj!lHXAhBMa`e zk7~7S3zPav7041(fEa0@pjqC!YDYz{R3vOPASUKZ#Eb*AwHC>u}`N+IwI>KRGbDHjHG5?@aFTMNbRsB|K z%9hFcA6~6#HlKrytw*2PxDSHdY-*s+Ae1#;vN^tSUme( znSVeJJjzkXzSR0h=8L(#jJG4&Ee%1c`+rIF9~@Z$aXH~dzMhj2n7Af z$xropnOSwht+XyKJ!EVv>&b!Xlb3B8vJouGIc4LQR!X@q+j@p3W(ax?nBAV_!V6xX zR*b4Az7mvr6ZUZs^1hW&839E%6$3DNrTvBGZaFatvV2FAnb^C&5ER(T$>X)U!^JHx zW42lno$r1|!WYF2)se@G9hg_mtTy;8D}&(~m035LwK?Jr)mE%{OFIlP!P zTDqdNr=vjVY|2tcp@oP{s5y>lfLn3Ptwfu=&UP}y#N(lVV%>j@{`z#RNCi5F$QZWN zCKtLe+Mn+GIyqD&%4LU_gZ1pRJ23f70k`Z05=VZ`F`>SAd|0T?>VjCcPC6A62bYY; z?#y^7ZsI}^WZ7w!>bJ*ngiv%Dsa=*ybCXo_d0E#AQ_+u1t=QCa9GAuA1x@F3y|M?- z-@#Pn%sUwiS6EMBW^kmS*1q(bjEX*QA_`B-Ic5t@VnMNN~kSRbY|vtQFZbw`ifE zIbp}X#+?VGQf9nfd9>`gb5?Imu1GmU6=zctvje8moZ(Xm_FmgzlW3tO!+)`a_oHN z5j4caBkC{>QZHQI4RVgJ87~`1yu@18bb-#j!fa1@vu$+HzKMp0vQS%n6yj^^slHmM zUHYGB@(7hIC)!qGPYsNaRI;UNfg|Sh1q;rUP#fwL8NXP=}d!+2BV83o+>ylao7(Yk$=G3 z|0JclNtN;-DU86JKkfd$sg|GJd_`C>QZ?>iWc%J5b_t5Cqiv5VBa1nkbQUhzX%85d ztL{9m-#LEa`na-9&&hX{LqjsKSic2pj5h(U+d8L^`UAbIBx3A!f$ZFS;+MG1;^yK- z(Bsg*pbk)faU!%Ist3KNQ#*nEzB(;=k)ct1o3sFY|MepR0OzTH`7PPF0q>0B4&1eJ z0*K@pzZ)BQgPc3U*2)+-85;)L#%A7}<7WL@*#Y?mH2+8PZ`_CXm~vBbtwQ+!{}KPl z$c?-3nu>d**J@c{b(ggRzOj{88?NitDnsyR>qZZvQ34R|TY|vV3{XrK;y(Qi0?03t literal 0 HcmV?d00001 diff --git a/__tests__/testImportExcelSparse.xlsx b/__tests__/testImportExcelSparse.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..099cbf7a8c72f059fdd9559be3fc81252573df38 GIT binary patch literal 2666 zcmZ{m2|UyPAIHaBF>)nWQ=^oHO=EIP2j-Z$T9Ti!kYnYxB1c&WIVVMObj*=6$FF1= zk@a&%;V0%+Q3<)~x9R`*8~^|B{e3+4dF=7n`}5fQ`Fg$I?=Kn!r96HpS znBveWYy=y|HQ31}(R|@fa$*?k^T4WHH;W+Cq}fhjYX(fbAnrYo>^by^izpyt)7L#6 z-vx*9WPcgnCozBd(;t&H*!a1q0O;QRZt54Qm?ksCP7)*`wb60i*+-7PgFYs3{Jeh^ ziFjvf29fg!p`b%fZ0#L>0m1cQ;}6Vasmdo~PQrTR%Y(}8rm4~J@7!wo5vnCK!#$_y z151+C1#UF_Gp5zEjjG#4m66F zj~yR+3)qbQk8veTpo&bm0?gCN7w_e#s>1q=Z>I`H!azL3_E;i0g4YEU6$c-=@P%W- zj)$Wce}|timw?j=_F7q5?Jhqz5u@8liYN+)v_;&v&FA&x8tiYI zk8MbkNwdG`3Y9w@B*XO`UMDtbxS-i~E6M1N#-3$tGlJNdWs`?!Sqcdo{@EQ~+$ycy zfUE=bmI(bSd;F2-x*H}@%6rY~YnpNScb>d(JVW){XqG!&l>eF1@&t88kX0soFt_CX#6b?s}>A8f3%5lMX|p~rtNDww_) z`V-96rvV&Vk|N(|dYINdcbGmlsM1({aj&{|?1lG(>i`xL_R6<1iNGc2_A*%@H~|3Z z-%Nh1&rW8;3B^h6EIcHqrm1?(=|65-Rg>XURae0V?@VPg-!*sjkAL>mu)`d5A!T24 z{l2bOG``{~+Y_U<1ebKDNQ-mJILc`ON$an=p$8>ELL|wShU1`*Z+%ffQ>^m`MZ4=F z@4|PR5YALAARzW|tAncEba_(`zlUP|@`3rg1J-lr?{ZX|RbArw)~uehXr243)Ma2X zeJF2T_E1X}UueQ|OSUn;xZf$?`@gQpCb zsF1Q9=&xR=txWV63b5#~GuTQ;ul!`9KGQAQ%!wnp=@>tEJl@|=b>o0JJK`%T02@l_hV_{tCaW9 z$5{WIN&_kDt0PvNYK>=GT+AG-2X#BlMHe1f)N#RR49pW-Gn7lFx{DU{{sb{X&{*3( zhf-VS7~pzZ91G#Hy37gL*oI_!p1Da(v0i}O_eoB|9mK;$&rtA$35 z$*@FVN4-@98@I+KN2Ul2rbPvRi{R%U;)VBPk-v^XF7&q=&&P?_7SGnq zpmaF@yi8lAT!aY_We;+XEx%3+2EZ(_6a5jU42^#Dcu>aE^cCMc?@71X`je5AV`v^j z=Ma4wPvwq+PQaPylF|IW*c(%;PzUL`zcKp~M)nN7w{4)IrKeE4-K3&RE2-|vr~}CF zG)cJJ$@gf7SCgR1Do=$Tt?5o$@0Y^21`fverhUWx0(Dw#*Q8F2c%!cH-Nua%+&l}g z|K-?vCs1s4KB>ITtvGCBbgR786kv+DmZB zB2bd?n4Z)Q&c0{yrvogv<;a7VVV{Y9L7TSGG3h!jc$bOcdX{Fs; zkya)8SGll<#UfEsNW;YyX6;b~_Gv&Q%*8i5&2qyv1xLFcAl=k8FN^5=wj~zy9(2&g z#fI)ks4)lgg&+@j9r4a1w-p@yHNR99gI=-5t@6G^vaHEoC>q7Vsmv_*-`+`>9N6Oj zyrFErfPG!DcJF3jnOxa6@%BXanaZKCzi&@v*M?=n%}C_^ox0tUXcRXO>sP$Y M=Oq(yG9T;PKU+CKg#Z8m literal 0 HcmV?d00001