天天看點

将Excel檔案當作資料庫通路時同一列資料類型不同時讀取不到資料

使用程式通路Excel檔案時,如果檔案是标準的Excel檔案格式,可以使用com元件進行通路,也可以将Excel檔案當做資料庫檔案通路

com元件通路的好處是顯而易見的,可以對Excel裡的單元格進行讀取,也可以進行修改,同時也帶來一個問題就是通路速度慢。

用資料庫的方式來通路,好處就是簡單快捷,缺點就是隻能操作資料,無法操作格式。

但是很多時候我們可能僅僅隻是想要做資料讀取出來進行統一整理,這個時候采用資料庫通路的方式就更加快捷。

資料庫通路的具體代碼随便都可以搜到,不再細說,将Excel當作資料庫檔案通路,也隻是資料庫連接配接字元串不同而已,标準的連接配接字元串:

Excel2003:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\1.xls;Extended Properties=“Excel 8.0;HDR=YES;”;

Excel2007:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\1.xlsx;Extended Properties=“Excel 12.0 Xml;HDR=YES”;

很多時候,這樣做就可以進行讀取了。

但是我在使用的時候确發現很多列的資料讀取部分正常,部分丢失。

Excel當做資料庫通路的時候,有一個自動推斷的功能,會根據Excel裡前幾行的資料來推斷列的資料格式,如果後面的單元格裡存在類型不一緻的情況,這時就可能會發生讀取不到資料的情況。

解決辦法: 在連接配接字元串後面加上一個屬性

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\1.xls;Extended Properties=“Excel 8.0;HDR=YES;IMEX=1”;

具體更詳細的說明:

IMEX(IMport EXport mode):

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”下的該系統資料庫值來更改采

樣行數,設定為0時表示采樣所有行。

IMEX 三種模式:

當 IMEX=0 時為“彙出模式”(Export mode),該模式開啟的Excel檔案隻能用來做“寫入”用途。

  當 IMEX=1 時為“彙入模式”(Import mode),該模式開啟的Excel檔案隻能用來做“讀取”用途。

  當 IMEX=2 時為“連結模式”(Linked mode),該模式開啟的Excel檔案支援“讀取”和“寫入”用途。