2

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

4

1 回答 1

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=是的;” 表示第一行包含列名,而不是数据。“HDR=否;” 表示相反。

“IMEX=1;” 告诉驱动程序始终将“混合”(数字、日期、字符串等)数据列作为文本读取。请注意,此选项可能会对 excel 工作表写入访问产生负面影响。

让我知道这是否有帮助。

于 2010-12-01T16:36:01.080 回答