C# Oledb读取器无法正确读取excel文件

C# Oledb读取器无法正确读取excel文件,c#,winforms,excel,oledb,C#,Winforms,Excel,Oledb,我试图通过OLEDB阅读器读取xls文件,在xls的一列中包含混合数据类型。Oledb为这些列值返回DBNULL。我在本栏的第一个单元格中有05-06-12。当我检查格式单元格时,它会显示带有dd-mm-yy的自定义类型,在所有其他单元格中,它会显示通用格式。我正在使用以下连接字符串 mCon.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;data source=" + mstrFilePath + ";Extended Prope

我试图通过OLEDB阅读器读取xls文件,在xls的一列中包含混合数据类型。Oledb为这些列值返回DBNULL。我在本栏的第一个单元格中有
05-06-12
。当我检查格式单元格时,它会显示带有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是这样读的

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);
  • 2012年6月5日
  • DBNULL
  • DBNULL

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

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

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版本是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' ";

经过几个小时的反复试验和寻找解决方案后,我开始着手以下工作:

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

  • IMEX=2
  • HDR=是的,最重要的是
  • 扩展属性应包含双引号

  • 很抱歉,这也不起作用…使用了错误的文件:-(

    我在读取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文件。

    你能发布excel工作表的前几行吗?我在问题中发布了样本数据,我无法从这三个数据中进行测试。发布至少四行excel工作表是单元格中的数据,或者它实际上只是
    abc
    (没有单引号)?另外,请发布您用来读取数据的代码。在我自己做了一些测试之后,我无法复制您的结果。我尝试了
    'abc'
    'abc'
    (实际查看Excel数据单元格中显示的
    'abc'
    需要什么),和
    abc
    。无论使用
    OleDbDataAdapter
    通过
    Fill
    方法选择进入
    数据集,还是通过使用
    OleDbDataReader
    循环,我总是能够读取正确的值。我怀疑Excel工作表中的格式有某些特定的原因导致此外,我怀疑如果所讨论列的第一个单元格包含日期(
    05-06-12
    ),则该列的
    数据类型将由该单元格的格式定义,从而使后面的数据对该类型无效。