【问题标题】:Oledb reader does not read excel files correctlyOledb 阅读器无法正确读取 excel 文件
【发布时间】:2013-06-17 10:01:17
【问题描述】:

我正在尝试通过 OLEDB 阅读器读取 xls 文件,其中一列 xls 中具有混合数据类型。 Oledb 为这些列值返回 DBNULL。我在本专栏的第一个单元格中有05-06-12。当我去检查格式单元格时,它显示custom type with dd-mm-yy,在所有其他单元格中显示一般格式。我正在使用以下连接字符串

mCon.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;data source=" + mstrFilePath + ";Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1\";");

我在 xls 中有以下数据

  • 05-06-12
  • 'abc'
  • '56565'

OLEDB 是这样读取的

  • 2012 年 6 月 5 日
  • DBNULL
  • DBNULL

可能是什么原因?即使我把IMEX = 1 放在连接字符串中!!!

【问题讨论】:

  • 单元格中的数据是字面意义上的'abc',还是实际上只是abc(没有单引号)?
  • 另外,请贴出您用于读取数据的代码。
  • 在我自己做了一些测试之后,我无法重现你的结果。我尝试了'abc'''abc'(实际查看'abc' 显示在Excel 数据单元格中所需的内容)和abc。无论使用OleDbDataAdapter 通过Fill 方法选择DataSet,还是通过使用OleDbDataReader 循环,我总是能读出正确的值。我怀疑导致此问题的 Excel 工作表中的格式存在某些特定问题。
  • 此外,我怀疑如果相关列的第一个单元格包含日期 (05-06-12),那么该列的 DataType 将由该单元格的格式定义,从而使数据随后对该类型无效。

标签: c# winforms excel oledb


【解决方案1】:

我在读取 xlsx 文件时遇到了类似的问题。我将连接字符串更改为以下内容并且它起作用了:

const string con = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xlsx;" +"Extended Properties=\"Excel 12.0;IMEX=1;HDR=YES;TypeGuessRows=0;ImportMixedTypes=Text\"";

您需要将您的 xls 转换为 xlsx 并使用

Microsoft.ACE.OLEDB.12.0

读取 xlsx 文件。

【讨论】:

    【解决方案2】:

    像这样将Importmixedtypes=text 添加到您的连接字符串中

    mCon.ConnectionString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;Importmixedtypes=text;typeguessrows=0;\"",mstrFilePath);
    

    【讨论】:

    • 你能张贴前几行你的excel表格吗?
    • 我在我的问题中发布了示例数据
    • 我无法从这三个数据中进行测试。至少发布四行您的 Excel 表格
    【解决方案3】:

    经过几个小时的反复试验并寻找解决方案,我开始着手解决这个问题:

    "Provider=Microsoft.ACE.OLEDB.12.0; Data Source= {0}; Extended Properties=\"Excel 12.0;IMEX=2;HDR=YES;TypeGuessRows=0;ImportMixedTypes=Text\""
    

    注意:

    1. IMEX = 2
    2. HDR = YES,最重要的是
    3. 扩展属性应该用双引号括起来

    对不起,这也不起作用...使用了错误的文件:-(

    【讨论】:

      【解决方案4】:

      我猜你的连接字符串是错误的。如果 Excel 版本是 2007 或更高版本(即 .xlsx 扩展名),那么我们需要使用 ACE 引擎,否则对于 xls 文件(在您的情况下),我们应该使用 Jet 引擎连接字符串。请用您现有的字符串替换下面提到的字符串。我想问题应该得到解决。

      mCon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                        "Data Source=" + FilePath + ";" +
                        "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1' ";
      

      【讨论】:

        猜你喜欢
        • 2018-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 2021-12-07
        • 1970-01-01
        相关资源
        最近更新 更多