產生這種問題的根源與excel isam[3](indexed sequential access method,即索引順序訪問方法)驅動程式的限制有關,excel isam 驅動程式通過檢查前幾行中實際值確定乙個 excel 列的型別,然後選擇能夠代表其樣本中大部分值的資料型別[4]。也即excel isam查詢某列前幾行(預設情況下是8行),把佔多的型別作為其處理型別。例如如果數字佔多,那麼其它含有字母等文字的資料項就會置空;相反如果文字居多,純數字的資料項就會被置空。
現具體分析在第1節程式**extended properties項中的hdr和imex所代表的含義。hdr用來設定是否將excel表中第一行作為欄位名,「yes」代表是,「no」代表不是即也為資料內容;imex是用來告訴驅動程式使用excel檔案的模式,其值有0、1、2三種,分別代表匯出、匯入、混合模式。當我們設定imex=1時將強制混合資料轉換為文字,但僅僅這種設定並不可靠,imex=1只確保在某列前8行資料至少有乙個是文字項的時候才起作用,它只是把查詢前8行資料中資料型別佔優選擇的行為作了略微的改變。例如某列前8行資料全為純數字,那麼它仍然以數字型別作為該列的資料型別,隨後行裡的含有文字的資料仍然變空。
另乙個改進的措施是imex=1與登錄檔值typeguessrows配合使用,typeguessrows 值決定了isam 驅動程式從前幾條資料取樣確定資料型別,預設為「8」。可以通過修改「hkey_local_machine\software\microsoft\jet\4.0\engines\excel」下的該登錄檔值來更改取樣行數。但是這種改進還是沒有根本上解決問題,即使我們把imex設為「1」, typeguessrows設得再大,例如1000,假設資料表有1001行,某列前1000行全為純數字,該列的第1001行又是乙個文字,isam驅動的這種機制還是讓這列的資料變成空。
C 讀取Excel(通過OleDb)
通過oledb連線,讀取excel。provider microsoft.jet.oledb.4.0 data source filenameurl extended properties excel 8.0 hdr yes imex 1 特別注意 extended properties excel...
嘗試用OLEDB開啟EXCEL表讀取資料
在網上看了很多關對excel檔案資料的操作,大部分都是關於 對excel的操作,如果採用oledb將excel當一資料庫來操行,那麼實現如何?string strxls this.textboxxls.text.trim system.data.oledb.oledbconnection conn ...
OleDb方式讀取excel,和現實不符
開始時候按照嚴格的excel模板來執行,資料都是嚴格要求的,可是到了客戶那裡,什麼花招都來了.也不使用指定的模板了.導致乙個問題 資料列格式不一致 比如一列 前面幾個全部是數字型別,中間穿插幾個以字元形式儲存的數字.直接導致這些資料讀取為dbnull 怎麼解決.搜尋一下.發現這個是oledb的bug...