我正在尝试从不同的Excel工作表中获取数据表。我使用OleDbConnection
正确获取数据表。但是,某些列被错误地理解为String
,但其中一些列为Double
或DateTime
类型。
我正在阅读的Excel我已经从Access文件创建了它,并且它使用正确的数据类型编写。我还验证了Excel工作表中没有“以文本格式存储”单元格消息。当我尝试读取此Excel文件中大多数行为空的列时,问题就出现了。
从this post我得到ADO.NET根据列中的大多数值选择数据类型。所以我不知道这些字段中大多数条目是空的这一事实是否会在阅读时产生影响。
但是,我再说一遍,从Access中读取数据表内容时不会发生这种情况,因为Access设计中的字段是使用相应的DataType
定义的,而在Excel中则不是。
我的功能是将所需的工作表内容设为DataTable
:
Public Function GetDatatable(sheetName As String, versionFilter As String) As DataTable
Try
Dim MyConnection As System.Data.OleDb.OleDbConnection
Dim ds As System.Data.DataSet
Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
Dim dbProvider As String = "PROVIDER=Microsoft.ACE.OLEDB.12.0;"
Dim dbSource As String = String.Format("Data Source={0};", Trim(IExcelValue))
Dim dbProperties As String = "Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1;"""
'Set version filter string if needed
If Not versionFilter Is Nothing Then
versionFilter = String.Format(" where numversion = '{0}'", versionFilter)
Else
versionFilter = ""
End If
'Set the connection string
Dim connectionString As String = String.Format("{0}{1}{2}", dbProvider, dbSource, dbProperties)
MyConnection = New System.Data.OleDb.OleDbConnection(connectionString)
MyCommand = New System.Data.OleDb.OleDbDataAdapter(String.Format("select * from [{0}$]{1}", sheetName, versionFilter), MyConnection)
MyCommand.TableMappings.Add("Table", sheetName)
ds = New System.Data.DataSet
MyCommand.Fill(ds)
MyConnection.Close()
GetDatatable = ds.Tables(sheetName)
Catch ex As Exception
MsgBox(ex.ToString)
Return Nothing
End Try
End Function
我知道哪些字段必须是Double
,DateTime
或String
,我可以遍历这些列并分配正确的DataType
,但这不是优雅的。
因此,如果从Excel工作表中读取时DataType
中的大多数记录为空,我认为特定字段的默认DataTable
为String
类型。在这些情况下,如何设法获得正确的DataType
?
(我不知道它是否重要,但我使用Closed XML来编写Excel文件)