匯入excel時,會丟失一些手機號,或者固定**號
問題出在於,他們將資料填入excel時,有些格式是數值型別,有些是文字型別
當用oledb讀取excel的時候,在extended properties中若沒有配置imex=1的屬性,微軟的處理機制是將列轉換為同一型別來讀取的.例如在第一行寫的數值格式,而第二行寫的文字格式,就會出現某些列有值卻讀不出來.其實問題也很簡單,如果知道問題所在的話.屬性設定為"imex=1"即可。
**如下:
string strconn;
strconn = "provider=microsoft.jet.oledb.4.0;data source=" + aimfile + ";extended properties='excel 8.0;imex=1';";
oledbconnection conn = new oledbconnection(strconn);
//讀取工作區「sheet1」中的資料
oledbdataadapter mycommand = new oledbdataadapter("select * from [sheet1$]", strconn);
dataset mydataset = new dataset();
mycommand.fill(mydataset);
return mydataset;//返回資料集
c#讀取excel需要注意的:
imex=1:混合模式
hdr=yes; 是否讓第一行作為列頭
兩者必須一起使用。
本以為這樣就ok了。但在實際使用過程中,這樣設定還是不行,查閱了不少資料才發現,原來還有乙個登錄檔裡的資訊需要修改,這樣帶能讓excel不再使用前8行的內容來確定該列的型別。
c#讀取excel之登錄檔修改內容如下:
在hklm\software\microsoft\jet\4.0\engines\excel有乙個typeguessrows值,預設是8,表示會先讀取前8列來決定每乙個欄位的型態,所以如果前8列的資料都是數字,到了第9列以後出現的文字資料都會變成null,所以如果要解決這個問題,只要把typeguessrows機碼值改成0,就可以解這個問題了!
解決同一列中「字串」和「數字」兩種格式同時存在,讀取時,不能正確顯示「字串」格式的問題:
string strconn = "provider=microsoft.jet.oledb.4.0;" + "data source=" + path + ";" + "extended properties='excel 8.0;hdr=yes;imex=1'";
oledbconnection conn = new oledbconnection(strconn);
主要是驅動的問題,需要新增hdr 和 imex,
其中,hdr取值yes,no ,表示第一行是否為欄位名
imex 取值1,2,其中1 正是解決此問題的關鍵
c#匯入excel遇到數字字母混合列資料丟失解決詳解
錯誤重現:
在匯入excel讀取資料時,其中的乙個字段儲存的值有如下格式:"2011072014","20110aad10","25124adfa","例子asdfadf" 這樣的 混合了 "字母/數字/中文"資料, 在excel**中的前 8條 或 前 8+ 條資料中的 這個列中的資料都是 由純數字組成的,如"2011072012","2011072013","2011072014",到了大於8行的時候的該列的資料組成變成了 數字+中文 + 字母的組合,這樣就會出現取不到該列值的問題
錯誤原因:
excel讀取資料列的格式 是按照每一列前8個資料的型別來判斷讀寫時的型別的。比如前8個資料有3個是字幕,5個是數字,那麼這一整列都是以數字型來讀的,型別最多的那麼不管第8條之後是什麼型別,都當作這個型別來讀取,那些字母都讀不了。
使用microsoft.jet.oledb.4.0讀取資料會出現當某一字段內分別含有文字和數字的混合資料時,某一型別的資料會產生丟失。
產生這種問題的根源與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驅動的這種機制還是讓這列的資料變成空。
在sql server用法
select *
from opendatasource( 'microsoft.jet.oledb.4.0',
'data source="e:\資料.xls";
user id=admin;password=;extended properties=''excel 8.0;hdr=yes;imex=1''')
在專案中加入如下**,自動修改登錄檔!
關於poi匯入excel資料的一些心得
最近在做excel資料匯入模組,不通過伺服器,以檔案流的形式傳輸excel,直接導到相應的資料庫表中.用poi的方式可以實現.但在匯入資料時候,遇到了資料中如果有空行,或者空行的cell中有空格,匯入到資料庫中將會是空的資料.但是需求是如果遇見資料匯入時,某一行沒有資料為空行,或者空行中的cell有...
一些手機的暗碼
讓你的 手機隨時變成空號 方法如下 在待機狀態下 輸入 21 999999 再按下撥號鍵 ok 大功告成 在這種狀態下 別人打你 是空號 而你 也不會接到 以前以為只有nokia的 才可以用 自己用索愛的試了下結果也可以 初步判斷大部分手機都可以 在此提醒 此狀態就算關機開機也不會取消 取消空號狀態...
Excel的一些問題
1,excel列印紙張設定16k的問題 excel並沒有象word那樣在頁面設定中提供16開紙型的選項,如果手工重調,又會非常麻煩。解決這個問題就是為excel手工新增16開紙支援,但這個任務需要在 控制面板 的 印表機和傳真 中完成。在印表機裡面新增16開紙型 選擇乙個印表機後,從 檔案 選單中選...