从excel导入数据表跳过最后一列值
我想从Excel文件导入数据到数据表。 但问题是最后一列值被忽略。 其余列的值是完美的。 我的excel文件包含这个:
导入datatable中的数据如下:
我的代码是这样的:
Dim connExcel As New OleDbConnection(constr) Dim cmdExcel As New OleDbCommand() Dim oda As New OleDbDataAdapter() Dim dt As New DataTable() cmdExcel.Connection = connExcel 'Read Data from First Sheet connExcel.Open() cmdExcel.CommandText = "SELECT * From [Sheet1$]" oda.SelectCommand = cmdExcel oda.Fill(dt) connExcel.Close()
连接string如下:
<add name="ExcelCon12" connectionString="Provider=Microsoft.JET.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0" /> <add name="ExcelCon4" connectionString="Provider=Microsoft.JET.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0"/>
我究竟做错了什么?
我会认可这个确实是Excel / OleDb中的一个错误。 @ubaidashrafmasoody是正确的,今天我又转载了同样的行为。 另一个提供了答案,它可以通过设置来修复
Extended Properties="Excel 8.0;IMEX=1"
似乎不正确,因为我遇到了这个行为,这已经在我的连接string中设置。
bug的行为的细节是这样的(尽pipe可能是编辑:如果最后一列(大多数)在前几个(大概是8)行中有空单元格,那么该列不会出现在任何SQL语句的作用域中(这个在任何编辑之后都会自行修正,正如@ubaidashrafmasoody所描述的那样)。例如,如果我有五列,列1,列2,列3,列4和列5,其值(标题行中的列5除外)为空, 然后:
SELECT * From [Sheet1$]
只会返回4列。
如果我只列出四列,例如:
SELECT [Column1], [Column2], [Column3], [Column4] From [Sheet1$]
那么它会正确返回。 但是,如果我命名第五列:
SELECT [Column1], [Column2], [Column3], [Column4], [Column5] From [Sheet1$]
那么它会出错,并且没有指定[Column5]的参数值。 或者,没有括号,就没有这样的领域。
即使在SQL语句中明确指定范围:
SELECT [Column1], [Column2], [Column3], [Column4], [Column5] From [Sheet1$A1:E55]
要么
SELECT * From [Sheet1$A1:E55]
不能检索第五列。
然而,一个简单的“修复”是在这之后添加一个名为例如Column6的新空白列。 突然间,Column5变得可见,尽pipe它的NULL。
从你提供的代码的样子,我没有看到一个问题。 我相信这个问题是在专栏内的。 例如:混合值(bg123 | 1234)。 这一栏可以混合使用吗? 整数,string等? ADO.Net基于大多数值的列来selectDataType。 然后每个单元格转换为ADO.Netselect的types。 如果你有更多的整数比它将被转换为数字另一方面,如果不是它将被转换为string…
一种解决scheme是在连接string中使用ExtendedProperties
; 表明你正在导入数据。
尝试下面的方法…
Extended Properties=""Excel8.0;IMEX=1""" 'This is to tell it to not care about the types...(mixed); be sure to include the `"` around the `ExtendedProperties` as well.
你的连接string现在…
"Provider=Microsoft.JET.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;IMEX=1"""