从Excel文件通过OleDbDataAdapter方法(C#)古怪的select

我有这样一个Excel文件:

Column 1 Column 2 Column 3 data1 data2 data1 data2 data1 data2 data1 data2 data1 data2 data3 

也就是说,除了最后一行,整个列3是空的。 我通过OleDbDataAdapter访问Excel文件,返回一个DataTable:这是代码。

 query = "SELECT * FROM [" + query + "]"; objDT = new DataTable(); objCmdSQL = this.GetCommand(); objCmdSQL.CommandText = query; objSQLDad = new OleDbDataAdapter(objCmdSQL); objSQLDad.Fill(objDT); return objDT; 

重点是,在这种情况下我的代码返回一个DataTable只有列1和列2。
我的猜测是,JET引擎试图根据每列中第一个单元格的types来推断列types; 作为第一个值null,整个列被忽略。
我试图填充零,这个代码实际上是返回所有三列; 这显然是最不可取的解决scheme,因为我必须处理大量的小文件。
反转select范围(从“A1:C5”到“C5:A1”)也不起作用。 我正在寻找更优雅的东西。
我已经find了一些讨论types不匹配的post(int列中的varchar单元格,反之亦然),但实际上并没有find与此相关的任何内容。
谢谢阅读!

编辑

奇怪的行为了。 我必须主要处理Excel 2003 .xls文件,但是由于这个问题已经得到解答,我以为我可以testing我的代码对Excel 2007 .xslx文件。 连接string如下:

 string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;"""; 

我得到了“外部表格不是预期的格式”的exception,我认为这是ACE / JET和正在打开的文件之间存在版本不匹配的标准exception。

string

 Provider=Microsoft.ACE.OLEDB.12.0 

意味着我使用的是最新版本的OLEDB,我快速浏览了一下,这个版本在任何需要连接到.xlsx文件的地方都可以使用。
我只用一个香草提供商(只是Excel 12.0,没有IMEX或HDR),但我得到同样的例外。
我在.NET 2.0.50727 SP2上,也许有时间升级?

我重新创build了你的情况,并正确地返回了3列。 也就是说,前两列完全填充数据,第三列包含空值,直到最后一行有数据。

 string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"; DataTable dt = new DataTable(); OleDbConnection conn = new OleDbConnection(connString); OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn); adapter.Fill(dt); 

注意我使用了Access Database Engine(ACE)提供程序,该提供程序inheritance了旧的Joint Engine Technology(JET)提供程序,而我的结果可能表示两者之间的行为差​​异。 当然,如果你还没有使用它,我build议使用ACE提供商,因为我相信微软也会这样做。 另外,请注意连接的Extended Properties

“HDR =是;” 表示第一行包含列名,而不是数据。 “HDR =无;” 表明相反。

“IMEX = 1;” 告诉驱动程序总是读取“混合”(数字,date,string等)数据列作为文本。 请注意,这个选项可能会影响Excel表单写访问的负面影响。

让我知道这是否有帮助。