未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序报错的解决办法

 更新时间:2021年9月22日 10:01  点击:1283

错误描述:

在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错:

“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”

代码示例:

static void Main(string[] args)
 {
  readexcel("D:\\test\\xlsxtest.xlsx");
 }
 public static void readexcel(string _path)
 {
  DataTable dt = new DataTable();
  string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + _path + ";" + "Extended Properties=\"Excel 12.0;HDR=No\"";

  using (OleDbConnection connection = new OleDbConnection(connectionString))
  {
  string SQL = "select * from [sheet1$]";
  try
  {
   OleDbCommand comm = new OleDbCommand(SQL, connection);
   if (connection.State != ConnectionState.Open)
   connection.Open();
   OleDbDataAdapter Adpter = new OleDbDataAdapter(comm);
   Adpter.Fill(dt);
  }
  catch (Exception ex)
  {
   dt = null;
  }
  finally
  {
   if (connection.State == ConnectionState.Open)
   connection.Close();
  }

  foreach (DataRow item in dt.Rows)
  {
   string sds = item[0].ToString();
   Console.WriteLine(item[0].ToString() + "//" + item[1].ToString() + "//" + item[2].ToString());
   if (item[1].ToString() == string.Empty)
   {
   break;
   }
  }
  Console.ReadKey();
  }
 }

报错原因:

主要有以下几种原因:

  1、没有安装数据访问组件,需要安装相应版本的数据访问组件(AccessDatabaseEngine);

  2、没有安装相应版本的Office客户端,需要安装相应版本的Office客户端;

  3、没有在IIS应用程序池配置默认属性,需要在相应的IIS应用程序池启用32位应用程序;

  4、连接字符串的问题。采用Microsoft.Jet.OleDb.4.0,可以读取excel2007以前的版本,在客户机上不需要部署office,采用Microsoft.Ace.OleDb.12.0的时候,需要安装引擎。

  5、顺便说一下,在使用“Microsoft.Jet.OLEDB.4.0”,也会报类似错误,原因有可能是,Microsoft.Jet.OLEDB.4.0在64位系统上不支持,需要修改架构,从x64改为x86,无论是WinForm还是ASP.NET;或者修改连接字符串为Microsoft.ACE.OLEDB.12.0并且安装AccessDatabaseEngine x64数据访问组件;

解决方案:

1、安装数据访问组件:

  1)适用于office2007的

  Microsoft Access Database Engine 2007 Office system 驱动程序:数据连接组件

  https://www.microsoft.com/zh-cn/download/details.aspx?id=23734    (该链接已失效,直接用Microsoft Access Database Engine 2010 Redistributable就好了)

  2)适用于office2010的

  Microsoft Access Database Engine 2010 Redistributable

  https://www.microsoft.com/zh-CN/download/details.aspx?id=13255 

  此下载将安装一组组件,非 Microsoft Office 应用程序可以使用它们从 2007/2010 Office system 文件中读取数据,例如从 Microsoft Office Access 2007/2010(mdb 和 accdb)文件以及 Microsoft Office Excel 2007/2010(xls、xlsx 和 xlsb)文件中读取数据。这些组件还支持与 Microsoft Windows SharePoint Services 和文本文件建立连接。

  此外,还会安装 ODBC 和 OLEDB 驱动程序,供应用程序开发人员在开发与 Office 文件格式连接的应用程序时使用。

2、在IIS应用程序池中,设置“”启用兼容32位应用程序”,此设置适用于web项目;

  如图:


注意:

在下载Microsoft Access Database Engine 2010 Redistributable时会让选择下载x86的还是x64的,如图:

 

前提是看服务器是x64的还是x86的,x64的服务器两个版本都能安装;

  如果下载安装的是x64的,那么你的桌面程序就要选择anycpu或x64发布,而web项目是不兼容的,不管你是如何发布的;

  如果下载安装的是x86的,那么你的桌面程序就要选择x86发布,而web项目正常发布就好;

*总结:如果你是web项目,你就下载x86的,发布选anycpu就好了,然后设置应用程序池32位兼容就好了;

*最后说一句,用这个,是不需要安装office软件的;

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3、连接字符串

  主要如下两种情况:

  1)使用Office 2007 OLEDB驱动程序(ACE 12.0)连接到较旧的97-2003 Excel工作簿。

  Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\\myFolder\\myOldExcelFile.xls;
  Extended Properties="Excel 8.0;HDR=YES";

     “HDR =Yes;” 表示第一行包含列名,而不是数据。“HDR =No;” 表明相反;

  2)读取xlsx格式的excel

  Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\\myFolder\\myExcel2007file.xlsx;
  Extended Properties="Excel 12.0 Xml;HDR=YES";

    “HDR =Yes;” 表示第一行包含列名,而不是数据。“HDR =No;” 表明相反;

  Microsoft.ACE.OLEDB连接字符串参考地址:https://www.connectionstrings.com/ace-oledb-12-0/

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对猪先飞的支持。

