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

本文关键字:第一个 Excel OleDb 导入 为什么 | 更新日期: 2023-09-27 18:30:03

使用.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:我发现了如何在从Excel读取时计算空行,但无法复制。

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

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

请参阅此博客文章以获得更详细的解释。

以及这篇讨论行为的微软知识库文章。

(跳到TypeGuessRows行为的解决方法部分)

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

您可能还想尝试修改注册表,看看将TypeGuessRows设置更改为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);