/ / Ako vynútiť návrat typu údajov pri dotazovaní na program Excel z funkcie Powershell? - excel, powershell, oledb

Ako vynútiť vrátenie dátového typu pri dotazovaní na Excel z Powershell? - excel, powershell, oledb

Používam Powershell na dotaz tabuľky programu Excel pomocou pripojenia OLEDB. Mám v ňom jeden stĺpec s viacerými hodnotami. Všimol som si, že keď 1 z našich 4 článkov obsahuje písmená, dotaz sa vráti a NULL a dátový typ bude a System.DBNull, Pozri nižšie:

Tabuľka programu Excel 1

Výstup skriptov:

PS D:temp> D:WCC_PowershellExcelTypeTest.ps1 test.xls
Ticket Number: 1 | Type: System.Double
Ticket Number: 2 | Type: System.Double
Ticket Number:  | Type: System.DBNull
Ticket Number: 4 | Type: System.Double

Avšak ak 2 zo 4 buniek obsahujú písmená, všetky bunkové dátové typy sa vrátia ako String, Príklad:

Tabuľka programu Excel 2

Výstup skriptov:

PS D:temp> D:WCC_PowershellExcelTypeTest.ps1 test.xls
Ticket Number: 1 | Type: System.String
Ticket Number: ZZZZ | Type: System.String
Ticket Number: AAAA | Type: System.String
Ticket Number: 4 | Type: System.String

Existuje spôsob, akým sa pri dotazovaní z Powershell vynuti typ návratu stĺpca programu Excel? Môj skript musí vedieť, či 1) tam sú dáta tam (nevráti NULL) a 2) poznať typ dát

Tu je skript Im, ktorý používa na analýzu dokumentu programu Excel:

########################################################################################################
# This function will test if a string value is numeric
# Parameters:
#   $value   - String to test
########################################################################################################
function IsNumeric($value) {
return ($($value.Trim()) -match "^[-]?[0-9.]+$")
}

########################################################################################################
# This filter will test if a string value is numeric
# Parameters:
#   $value   - String to test
########################################################################################################
filter isNumeric2() {
return $_ -is [byte]  -or $_ -is [int16]  -or $_ -is [int32]  -or $_ -is [int64]  `
-or $_ -is [sbyte] -or $_ -is [uint16] -or $_ -is [uint32] -or $_ -is [uint64] `
-or $_ -is [float] -or $_ -is [double] -or $_ -is [decimal]
}

# Directory location where we have our excel files
########################################################################################################
$excelFN = "$args"
$ExcelFile = "D:Temp$excelFN"
$Sheetname = "Interface$"

########################################################################################################
$OleDbConn = New-Object “System.Data.OleDb.OleDbConnection”
$OleDbCmd = New-Object “System.Data.OleDb.OleDbCommand”
$OleDbAdapter = New-Object “System.Data.OleDb.OleDbDataAdapter”
$DataTable = New-Object “System.Data.DataTable”
$OleDbConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$ExcelFile`";Extended Properties=`"Excel 12.0 Xml;HDR=YES`";"
$OleDbConn.Open()
$OleDbCmd.Connection = $OleDbConn
$OleDbCmd.commandtext = “Select * from [$Sheetname]”
$OleDbAdapter.SelectCommand = $OleDbCmd
########################################################################################################

$RowsReturned = $OleDbAdapter.Fill($DataTable)
$intRow = 1
ForEach ($DataRec in $DataTable) {

# Reading the first column of the current row
$TicketNumber = $DataRec."ticket number"

write-host "Ticket Number:" $TicketNumber "| Type:" $TicketNumber.GetType()

$intRow++
}

$OleDbConn.Close()

odpovede:

1 pre odpoveď č. 1

Podľa tohto Článok KB (zvýraznenie):

Upozornenie na typy zmiešaných údajov

Ako už bolo uvedené, ADO musí odhadnúť údajetypu pre každý stĺpec v pracovnom hárku alebo rozsahu programu Excel. (Táto bunka nie je ovplyvnená nastavenia formátovania.) Ak máte číselnú hodnotu, môže dôjsť k vážnemu problému hodnoty zmiešané s textovými hodnotami v rovnakom stĺpci. Jet aj Poskytovateľ ODBC vrátiť údaje väčšinového typu, ale vrátiť hodnotu NULL (prázdne) hodnoty pre menšinový typ údajov. Ak sú dva typy rovnako zmiešané v stĺpci, poskytovateľ si vyberie číselný text.

Voľba "Bezpečné" je považovať všetky polia za text, a to pridaním IMEX=1 možnosť pripojenia reťazec:

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$ExcelFile`";Extended Properties=`"Excel 12.0 Xml;HDR=YES;IMEX=1`";"

a potom konvertovať číselné hodnoty vo vašom skripte PowerShell, a to buď pomocou explicitných odliatkov, ako napríklad:

[int]$value
# or
$value -as [int]

Mäkký nátlak s unárnym operátorom, ako napríklad:

+$value

alebo pomocou statického parsovania takto:

[int]::Parse($value)
# or
$numericValue = 0
[int]::TryParse($value,[ref]$numericValue)