解决Windows Server2008R2中导入Excel不能使用Jet 4.0
由于CRM系统在部署公司内部使用的时,为了能够使用8G的内存,所以操作系统使用了Windows Server2008R2(Windows Server2008R2是64位系统,同时配置IIS7.0),但是系统在部署后,测试时发现CRM系统中的导入功能不能使用,后经过调试发现从Excel中取数据,它速度快也很方便的代码居然出现了异常,具体代码如下:
string strConn = “Provider=Microsoft.Jet.OLEDB.4.0;” + “Data Source=” + strFileName + “;” + “Extended Properties=Excel 8.0;”;
OleDbDataAdapter ExcelDA = new OleDbDataAdapter(“SELECT * FROM [" + strSheet + "$]“, strConn);
DataSet dstExcel = new DataSet();
ExcelDA.Fill(dstExcel, “ExcelInfo”);
在上面代码中一直提示“无法找到此类型的驱动”,既然没有驱动,就装了OFFICE的组件,测试后还是一样报此错误,所以就上网搜索得知IIS7会支持一部分32位DLL,但对于与底层绑定较深的组件却不支持。Jet 4.0显示属于后一种组件,微软已经不支持Jet 4.0的升级,所以目前没有,今后也不会再出现Jet 4.0的64位版本,意思说这个组件将无法使用在64位和IIS7.0中。
接着后来再去查找资料说,可以把将应用程序池的Enable 32 bit选项设为True,但IIS的稳定性和兼容性不太好,系统中还用到了Oracle Client,在64位系统一定要使用64位的DLL。所以无法把IIS中应用程序池设置成为32位的应用池的方法来解决这个问题。
只能接续网络搜索终于有了可以在64位置上使用EXCEL的替代方案,使用Microsoft.ACE.OLEDB对Excel进行操作。修改后的脚本如下:
string strConn = “Provider=Microsoft.ACE.OLEDB.12.0;” + “Data Source=”+ strFileName + “;” + “Extended Properties=’Excel 12.0;HDR=YES’”;
OleDbDataAdapter ExcelDA = new OleDbDataAdapter(“SELECT * FROM [" + strSheet + "$]“, strConn);
DataSet dstExcel = new DataSet();
ExcelDA.Fill(dstExcel, “ExcelInfo”);
注意’Excel 12.0;HDR=YES’处的单引号不能少。可是测试后还是不能使用,最后才继续搜索资料得知还需要安装一个“AccessDatabaseEngine_X64”驱动程序,这样就可以解决64位EXCEL的导入问题。果然这段代码终于成功,最终导入的问题也解决了。
经过测试,发现使用Microsoft.ACE.OLEDB对Excel进行操作解决虽然64位为体代码在32位windows server 2003操作系统中居然不能用,为了能够让CRM系统的excel导入程序能够在64位操作系统和32位系统都能用,最后解决方法是在web.config的配置文件里增加一个OSType的参数设置,如果在32的操作系统,就使用以前的导入代码,如果是64位置系统我们就使用后来替代方案。