4

使用 .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 读取时计算空行但无法重现它。

4

2 回答 2

2

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

有关更详细的说明,请参阅此博客文章。

以及讨论该行为的这篇MS 知识库文章。

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

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

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

于 2012-04-04T13:44:27.547 回答
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);
于 2012-04-04T13:28:56.757 回答