关于报错:The Microsoft.ACE. Oledb.12.0 provider was not registered on the local computer
错误描述:The Microsoft.ACE. Oledb.12.0 provider was not registered on the local computer
最近在Web项目中做一个自动生成Excel→下载→修改→上传→生成json格式文件的功能。
本地一切都顺利,在部署到IIS服务器后,运行发现挂了。
本人代码:
1 #region 读取Excel中的数据 2 /// <summary> 3 /// 读取Excel中的数据 支持表头(.xlsx) 不支持表头(.xls) 4 /// </summary> 5 /// <param name="fileName">Excel文件路径</param> 6 /// <returns>Excel中的数据</returns> 7 public DataTable GetTable(string fileName) 8 { 9 OleDbConnection Conn = null; 10 DataTable dt = null; 11 string connString = string.Empty; 12 OleDbDataAdapter da = new OleDbDataAdapter(); 13 DataTable dataTable = new DataTable(); 14 try 15 { 16 string FileType = fileName.Substring(fileName.LastIndexOf(".")); 17 if (FileType == ".xls") 18 connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fileName + ";Extended Properties=Excel 8.0;"; 19 else//.xlsx 20 connString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + fileName + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; 21 // 创建连接对象 22 Conn = new OleDbConnection(connString); 23 // 打开数据库连接 24 Conn.Open(); 25 //获取Excel工作薄中Sheet页(工作表)名集合 26 DataTable ss = Conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); 27 string sql_F = "Select * FROM [{0}]"; 28 for (int i = 0; i < ss.Rows.Count; i++) 29 { 30 da.SelectCommand = new OleDbCommand(String.Format(sql_F, ss.Rows[i][2].ToString()), Conn); 31 da.Fill(dataTable); 32 } 33 return dataTable; 34 } 35 catch (Exception ex) 36 { 37 string Error = ErrorUtil.GetError(ex); 38 39 if (log.IsDebugEnabled) 40 { 41 log.Debug("GenerateFinfo - Error2 : [" + Error + "]"); 42 } 43 throw (ex); 44 } 45 finally 46 { 47 // 释放 48 if (Conn != null) 49 { 50 Conn.Close(); 51 Conn.Dispose(); 52 } 53 if (dt != null) 54 { 55 dt.Dispose(); 56 } 57 } 58 } 59 #endregion
......
......
在我各种查阅,对比,实践后把解决方法记录下来,和大家分享:
报错原因是本地安装了Office客户端,但是服务器没有安装Office客户端。
我们都知道,安装一个Office客户端是需要占一些内存的,这不利于服务器的性能。
所以我就查询了资料,结合实践,有了不安装Office客户端也能读取Excel的解决办法。
解决办法:
第一步:安装数据访问组件:(AccessDatabaseEngine)
1)适用于office2007的Access组件
2)适用于office2010的Access组件
下载安装后电脑里便会有一组组件,非 Microsoft Office 应用程序可以使用它们从 2007/2010 Office system 文件中读取数据,
例如:
1)从 Microsoft Office Access 2007/2010(mdb 和 accdb)文件中读取数据;
2)从Microsoft Office Excel 2007/2010(xls、xlsx 和 xlsb)文件中读取数据。
这些组件还支持与 Microsoft Windows SharePoint Services 和文本文件建立连接。
此外,还会安装 ODBC 和 OLEDB 驱动程序,供应用程序开发人员在开发与 Office 文件格式连接的应用程序时使用。
第二步:打开你所部署项目的电脑的IIS管理器,把你用的那个程序池修改“启用兼容32位应用程序” 属性值为True。
如下图所示:
以上方法,亲测有效,如果你遇到类似的问题依旧无法解决,可以查看一下Excel。有的读取Excel的方法分xlxs和xls两种文件。
如有更多问题可查看: https://www.cnblogs.com/yifeixue/ 或者:http://www.cnblogs.com/willingtolove/