如何从Powershell查询excel时强制数据types返回?

我正在使用Powershell来查询使用OLEDB连接的Excel电子表格。 我有一个列中有多个值。 我注意到,当我们的4个单元格中包含字母时,查询将返回一个NULL ,数据types将是一个System.DBNull 。 见下文:

Excel电子表格1

脚本输出:

 PS D:\temp> D:\WCC_Powershell\ExcelTypeTest.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 

但是,如果4个单元格中的2个包含字母,则所有单元格数据types都将返回为String 。 例:

Excel电子表格2

脚本输出:

 PS D:\temp> D:\WCC_Powershell\ExcelTypeTest.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 

从Powershell查询时,是否有办法强制Excel列的返回types? 我的脚本需要知道如果1)那里有数据(不返回NULL)和2)知道数据types

这里是我用来parsingExcel文档的脚本:

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

根据这个KB文章 (重点补充):

关于混合数据types的注意事项

如前所述,ADO必须猜测Excel工作表或范围中每列的数据types。 (这不受Excel单元格格式设置的影响。)如果在同一列中将数值与文本值混合,则会出现严重问题。 Jet和ODBC提供程序都返回多数types的数据,但为less数数据types返回NULL(空)值。 如果这两种types在列中均匀混合,提供者将在文本上select数字。

“安全”选项是通过向连接string添加IMEX=1选项来将所有字段视为文本:

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

然后在PowerShell脚本中转​​换数值,可以使用如下所示的明确转换:

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

与一元运算符的软强制,例如:

 +$value 

或者像这样使用静态parsing:

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