我有一个这种形式的 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;
关键是,在这种情况下,我的代码返回一个只有第 1 列和第 2 列的 DataTable。
我的猜测是 JET 引擎试图通过每列中第一个单元格的类型来推断列类型;第一个值为 null,则忽略整列。
我试图填写零,这段代码实际上返回了所有三列;这显然是最不可取的解决方案,因为我必须处理大量小文件。
反转选择范围(从,即 "A1:C5" 到 "C5:A1" )也不起作用。我正在寻找更优雅的东西。
我已经找到了几篇讨论类型不匹配的帖子(int 列中的 varchar 单元格,反之亦然),但实际上还没有找到与此相关的任何内容。
谢谢阅读!
编辑
又是奇怪的行为。我必须主要处理 Excel 2003 .xls 文件,但由于这个问题已经得到解答,我想我可以针对 Excel 2007 .xslx 文件测试我的代码。连接字符串如下:
string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""";
我收到“外部表不是预期格式”异常,我认为这是标准异常,当 ACE/JET 和正在打开的文件之间存在版本不匹配时。
字符串
Provider=Microsoft.ACE.OLEDB.12.0
意味着我使用的是最新版本的 OLEDB,我快速浏览了一下,这个版本用于需要连接到 .xlsx 文件的任何地方。
我只尝试了一个香草提供程序(只有 Excel 12.0,没有 IMEX 或 HDR),但我得到了同样的例外。
我在 .NET 2.0.50727 SP2 上,也许是时候升级了?