ASP.Net C# 在64bit下讀取EXCEL問題
在32bit下,ASP.Net 讀取EXCEL可以透過OLEDB,ODBC等連接driver來直接讀取。然而到了64bit時,microsoft不在支援上述driver,導致讀取excel時變得痛苦萬分。(并聯想到引用32bit dll時的痛苦。。。。。)
在winform編程時,當然可以利用將程式編譯成32bit來運行(右鍵專案à屬性à可選擇CPU類型),然而如果是透過IIS來搞,就麻煩了。
一般IIS6.0 是支援32bit 和64bit的,但可惜的是,不同時支援兩者。(到了IIS7.0就可以了) 下面主要講講如何在IIS6.0 ASP.Net 2.0 (64bit)下,讀取Excel的問題,這也是最近一直在琢磨的東西,但還是未找到完美的解決方法。
1. 淒涼的 Microsoft.Jet.OLEDB.4.0 不能用了。
一切要從server的升級說起,一天老大要將server升級(從32bit升級到64bit),於是所有的程序都要測試過,大部份都是沒有問題,但是在一個function (user透過web上傳excel,然後讀取excel將資料import進SQL Server)時,發現資料未寫入DB。。。
OK,debug, 發現excel有通過web service上傳到伺服器,所以應該是讀取excel資料時發生問題,測試后報錯:Microsoft.Jet.OLEDB.4.0 not regist..
Google老師告訴我,在64bit上已經沒有此類driver了。。。哭。。。
繼續google。。。發現。。。。
2. 切換IIS6.0 從64bit 到32bit
當你的IIS只是6.0的時候,你只有選擇32bit 或者64bit, microsoft又告訴我,可以切換到ASP.Net 2.0(32bit),就可以正常讀啦。
一高興,測試,果然成功。。。哇哈哈哈哈。。。
但是問題來了,此server上還裝有SQL server 2005 的64bit版本,造成其reporting service無法用了。。再次哭。。。
p.s. 切換方式可以在microsoft網站上找到(如下):
. 按一下 [開始],再按一下 [執行],輸入 cmd,然後按一下 [確定]。
. 輸入下列命令以啟用 32 位元模式:
cscript %SYSTEMDRIVE%/inetpub/adminscripts/adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1
. 輸入下列命令以安裝 ASP.NET 2.0 (32 位元) 的版本,以及在 IIS 根目錄和下列位置底下安裝指令碼對應:
%SYSTEMROOT%/Microsoft.NET/Framework/v2.0.40607/aspnet_regiis.exe -i
. 請確定在 Internet Information Services Manager 的 Web Service Extension 清單中,將 ASP.NET 2.0.40607 版 (32 位元) 的狀態設定為 Allowed。
3. 沒辦法了,只要利用第三方dll來讀取了。
在此找到幾個較好的: xlReader(需付費) , IExcelDataReader(好像免費), Aspose.Cells(需付費)
第一個xlReader,測了幾下,沒成功,放棄。
第二個,很好用(關鍵是免費哈…),但是碰到問題,在讀取excel2007時,一切都正常,在讀取excel2003英文版時也OK,就是讀取excel2003繁體中文版時,葛兒屁了。。。。。。
基本用法如下(網上都有)
第三個,哎。。。太貴了,貌似一個licence $599 …網上有一個破解版,我下了用用,挺好用的(.net 2.0),本著支持正版的原則,要用的同學自己google吧,我就不提供網址了。
4. 如果覺得以上方法都麻煩,那就別讓user上傳excel了,直接傳csv吧,就
可以用類似讀取txt的方式來讀取資料了。。。
5. 如誰有更好的方式,歡迎分享…如能留言,短信給偶,更是感激萬分。。。