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因此您不需要使用MoveLastMoveFirst

让我们知道您的身体情况如何

菲利普

不幸的是,我之前有同样的问题,原因是ACE驱动程序只查看列中的第一个值来决定整个列的数据types。 因此,您可以尝试使用顶部的数字值对数据进行sorting。

在Excel中创build连接表的“黄金标准”方式是使用vLookup。 即使看起来有点“业余”,我也会build议做这个。

另外,将IMEX设置为1基本上会强制ACE返回文本表示,以便数值列中的字母数字值不会返回为空。