您好,登錄后才能下訂單哦!
本篇文章為大家展示了ADO中怎么利用GetCollect()函數獲取EXCEL表格中完整數字,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
ADO是一組由微軟提供的COM組件,基于面向對象思想的編程接口。它建立在COM體系結構之上,它的所有接口都是自動化接口,因此在C++、VisualBasic、Delphi等支持COM的開發語言中通過接口都可以訪問到ADO。ADO對象模型非常精煉,由三個主要對象Connection、Command、Recordset和幾個輔助對象組成。
我們利用ADO技術的GetCollect()函數讀取excel表中的字符串中會發現如果數字行數過長(一般>255行)會出現讀取的數據不完整這種情況。這是筆者在一年前寫一個讀取excel表格數據中出現的情況。針對這個問題,筆者上網查詢了一些材料,找到了一個很好的解決方法,并且很好的解決了這個問題。
問題的原因是這樣的,因為在使用ADO.NET讀取Excel表格時,OLEDB(Excel
2000-2003一般是是Jet 4.0,Excel 2007是ACE 12.0,即Access Connectivity Engine,ACE也可以用來訪問Excel
2000-2003)會默認掃面Sheet中的前幾行來決定數據類型,Excel并不像Access一樣,一列中的單元格的數據類型可能不一樣,用ADO.NET讀取Excel時,ole
db(JET) 會掃描sheet中前幾行,默認是8行(這個值可在注冊表中TypeGuessRows設定)來決定當前列的數據類型。這樣,就給我們提供了一個解決這個問題的方法,需要通過修改注冊表中的TypeGuessRows的值來來解決這個問題。考慮一列數據,如果前8行都是數字,那么JET掃描沒有問題。如果8行內的數據類型不一樣,JET會采用一個都適合的數據類型來匹配,通常為varchar或unicode
varchar。 現在的問題是,前8行的數據如果短小,JET匹配了varchar,只有255字符。而實際可能是其它更大的數據。
如果設置前面的TypeGuessRows=0,這樣會查詢16384行,查詢完后匹配一個最合適的數據類型,不過這個長度對于我來說已經綽綽有余,所以有一個很好的解決方法就是將TypeGuessRows的值設為0;
TypeGuessRows在注冊表中的路徑如下所示:
Excel 2000-2003 : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\
Excel 2007 : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel
(其取值范圍為十進制閉區間0-16)
所以我們就可以寫一個很簡單的程序來解決該問題,代碼很簡單,如下所示
void SetTypeGuessRowsValue()
{
HKEY hKEY;
LPCTSTR dataSet="SOFTWARE\\Microsoft\\Jet\\4.0\\Engines\\Excel\\";
//打開與路徑 dataSet 相關的hKEY,KEY_WRITE表示以寫的方式打開
long retn = ( ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,dataSet, 0, KEY_WRITE, &hKEY) );
if( retn != ERROR_SUCCESS )
{
MessageBox("錯誤: 無法打開有關的hKEY!");
return;
}
//修改TypeGuessRows值
DWORD type = REG_DWORD;
DWORD cbData = 2;
BYTE VAL = 0;
retn =::RegSetValueEx(hKEY, "TypeGuessRows", NULL, type, &VAL, cbData);
if( retn != ERROR_SUCCESS )
{
MessageBox("錯誤: 無法修改有關注冊表信息!");
return;
}
}
上述內容就是ADO中怎么利用GetCollect()函數獲取EXCEL表格中完整數字,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。