为什么在用OleDb导入Excel时忽略了第一个空行

使用.net的OleDb我尝试导入一个Excel表,其中第一行可以是空的。 我想保留DataTable中的空行,以便将单元格映射到Excel风格的单元名称“A1,A2,…”。 但是不pipe我做什么,第一行都被删除了。

Excel文件看起来像:

- - - ABC XY ZZ 1 2 3 4 4 5 

其中“ – ”是空单元格。 (我对导入格式没有影响。)

简化代码:

  string cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"file.xls\";Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\""; string mySheet = "Sheet1$"; OleDbConnection connection = new OleDbConnection(cnnStr); DataSet Contents = new DataSet(); using (OleDbDataAdapter adapter = new OleDbDataAdapter("select * from [" + mySheet + "]", connection)) { adapter.Fill(Contents); } Console.WriteLine(Contents.Tables[0].Rows.Count); // prints: 3 Console.WriteLine(Contents.Tables[0].Rows[0].ItemArray[0]); // prints: ABC 

任何想法如何保留这个空行?

ps:我发现如何从Excel中读取时计算空行,但无法重现。

这个问题似乎与OLEDB提供程序的TypeGuessRowsfunction有关。 简而言之,Excel列中的数据可以是任何types的。 OLEDB提供者通过扫描工作表的前8行来猜测数据types,以确定多数types – 样本中具有最多数值的数据types。 任何不是多数types的东西都会被丢弃。

看到这个博客文章更详细的解释。

以及讨论行为的这个MS KB文章 。

(跳到TypeGuessRows行为的变通办法部分)

作为testing,我创build了一个类似于您发布的示例的文件,但是将所有列格式化为文本并保存了文件。 运行你发布的代码,我能看到4行返回,第一行是一个空string。

您可能还需要尝试修改registry以查看是否将TypeGuessRows设置更改为0(扫描文件中的所有数据以确定每列的数据types)可帮助返回第一个空行。 我的直觉是,这不会帮助。

OleDbDataAdapter将第一行视为标题。 为了得到第一行,从数据表头创build一个datarow。 并插入第一个位置。

  DataTable dt = Contents.Tables[0]; DataRow dr = new DataRow(); int i = 0; foreach (DataColumn column in dt.Columns) { dr[i] = column.ColumnName.ToString(); i++; } dt.Rows.InsertAt(dr, 0);