https://blog.miniasp.com/post/2008/08/05/How-to-read-Excel-file-using-OleDb-correctly.aspx
你可以開啟 regedit 程式,選取進系統機碼(Registry)的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\Engines\Excel
我是(HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel)
位置,這裡有兩個非常重要的設定:
在 Excel 機碼中 ImportMixedTypes 的預設值為 Text,代表當你讀入 Excel 檔案時若每一列的資料格式不一致的話,Jet Engine 預設會將欄位的資料格式自動轉成文字(Text)格式!
在 Excel 機碼中 TypeGuessRows 的預設值為 8,代表當你讀入 Excel 檔案時若每一列的資料格式不一致的話,Jet Engine 會先讀取前 8 列的資料,用已判斷之後的資料格式是否固定。假設若前 8 列的資料都是「日期」格式,那麼在第 8 列之後的資料 Jet Engine 會自動解析成「日期」格式,但只要遇到有的資料不是「日期」格式時,就會回傳 Null 給 Jet Engine,也就是本篇文章一開始的問題。
我們是提供 Excel 檔案範本給客戶沒錯,但是強大的 Excel 實在太好用了,導致客戶要怎麼用你根本管不著,原本設定好的格式經過客戶複製、剪貼後,格式就大亂了,導致匯入程式就很容易出錯,而最可惡的就是在 Excel 中明明就有資料,而匯入到資料庫之後卻有些資料是空的,這..這..這..太難跟客戶解釋了!(這時候不得不搬出程式設計師最常說的話排行榜)。
要解決這個問題也很容易,只要將 Excel 機碼中 TypeGuessRows 的值改成 0 即可,只是若你匯入的資料量蠻大的話可能會影響資料讀取時的效能,因為 Jet Engine 會將所有資料讀完才會判斷出每個欄位應該用什麼資料格式。
留言列表