ADO截断Excel数据
我有一个函数使用ADO从工作表的内容获取ADODBlogging集,如下所示:
Function WorksheetRecordset(workbookPath As String, sheetName As String) As adodb.Recordset Dim objconnection As New adodb.Connection Dim objrecordset As New adodb.Recordset On Error GoTo errHandler Const adOpenStatic = 3 Const adLockOptimistic = 3 Const adCmdText = &H1 objconnection.CommandTimeout = 99999999 objconnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & workbookPath & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";" objrecordset.Open "Select * FROM [" & sheetName & "$]", _ objconnection, adOpenStatic, adLockOptimistic, adCmdText If objrecordset.EOF Then Set WorksheetRecordset = Nothing Exit Function End If objrecordset.MoveLast objrecordset.MoveFirst Set WorksheetRecordset = objrecordset Exit Function errHandler: Set WorksheetRecordset = Nothing End Function
我有一个问题,导入数字数据格式化为1位小数,但他们实际上有2个小数位。 这只有在数据types在列中混合时才会发生。 例如,这些值:
0.03 0.05 0.08 0.13
当我把它们设置在这个表中的一个小数位时:
+-------+-----------+ | value | something | +-------+-----------+ | 0.0 | a | | 0.1 | a | | 0.1 | sda | | 0.1 | sdf | +-------+-----------+
那么logging集会得到正确的2位小数位值。 但是当我把它们放在这张桌子里的时候:
+---------+-----------+ | value | something | +---------+-----------+ | asdfasd | asdfas | | 0.0 | a | | 0.1 | a | | 0.1 | sda | | 0.1 | sdf | +---------+-----------+
那么logging集只会得到1位小数,例如它会select“0.0”而不是“0.03”。 我认为这是因为第一行中的string导致ADO将所有列中的值视为显示的string。
有没有办法,我仍然可以拿起文本string,但也获得正确的数字值的小数位数?
编辑:只是注意到一些奇怪的东西。 当我打开工作簿时运行此logging集获取正确的小数位数。 如果我在工作簿closures时运行它,它只会显示小数。
尝试以下为您的objRecordsetfunction和查询( MS Excel中testing ):
With objrecordset .CursorLocation = adUseClient .LockType = adLockOptimistic .CursorType = adOpenStatic .ActiveConnection = objconnection .Open "Select format(`" & sheetName & "$`.value,'0.00') as [value], something FROM [" & sheetName & "$]" End With
所以,这里的JET SQL格式函数迫使ADO的SQLparsing器输出格式为0.00
的string
此外,我已经将CursorTLocation
属性设置为adUseClient
因此您不需要使用MoveLast
和MoveFirst
让我们知道您的身体情况如何
菲利普
不幸的是,我之前有同样的问题,原因是ACE驱动程序只查看列中的第一个值来决定整个列的数据types。 因此,您可以尝试使用顶部的数字值对数据进行sorting。
在Excel中创build连接表的“黄金标准”方式是使用vLookup。 即使看起来有点“业余”,我也会build议做这个。
另外,将IMEX设置为1基本上会强制ACE返回文本表示,以便数值列中的字母数字值不会返回为空。