[!--infotagslink--]

相关文章

  • C#简单了解接口(Interface)使用方法

    这篇文章主要介绍了C#简单了解接口(Interface)使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-12-08
  • C#利用DesignSurface如何实现简单的窗体设计器

    这篇文章主要介绍了C#利用DesignSurface如何实现简单窗体设计器的相关资料,文中通过图文及示例代码介绍的很详细,对大家具有一定的参考价值,需要的朋友们下面来一起学习学习吧。...2020-06-25
  • js replace(a,b)之替换字符串中所有指定字符的方法

    下面小编就为大家带来一篇js replace(a,b)之替换字符串中所有指定字符的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-08-24
  • C#使用oledb导出数据到excel的方法

    这篇文章主要介绍了C#使用oledb导出数据到excel的方法,结合实例形式分析了C#操作oledb导出数据的相关技巧与注意事项,需要的朋友可以参考下...2020-06-25
  • 详解swift中xcworkspace多项目管理

    给大家详细讲解了IOS开发中swift语言xcworkspace多项目管理的方法和介绍,一起参考一下。...2020-06-30
  • Microsoft Expression Web 简体中文正式版 官方下载地址

    Microsoft Expression Web 简体中文正式版相对于早期的 Microsoft Expression Web Designer CTP1(英文)除了它是正式的中文版外,有进步的地方1.对标签的id名称加上了css的代...2020-06-25
  • 浅析JavaScript中命名空间namespace模式

    namespace即“命名空间”,也称“名称空间” 、”名字空间”。接下来通过本文给大家介绍JavaScript中命名空间namespace模式的相关知识,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧...2016-06-24
  • C# 命名空间(Namespace)相关知识总结

    这篇文章主要介绍了C# 命名空间(Namespace)的相关知识,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以参考下...2020-11-03
  • C++与namespace有关的两个编译错误的讲解

    今天小编就为大家分享一篇关于C++与namespace有关的两个编译错误的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-04-25
  • 字符串替换Replace仅替换第一个字符串匹配项

    C#里面的String.Replace(string,string)方法替换的时候是替换所有的匹配项,我们需要只替换第一个匹配项,写一个方法来实现这个功能...2020-06-25
  • TypeScript中正确使用interface和type的方法实例

    在ts中定义类型由两种方式:接口(interface)和类型别名(type alias),interface只能定义对象类型,下面这篇文章主要给大家介绍了关于TypeScript中正确使用interface和type的相关资料,需要的朋友可以参考下...2021-09-15
  • 对python pandas中 inplace 参数的理解

    这篇文章主要介绍了对python pandas中 inplace 参数的理解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-28
  • php中命名空间namespace用法介绍

    PHP的命名空间(namespace)是php5.3之后才有的之前学习php所以没有这个东西了,最近用到了php命名空间了,下面我们一起来看看命名空间namespace用法 现在说这个,感觉有...2016-11-25
  • JS利用正则配合replace替换指定字符

    替换指定字符的方法有很多,在本文为大家详细介绍下,JS利用正则配合replace是如何做到的,喜欢的朋友可以参考下...2021-05-07
  • C#使用ODBC与OLEDB连接数据库的方法示例

    这篇文章主要介绍了C#使用ODBC与OLEDB连接数据库的方法,结合实例形式分析了C#基于ODBC与OLEDB实现数据库连接操作简单操作技巧,需要的朋友可以参考下...2020-06-25
  • php str_replace 输入框回车替换br

    在我们用textarea时会发现回车与空格是不可看到的,所以我们利用str_replace函数将php中的\\n替换成br就可以了哦。有需要的朋友可以参考。 代码如下 复...2016-11-25
  • C#探秘系列(三)——StackTrace,Trim

    这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的StackTrace,Trim...2020-06-25
  • php strtr与str_replace区别比较

    php strtr与str_replace区别比较 函数都是具有替换字符功能的。但是strtr比str_replace性能上要块4倍。具体情况请 看如下分解: 首先是strtr函数: 实例1:当 以下为引用的...2016-11-25
  • Java中的abstract和interface

    abstract和interface关键字在Java中随处可见,它是Java三大特性封装、继承、多态特性的实现重要支柱之一。interface关键字用于定义接口抽象,其本质上是用于定义类型、定义类所具有的能力,下面来看看详细内容,需要的朋友可以参考一下...2021-11-03
  • MySQL中使用replace、regexp进行正则表达式替换的用法分析

    这篇文章主要介绍了MySQL中使用replace、regexp进行正则表达式替换的用法,结合具体实例形式分析了replace、regexp正则替换的使用技巧与相关注意事项,需要的朋友可以参考下...2017-03-14