/ / Wie erzwinge ich die Rückgabe des Datentyps, wenn Powershell von Excel abgefragt wird? - Excel, Powershell, Oledb

Wie erzwinge Datentyp Rücksendung beim Abfragen von Excel aus Powershell? - Excel, Powershell, Oledb

Ich benutze Powershell eine Excel-Tabelle mit einer OLEDB-Verbindung abfragen. Ich habe eine Spalte mit mehreren Werten. Ich habe festgestellt, dass, wenn 1 unserer 4 Zellen Buchstaben enthält, die Abfrage a zurückgibt NULL und der Datentyp ist a System.DBNull. Siehe unten:

Excel-Tabelle 1

Skriptausgabe:

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

Wenn jedoch 2 der 4 Zellen Buchstaben enthalten, werden alle Zelldatentypen als zurückgegeben String. Beispiel:

Excel-Tabelle 2

Skriptausgabe:

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

Gibt es eine Möglichkeit, den Rückgabetyp einer Excel-Spalte beim Abfragen von Powershell zu erzwingen? Mein Skript muss wissen, ob 1) dort Daten sind (keine NULL zurückgeben) und 2) den Datentyp kennen

Hier ist das Skript, mit dem das Excel-Dokument analysiert wird:

########################################################################################################
# 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()

Antworten:

1 für die Antwort № 1

Demzufolge KB-Artikel (Betonung hinzugefügt):

Vorsicht bei gemischten Datentypen

Wie bereits erwähnt, muss ADO die Daten erratenTyp für jede Spalte in Ihrem Excel-Arbeitsblatt oder Bereich. (Dies wird von einer Excel-Zelle nicht beeinflusst Formatierungseinstellungen.) Ein schwerwiegendes Problem kann auftreten, wenn Sie numerisch sind Werte gemischt mit Textwerten in derselben Spalte. Sowohl der Jet als auch der ODBC-Provider gibt die Daten des Majoritätstyps zurück, gibt jedoch NULL zurück (leere) Werte für den Minoritätsdatentyp. Wenn die zwei Arten sind In der Spalte gleich gemischt, wählt der Anbieter numerisch Text aus.

Die "sichere" Option ist, alle Felder als Text zu behandeln, indem Sie ein IMEX=1 Option zur Verbindungszeichenfolge:

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

Konvertieren Sie dann numerische Werte in Ihrem PowerShell-Skript, indem Sie explizite Umwandlungen verwenden, z.

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

Weicher Zwang mit einem unären Operator wie:

+$value

oder mit statischem Parsing wie folgt:

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