Excel文件中的古怪SELECT通过OleDbDataAdapter方法(C#)

时间:2010-12-01 15:46:25

标签: c# excel null oledbcommand oledbdataadapter

我有一个以这种形式的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上,也许是时候升级了?

1 个答案:

答案 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表写访问否定。

如果有帮助,请告诉我。