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

C# 为什么在使用OleDb导入Excel时忽略第一个空行,c#,.net,excel,oledb,C#,.net,Excel,Oledb,使用.Net的OleDb,我尝试导入一个Excel表,其中第一行可以为空。我希望保留DataTable中的空行,以便以后能够将单元格映射到Excel样式的单元格名称“A1、A2,…”。但不管我做什么,第一行都被删除了 Excel文件如下所示: - - - ABC XY ZZ 1 2 3 4 4 5 其中“-”是一个空单元格。(我对导入格式没有影响。) 简化代码: string cnnStr = "Provider=Microsoft.Jet.O

使用.Net的OleDb,我尝试导入一个Excel表,其中第一行可以为空。我希望保留DataTable中的空行,以便以后能够将单元格映射到Excel样式的单元格名称“A1、A2,…”。但不管我做什么,第一行都被删除了

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:我找到了,但无法复制它。

OleDbDataAdapter将第一行视为标题。 为了获得第一行,从datatable的头创建一个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);

问题似乎与OLEDB提供程序的TypeGuessRows功能有关。简而言之,Excel列中的数据可以是任何类型。OLEDB提供程序通过扫描工作表的前8行来猜测数据类型,以确定多数类型—样本中具有最多值的数据类型。任何不是多数类型的内容都将被丢弃

以及讨论行为的这个

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

作为测试,我创建了一个类似于您发布的示例的文件,但将所有列格式化为文本,并保存了该文件。运行您发布的代码,我可以看到返回了4行,第一行是空字符串


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

如果第二行是实际的标题行,为什么需要保留空行?否则,如果这是一个需要保持一致的特性,您能不能在转换中简单地插入一个空行?正如我所说,我想将单元格映射到Excel样式的单元格名称(A1、B2等)。更具体地说:如果Excel包含不需要的值或未知的标题名,我希望abte告诉用户“单元格A2中的值不正确”。当前,如果不存在空行,则此操作有效。对于空行,编号会发生移动。我现在也有同样的问题。你设法解决了吗?@Rossbigoli:不,我没有。我相信这不是真的。当第一行包含任何单元格中的任何值时,它将作为DataTable的一部分返回,例如,行计数为4。在我的例子中,ColumnName还包含F1、F2、F3、…-请注意,connStr包含HDR=No,但是将其设置为yes具有相同的效果:忽略第一行。我知道这一点,但它似乎没有关系:我没有处理8+行,效果仅与文本/数字相同,注册表值没有任何更改(已测试)。“将所有列格式化为文本”将包括第一行,因为对第一行单元格之一的任何格式更改都被视为“内容”(在富文本中是)。更改第一行中一个单元格的背景色具有相同的效果。适配器似乎不需要完全未触及的无格式空第一行(在第二行开始时就是这种情况)(