OLEDB讀取EXCEL表格時,某些字段為空,怎么辦?
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
轉(zhuǎn)載:http://blog.sina.com.cn/s/blog_53864cba01011cbn.html 前些日子,寫了一個Excel導(dǎo)入數(shù)據(jù)庫的共同Batch,突然有一天發(fā)現(xiàn)當(dāng)我修改Excel某一列的值的時候突然讀不出來值了.奇怪之余,做了一些調(diào)研. 原來如此: 當(dāng)我們用OleBb讀取Excel的時候,如果沒有配置IMEX=1的屬性,微軟的處理機制是將列轉(zhuǎn)換為同一類型來讀取的.例如你在第一行寫的數(shù)字格式,而第二行寫的字符格式,就會出現(xiàn)某些列有值卻讀不出來.其實問題也很簡單,如果知道問題所在的話.屬性設(shè)置為"IMEX=1"即可 讀取excel數(shù)據(jù) 到 datagrid 出現(xiàn):找不到可安裝的ISAM 錯誤: 如果office是2007 那么 Provider=Microsoft.Jet.OLEDB.4.0 修改為Provider=Microsoft.Jet.OLEDB.12.0 當(dāng)我們設(shè)置IMEX=1時將強制混合數(shù)據(jù)轉(zhuǎn)換為文本,但僅僅這種設(shè)置并不可靠,IMEX=1只確保在某列前8行數(shù)據(jù)至少有一個是文本項的時候才起作用,它只是把查找前8行數(shù)據(jù)中數(shù)據(jù)類型占優(yōu)選擇的行為作了略微的改變。例如某列前8行數(shù)據(jù)全為純數(shù)字,那么它仍然以數(shù)字類型作為該列的數(shù)據(jù)類型,隨后行里的含有文本的數(shù)據(jù)仍然變空。 另一個改進的措施是IMEX=1與注冊表值TypeGuessRows配合使用,TypeGuessRows 值決定了ISAM 驅(qū)動程序從前幾條數(shù)據(jù)采樣確定數(shù)據(jù)類型,默認(rèn)為“8”??梢酝ㄟ^修改“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel”下的該注冊表值來更改采樣行數(shù)。但是這種改進還是沒有根本上解決問題,即使我們把IMEX設(shè)為“1”,TypeGuessRows設(shè)得再大,例如1000,假設(shè)數(shù)據(jù)表有1001行,某列前1000行全為純數(shù)字,該列的第1001行又是一個文本,ISAM驅(qū)動的這種機制還是讓這列的數(shù)據(jù)變成空。 (1)在讀取Excel的.xls類型的文本數(shù)據(jù)之前,先將其轉(zhuǎn)換為.csv格式,在Excel中直接另存為這種格式就可以達到轉(zhuǎn)換的目的。CSV文件又稱為逗號分隔的文件,是一種純文本文件,它以“,”分隔數(shù)據(jù)列,本文表1的數(shù)據(jù)表用CSV格式存儲后用純文本編輯器打開的表現(xiàn)形式如表3所示。 表3 采用CSV格式保存的表1數(shù)據(jù) 需要指出的是,CSV文件也可以用Ole DB或ODBC的方式讀取,但是如果采用這些方式讀取其數(shù)據(jù)又會回到丟失數(shù)據(jù)的老路上,ISAM機制同樣會發(fā)揮作用。 (2)采用普通的讀取文本文件的方法打開文件,讀取第一行,用“,”作為分隔符獲得各字段名,在DataTable中創(chuàng)建對應(yīng)的各字段,字段的類型可以統(tǒng)一創(chuàng)建成“String”。 該文章在 2018/2/9 0:51:13 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |