我有一个以这种形式的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引擎试图通过每列中第一个单元格的类型来推断列类型;作为第一个值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上,也许是时候升级了?
答案 0 :(得分:7)
我重新创建了您的情况,并且正确返回了3列。也就是说,前两列完全填充数据,第三列包含null,直到最后一行有数据。
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)
提供程序,它继承了旧Joint Engine Technology(JET)
提供程序,我的结果可能代表两者之间的行为差异。当然,如果您还没有使用它,我建议使用ACE
提供商,因为我相信微软也会这样做。另请注意连接的Extended Properties
:
“HDR =是;”表示第一个 row包含列名,而不是数据。 “HDR =无;”表明相反。
“IMEX = 1;”总是告诉司机 读“混合”(数字,日期, 字符串等)数据列为文本。 请注意,此选项可能会影响 excel表写访问否定。
如果有帮助,请告诉我。