diff --git a/Public/Import-Excel.ps1 b/Public/Import-Excel.ps1 index 5fe1234..ba7d2b5 100644 --- a/Public/Import-Excel.ps1 +++ b/Public/Import-Excel.ps1 @@ -50,9 +50,9 @@ } function Get-PropertyNames { <# - .SYNOPSIS - Create objects containing the column number and the column name for each of the different header types. - #> + .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)] @@ -82,9 +82,10 @@ throw 'The top row can never be less than 1 when we need to retrieve headers from the worksheet.' ; return } - foreach ($C in $Columns) { - #allow "False" or "0" to be column headings - $Worksheet.Cells[$StartRow, $C] | Where-Object {-not [string]::IsNullOrEmpty($_.Value) } | Select-Object @{N = 'Column'; E = { $C } }, Value + foreach ($C in $Columns) { + #allow "False" or "0" to be column headings + $Worksheet.Cells[$StartRow, $C] | Where-Object {-not [string]::IsNullOrEmpty($_.Value) } | Select-Object @{N = 'Column'; E = { $C } }, Value + } } } catch { @@ -166,25 +167,39 @@ } else { #region Create one object per row - if ($AsText) { + if ($AsText -or $AsDate) { <#join items in AsText together with ~~~ . Escape any regex special characters... - # which turns "*" into "\*" make it ".*". Convert ~~~ to $|^ and top and tail with ^%; - So if we get "Week", "[Time]" and "*date*" ; make the expression ^week$|^\[Time\]$|^.*Date.*$ - $make a regex for this which is case insensitive (option 1) and compiled (option 8) - #> - $TextColExpression = "^" + [regex]::Escape($AsText -join "~~~").replace("\*", ".*").replace("~~~", "$|^") + "$" + # which turns "*" into "\*" make it ".*". Convert ~~~ to $|^ and top and tail with ^%; + So if we get "Week", "[Time]" and "*date*" ; make the expression ^week$|^\[Time\]$|^.*Date.*$ + $make a regex for this which is case insensitive (option 1) and compiled (option 8) + #> + $TextColExpression = '' + if ($AsText) { + $TextColExpression += '(?^' + [regex]::Escape($AsText -join '~~~').replace('\*', '.*').replace('~~~', '$|^') + '$)' + } + if ($AsText -and $AsDate) { + $TextColExpression += "|" + } + if ($AsDate) { + $TextColExpression += '(?^' + [regex]::Escape($AsDate -join '~~~').replace('\*', '.*').replace('~~~', '$|^') + '$)' + } $TextColRegEx = New-Object -TypeName regex -ArgumentList $TextColExpression , 9 } + else {$TextColRegEx = $null} foreach ($R in $Rows) { #Disabled write-verbose for speed # Write-Verbose "Import row '$R'" $NewRow = [Ordered]@{ } if ($TextColRegEx) { foreach ($P in $PropertyNames) { - if ($TextColRegEx.IsMatch($P.Value)) { - $NewRow[$P.Value] = $Worksheet.Cells[$R, $P.Column].Text + $MatchTest = $TextColRegEx.Match($P.value) + if ($MatchTest.groups.name -eq "astext") { + $NewRow[$P.Value] = $Worksheet.Cells[$R, $P.Column].Text } - else { $NewRow[$P.Value] = $Worksheet.Cells[$R, $P.Column].Value } + elseif ($MatchTest.groups.name -eq "asdate" -and $Worksheet.Cells[$R, $P.Column].Value -is [System.ValueType]) { + $NewRow[$P.Value] = [datetime]::FromOADate(($Worksheet.Cells[$R, $P.Column].Value)) + } + else { $NewRow[$P.Value] = $Worksheet.Cells[$R, $P.Column].Value } } } else {