[英]Quirky SELECT from Excel file via OleDbDataAdapter method (C#)
我有以下格式的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上,也许是时候升级了?
我重新创建了您的情况,随后正确返回了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 =是;” 表示第一行包含列名,而不是数据。 “HDR =无;” 表示相反。
“IMEX = 1;” 告诉驱动程序始终将“混合”(数字,日期,字符串等)数据列读作文本。 请注意,此选项可能会影响excel工作表写入访问权限。
如果这有帮助,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.