用 OLEDB 開啟 Excel 檔案當作資料庫,並把每一個 Sheet 內容當作資料表讀入,這已經太老套沒甚麼好寫的了,不過這次所碰到的奇怪現象是:『Cell 裡頭明明有值,但是讀出來的資料卻是 Null。』
我正在做一個由 Excel 中讀取資料,並將資料倒到 MS-SQL 的資料表上的 Import 程式,碰到上述問題時,發現網路上相關文章挺少。其中有人提到這個問題是 Jet Engine 在判斷該欄位的 Type 時,會抓取 Excel 的前 8 個 Raws 來判斷,於是如果前八行看起來都像是數字,但是後面有字串格式時就會回傳 Null 值(因為預期的轉換會發生衝突)。
這個問題的解法可以使用 OLEDB 連接字串解決:
string strCon = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + this.FileName + ";Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"" ;
這一段主要的更動是在 Extended Properties 中多設定了 HDR 跟 IMEX 這兩個項目。但是這個方法還是要配合 Registry 的更動,才算是一個完整的解決方案,專案完成後的安裝程式要記得一併更動使用者端相關的 Registry,否則還是會有問題的。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel]
"win32"="C:\WINDOWS\System32\msexcl40.dll"
"DisabledExtensions"="!xls"
"ImportMixedTypes"="Text"
"FirstRowHasNames"=hex:01
"AppendBlankRows"=dword:00000001
"TypeGuessRows"=dword:00000000