讀取的資料都有行列,每一行的前8格(預設),
Excel會解析這8格裡面最多格的型態,並將此行預設為此符合此型態才給讀取,
否則為空值。
解決方法1:
設定系統機碼!
事實上會有這樣的規則,就是因為微軟Excel的設定,OleDB是微軟以統一方式來訪問不同儲存格式的應用程式介面,所以OleDB會以Excel的設定來制定這樣的規則也是合理的吧。
Win 7
開啟 regedit
在
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\3.5\Engines\Excel 底下的 ImportMixedTypes 跟 TypeGuessRows
Excel機碼中,ImportMixedTypes的預設值為Text,也就是我們讀取的Excel、csv檔案,若每1行的資料格式不一致,則Jet Engine將其欄位格式自動轉為文字格式。
Excel機碼中,TypeGuessRows 的預設值為8,也就是我們讀取的Excel、csv檔案,若每1行的前8格的資料格式不一致,Jet Engine將會以前8格裡面最多的型態來當作此行的預設型態,若此行某格非此行的預設型態,則讀取時會有null值。
所以,我們將ImportMixedTypes的值仍為Text、TypeGuessRows的值改為0,此時完成收工。
需注意的是將TypeGuessRows的值改為0,這樣一來Jet Engine會將所有資料讀取完再判斷每格欄位的資料型態!也就是說我們讀取的資料量越大,將會影響資料讀取的效能...
解決方法1.1:
再利用OleDB讀取檔案時,設定檔案路徑設定的地方之中,在Extended Properties=''裡,加入ImportMixedTypes=Text與TypeGuessRows=0(未測試)
string FileLocation = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\DataExcel.xls;Extended Properties='Excel 8.0;HDR=NO;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0'
解決方法2:
改用
NPOI 來讀取 Excel 吧!如此一來即能一格一格的判斷欄位格式。
使用NPOI.SS.UserModel.ICell.CellType就可以知道是什麼資料型態,接著用對應的資料型態的XXXCellValue屬性去取得資料。