一直使用以下程式碼從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");
但這次釋出到windows 2008 R2上後卻報錯。上網查詢後得知IIS7會支援一部分32位DLL,但對於與底層繫結較深的元件卻不支援。Jet 4.0顯示屬於後一種元件。微軟已經不支援Jet 4.0的升級,所以目前沒有,今後也不會再出現Jet 4.0的64位版本。
基於此網上大部分的解決方案是將應用程式池的Enable 32 bit選項設為True(如下圖所示)。這種方案的確可以解決問題,但有以下隱患:
1.今後的發展方向肯定是64位,使用這種方式只是臨時解決了問題,治標不治本。
2.在我們系統中還用到了Oracle Client, SAP Connector等仍舊需要64位
3.MOSS系統中也可能會用到類似的功能,不可以降到32位
鑑於以上問題,我開始查詢替代方案,終於查到也可以使用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'處的單引號不能少。
相信還有其它替代方案,請大家多提寶貴意見。