我有一个这种形式的Excel文件:
Column 1 Column 2 Column 3
data1 data2
data1 data2
data1 data2
data1 data2
data1 data2 data3
Run Code Online (Sandbox Code Playgroud)
也就是说,除了最后一行之外,整个第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;
Run Code Online (Sandbox Code Playgroud)
关键是,在这种情况下,我的代码返回一个只有第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;""";
Run Code Online (Sandbox Code Playgroud)
我得到"外部表不是预期的格式"异常,当ACE/JET和正在打开的文件之间存在版本不匹配时,我认为这是标准异常.
字符串
Provider=Microsoft.ACE.OLEDB.12.0
Run Code Online (Sandbox Code Playgroud)
意味着我正在使用最新版本的OLEDB,我快速浏览了一下,这个版本用于需要连接到.xlsx文件的任何地方.
我尝试过只有一个香草提供商(只有Excel 12.0,没有IMEX和HDR),但我得到了同样的例外.
我在.NET 2.0.50727 …