为什么在使用OleDb的Excel导入中忽略第一个空行

时间:2012-04-04 11:59:32

标签: 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.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:我找到How to count empty rows when reading from Excel但无法重现它。

2 个答案:

答案 0 :(得分:2)

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

See this blog post for a more detailed explanation.

以及讨论行为的MS KB Article

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

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

您可能还想尝试修改注册表以查看将TypeGuessRows设置更改为0(扫描文件中的所有数据以确定每列的数据类型)有助于返回第一个空行。我的预感是,这无济于事。

答案 1 :(得分:0)

OleDbDataAdapter将第一行视为标题。 要获取第一行,请从数据表的标题创建数据行。 并插入第一个位置。

  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);