代码之家  ›  专栏  ›  技术社区  ›  Øyvind Bråthen

使用OleDbDataAdapter从Excel工作表获取数据时出现问题

  •  6
  • Øyvind Bråthen  · 技术社区  · 15 年前

    首先,我想说的是,我是在深水区工作,因为我只是对公司其他人编写的代码做一些更改,使用OleDbDataAdapter与Excel“对话”,我对此并不熟悉。有一个虫子我就是不明白。

    我正在尝试使用OleDbDataAdapter读入一个大约有450行的excel文件。

    connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source='" + path + "';" + "Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1;\"");
    connection.Open();
    OleDbDataAdapter objAdapter = new OleDbDataAdapter(objCommand.CommandText, connection);
    objAdapter.Fill(objDataSet, "Excel");
    
    foreach (DataColumn dataColumn in objTable.Columns) {
      if (dataColumn.Ordinal > objDataSet.Tables[0].Columns.Count - 1) {
        objDataSet.Tables[0].Columns.Add();
      }
      objDataSet.Tables[0].Columns[dataColumn.Ordinal].ColumnName = dataColumn.ColumnName;
      objImport.Columns.Add(dataColumn.ColumnName);
    }
    
    foreach (DataRow dataRow in objDataSet.Tables[0].Rows) {
       ...
    }
    

    除了一件事,一切似乎都很顺利。第二列主要是四位数字,如6739、3920等等,但是fice行有8201NO和8205NO这样的字母数字值。这五个单元格报告为空白内容,而不是字母数字内容。我已签入excel,此列中的所有单元格都标记为文本。

    顺便说一下,这是一个xls文件,不是xlsx。

    有人知道为什么这些单元格在DataRow中显示为空白,而数字单元格显示得很好吗?还有其他包含字母数字内容的列显示得很好。

    3 回复  |  直到 15 年前
        1
  •  8
  •   Abe Miessler    15 年前

    现在的情况是,excel正试图根据电子表格列中的前几个值为该列指定数据类型。我怀疑,如果你看一下列中的属性,它会说这是一个数字列。

    当您开始尝试使用jet查询电子表格时,就会出现问题。当它认为它是在处理一个数字列,并找到一个varchar值时,它悄悄地不返回任何东西。甚至连一条神秘的错误信息都没有。

    作为一种可能的解决方法,您可以将其中一个字母数字值移动到数据的第一行,然后尝试解析。我怀疑你会开始得到字母数字行的值然后。。。

    看一看 this article

    然而,根据JET文件,我们 可以通过覆盖注册表设置 属性),将设置所有 列类型为UNICODE VARCHAR或 ADVARWCHAR不考虑 ImportMixedTypes键价值观。嘿

        2
  •  1
  •   GSerg    15 年前

    IMEX=1 意思是“以文本形式读取混合数据”

    不过,也有一些问题。Jet将只使用几行来确定数据是否是混合的,如果是这样的话,这些行都是数字,您将得到这种行为。

    connectionstrings.com 详情:

    查看 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel] REG_DWORD “TypeGuessRows”。这就是不让Excel仅使用前8行猜测列数据类型的关键所在。将此值设置为0以扫描所有行。这可能会影响性能。另外请注意,添加IMEX=1选项可能会导致IMEX功能在仅仅8行之后设置。使用IMEX=0来确保强制注册表TypeGuessRows=0(扫描所有行)工作。

        3
  •  1
  •   MarkPflug    15 年前

    我建议不要使用OleDb数据提供程序的东西来访问Excel,如果你可以帮助它。我只遇到了问题,正是因为其他人指出的原因。在处理大型电子表格时,性能往往也很糟糕。

    http://exceldatareader.codeplex.com/

    推荐文章