經常使用方法一:ADO (ActiveX Data Objects )的方法
Excel其實也是一種數據庫,既然是數據庫,就能夠用通常的操做數據庫的方法來作處理。
/// <summary>
/// 包含表頭的鏈接
/// </summary>
private const string EXCELCONNECTIN = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';";
/// <summary>
/// 不包含表頭的鏈接
/// </summary>
private const string EXCELCONNECTINNOHDR = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=NO;IMEX=1;';";
使用這種方法時,曾經遇到過Excel的某列前面部分是數字,後面部分是字符。經過這種方法導入的時候發現後面字符部分的數據並無導入。還有,使用「不包含表頭的鏈接」時,在Excel中某一行是列名行(列名通常是字符),而該列的值如果數字或日期等,導入DataTable時,列名沒法導入。調試後發現,導入的時候,系統會根據Excel裏面的內容爲DataTable的列設置類型。前面是數字,這一列就是整型的了,後面的字符固然導不進去了。
IMEX是用來告訴驅動程序使用Excel文件的模式,其值有0、一、2三種,分別表明導出、導入、混合模式。當咱們設置IMEX=1時將強制混合數據轉換爲文本,但僅僅這種設置並不可靠,IMEX=1只確保在某列前8行數據至少有一個是文本項的時候才起做用,它只是把查找前8行數據中數據類型佔優選擇的行爲做了略微的改變。例如某列前8行數據全爲純數字,那麼它仍然以數字類型做爲該列的數據類型,隨後行裏的含有文本的數據仍然變空。
另外一個改進的措施是IMEX=1與註冊表值TypeGue***ows配合使用,TypeGue***ows 值決定了ISAM 驅動程序從前幾條數據採樣肯定數據類型,默認爲「8」。能夠經過修改「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel」下的該註冊表值來更改採樣行數。可是這種改進仍是沒有根本上解決問題,即便咱們把IMEX設爲「1」, TypeGue***ows設得再大,例如1000,假設數據表有1001行,某列前1000行全爲純數字,該列的第1001行又是一個文本,ISAM驅動的這種機制仍是讓這列的數據變成空。
方法一的官方解釋:
如何在 Visual Basic 或 VBA 中使用 ADO 來處理 Excel 數據
簡介
Microsoft Excel 工做表中的行和列與數據庫中的行和列很是類似。只要用戶記住 Microsoft Excel 不是關係型數據庫管理系統,並認識到這一事實所帶來的限制,在許多狀況下均可以利用 Excel 及其工具來存儲和分析數據。
Microsoft ActiveX Data Objects 讓咱們能夠將 Excel 工做簿看作和數據庫同樣。本文經過如下幾節來討論如何實現這一點:
注意:本文中的測試是使用 Microsoft Data Access Components (MDAC) 2.5 在裝有 Visual Basic 6.0 Service Pack 3 和 Excel 2000 的 Microsoft Windows 2000 上執行的。對用戶在使用不一樣版本的 MDAC、Microsoft Windows、Visual Basic 或 Excel 時可能會觀察到的不一樣現象,本文可能未確認或討論。
使用 ADO 鏈接到 Excel
ADO 使用 MDAC 中如下兩個 OLE DB 提供程序中的任何一個均可以鏈接到 Excel 數據文件。
如何使用 Microsoft Jet OLE DB Provider
Jet 提供程序只須要兩條信息就能夠鏈接到 Excel 數據源:路徑(包括文件名),和 Excel 文件版本。
Jet 提供程序使用鏈接字符串
Dim cn as ADODB.Connection
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=C:\MyFolder\MyWorkbook.xls;" & _
"Extended Properties=Excel 8.0;"
.Open
End With
提供程序版本:必須使用 Jet 4.0 提供程序;Jet 3.51 提供程序不支持 Jet ISAM 驅動程序。若是指定了 Jet 3.51 提供程序,在運行時會出現如下錯誤信息:
Couldn't find installable ISAM.
Excel 版本:對於 Excel 95 工做簿(Excel 版本 7.0),應指定 Excel 5.0;對於 Excel 9七、Excel 2000 或 Excel 2002 (XP) 工做簿(Excel 版本 8.0、9.0 和 10.0),應指定 Excel 8.0 版本。
使用「數據連接屬性」對話框的 Jet 提供程序
若是在應用程序中使用「ADO 數據控件」或「數據環境」,就會出現數據連接屬性對話框來收集必要的鏈接設置。
-
在提供程序選項卡上,選擇 Jet 4.0 提供程序;Jet 3.51 提供程序不支持 Jet ISAM 驅動程序。若是指定了 Jet 3.51 提供程序,在運行時會出現如下錯誤信息:
Couldn't find installable ISAM.
-
在鏈接選項卡上,瀏覽到您的工做簿文件。忽略「用戶 ID」和「密碼」項,由於這些不適用於 Excel 鏈接。(沒法打開受密碼保護的 Excel 文件做爲數據源。本文後面有關於此主題的詳細信息。)
-
在全部選項卡上,從列表中選擇擴展屬性,而後單擊編輯值。輸入 Excel 8.0;,用分號 (;) 將其與任何其餘已有的項分隔。若是忽略此步驟,測試鏈接時將出現一條錯誤信息。這是由於,若是不另行指定,Jet 提供程序指望 Microsoft Access 數據庫。
-
返回到鏈接選項卡,並單擊 測試鏈接。將出現一個消息框,通知您測試已成功完成。
其餘 Jet 提供程序鏈接設置
列標題:默認狀況下,系統認爲 Excel 數據源的第一行包含可用做字段名的列標題。若是不是這種狀況,則必須將該設置關閉,不然,第一行數據將會「消失」,而被用做字段名稱。這可經過向鏈接字符串的擴展屬性添加可選的 HDR= 設置來完成。默認狀況下(無需指定)是 HDR=Yes。若是沒有列標題,則須要指定 HDR=No;提供程序將字段命名爲 F一、F2 等等。由於擴展屬性字符串如今包含了多個值,因此各值必須用雙引號括起來,再加一對雙引號,讓 Visual Basic 將第一層引號中的內容看成字面值,以下例所示(爲便於看清楚,添加了額外的空格)。
.ConnectionString = "Data Source=C:\MyFolder\MyWorkbook.xls;" & _
"Extended Properties=" " Excel 8.0; HDR=No;" " "
使用 Microsoft OLE DB Provider for ODBC Drivers
ODBC 驅動程序的提供程序(本文爲簡便起見將其稱爲「ODBC 提供程序」)也只須要兩條信息就能夠鏈接到 Excel 數據源:驅動程序名,以及工做簿的路徑和文件名。
重要說明:Excel 的 ODBC 鏈接默認爲只讀。ADO 記錄集 LockType 屬性設置不會覆蓋此鏈接級別的設置。若是想編輯數據,則必須將鏈接字符串或 DSN 配置中的 ReadOnly 設置爲 False。不然,將出現如下錯誤信息:
Operation must use an updateable query.
使用沒有 DSN 的鏈接字符串的 ODBC 提供程序
Dim cn as ADODB.Connection
Set cn = New ADODB.Connection
With cn
.Provider = "MSDASQL"
.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=C:\MyFolder\MyWorkbook.xls; ReadOnly=False;"
.Open
End With
使用帶有 DSN 的鏈接字符串的 ODBC 提供程序
Dim cn as ADODB.Connection
Set cn = New ADODB.Connection
With cn
.Provider = "MSDASQL"
.ConnectionString = "DSN=MyExcelDSN;"
.Open
End With
使用「數據連接屬性」對話框的 ODBC 提供程序
若是在應用程序中使用「ADO 數據控件」或「數據環境」,就會出現數據連接屬性對話框來收集必要的鏈接設置。
-
在提供程序選項卡上,選擇 Microsoft OLE DB Provider for ODBC Drivers。
-
在鏈接選項卡上,選擇想使用的現有 DSN,或選擇使用鏈接字符串。這將打開標準 DSN 配置對話框,收集必需的鏈接設置。若是須要,請不要忘記取消選擇默認只讀設置,如上文所述。
-
返回鏈接選項卡,而後單擊測試鏈接。將出現一個消息框,通知您測試已成功完成。
其餘 ODBC 提供程序鏈接設置
列標題:默認狀況下,系統認爲 Excel 數據源的第一行包含可用做字段名的列標題。若是不是這種狀況,則必須將該設置關閉,不然,第一行數據將會「消失」,而被用做字段名稱。這可經過向鏈接字符串添加可選的 FirstRowHasNames= 設置來完成。默認狀況下(無需指定)爲 FirstRowHasNames=1,其中 1 = True。若是沒有列標題,則須要指定 FirstRowHasNames=0,其中 0 = False;驅動程序將字段命名爲 F一、F2 等等。DSN 配置對話框中沒有此選項。
不過,因爲 ODBC 驅動程序中存在錯誤,目前指定 FirstRowHasNames 設置不起做用。換句話說,Excel ODBC 驅動程序(MDAC 2.1 和更高版本)始終把指定數據源中的第一行做爲字段名。 有關列標題錯誤的其餘信息,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章:
288343
(http://support.microsoft.com/kb/288343/ ) BUG:Excel ODBC 驅動程序忽略 FirstRowHasNames 或 Header 設置
要掃描的行數:Excel 不會像關係數據庫那樣爲 ADO 提供有關其數據的詳細架構信息。所以,驅動程序必須至少掃描幾行現有數據,纔能有根據地猜想各列的數據類型。「要掃描的行數」的默認值爲八 (8) 行。能夠指定從一 (1) 行到十六 (16) 行的整數值,或指定零 (0),掃描全部現有行。這可經過向鏈接字符串添加可選的 MaxScanRows= 設置,或在 DSN 配置對話框中更改要掃描的行數設置來完成。
可是,因爲 ODBC 驅動程序中存在一個錯誤,因此目前指定「要掃描的行數」(MaxScanRows) 設置不起做用。換句話說,Excel ODBC 驅動程序(MDAC 2.1 和更高版本)始終掃描指定數據源中的前 8 行,以肯定各列的數據類型。
有關「要掃描的行數」錯誤的其餘信息,包括一個簡單的替代方法,請單擊下面的文章編號,查看 Microsoft 知識庫中相應的文章:
189897
(http://support.microsoft.com/kb/189897/ ) XL97:使用 Excel ODBC 驅動程序數據截短到 255 個字符
其餘設置:若是是經過使用數據連接屬性對話框來構造鏈接字符串的,那麼您可能會注意到一些其餘的擴展屬性設置添加到了鏈接字符串中,而這些設置不必定有用,如:
... DefaultDir=C:\WorkbookPath;DriverId=790;FIL=excel 8.0;MaxBufferSize=2048;PageTimeout=5;
Visual Basic 編輯器中的「Collating Sequence」(排序順序)錯誤信息
使用某些版本的 MDAC 時,當您的程序在設計時第一次鏈接到 Excel 數據源時,Visual Basic 設計環境中將出現如下錯誤信息:
Selected collating sequence not supported by the operating system.
此信息僅出如今 IDE 中,而不會出如今編譯好的程序中。 有關其餘信息,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章:
246167
(http://support.microsoft.com/kb/246167/ ) PRB:首次在 Excel XLS 中打開 ADODB 記錄集時出現排序順序錯誤
使用這兩種 OLE DB 提供程序時都應考慮的問題
混用數據類型時應注意的事項
如上文所述,ADO 必須猜想 Excel 工做表或範圍中各列的數據類型。(這不受 Excel 單元格格式設置的影響。)若是同一列中既有數字值,也有文本值,會出現嚴重的問題。Jet 和 ODBC 提供程序將返回佔多數的類型的數據,但對於佔少數的數據類型,則會返回 NULL(空)值。若是該列中兩種類型數據的數量相等,提供程序將優先選擇數字型數據,放棄文本型數據。
例如:
-
在被掃描的八 (8) 行中,若是該列包含五 (5) 個數字值和三 (3) 個文本值,則提供程序將返回五 (5) 個數字和三 (3) 個空值。
-
在被掃描的八 (8) 行中,若是該列包含三 (3) 個數字值和五 (5) 個文本值,則提供程序將返回三 (3) 個空值和五 (5) 個文本值。
-
在被掃描的八 (8) 行中,若是該列包含四 (4) 個數字值和四 (4) 個文本值,則提供程序將返回四 (4) 個數字和四 (4) 個空值。
所以,若是列中包含不一樣類型的值,惟一的解決方法是將該列中的數字值存儲爲文本,而後在須要時使用 Visual Basic VAL 函數或同等功能的函數將其還原爲數字。
做爲解決只讀數據問題的一種替代方法,可在鏈接字符串的「擴展屬性」部分中使用「IMEX=1」這一設置來啓用導入模式。這可強制執行 ImportMixedTypes=Text 註冊表設置。但在此模式下,執行更新操做時可能會出現意外的結果。 有關此設置的其餘信息,請單擊下面的文章編號,查看 Microsoft 知識庫中相應的文章:
194124
(http://support.microsoft.com/kb/194124/ ) PRB:使用 DAO OpenRecordset 時 Excel 返回值爲 NULL
沒法打開受密碼保護的工做簿
若是您的 Excel 工做簿受密碼保護,即便在鏈接設置中提供了正確的密碼,也沒法打開它以訪問其數據,除非已在 Microsoft Excel 應用程序中打開了該工做簿文件。若是您嘗試這樣作,將出現如下錯誤信息:
Could not decrypt file.
有關其餘信息,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章:
211378
(http://support.microsoft.com/kb/211378/ ) XL2000:訪問受密碼保護的文件時,出現「Could Not Decrypt File」(沒法解密文件)錯誤
使用 ADO 檢索和編輯 Excel 數據
本節討論兩種處理 Excel 數據的方式:
如何選擇數據
有幾種選擇數據的方法。您能夠進行如下操做:
-
使用代碼選擇 Excel 數據。
-
使用 ADO 數據控件選擇 Excel 數據。
-
使用數據環境命令選擇 Excel 數據。
使用代碼選擇 Excel 數據
Excel 數據可能包含在工做簿中的如下一種對象內:
-
整張工做表。
-
工做表上的命名單元格區域。
-
工做表上的未命名單元格區域。
指定工做表
若要指定一張工做表做爲記錄源,請使用該工做表的名稱,後面帶有一個美圓字符,並用方括號將其括起。例如:
strQuery = "SELECT * FROM [Sheet1$]"
也可使用鍵盤上波形符 (~) 下的斜單引號字符 (`) 來分隔工做表名稱。例如:
strQuery = "SELECT * FROM `Sheet1$`"
Microsoft 建議使用方括號,這是用於表示未知數據庫對象名的標準約定。
若是將美圓符號和方括號所有省略,或只省略美圓符號,將出現如下錯誤信息:
... the Jet database engine could not find the specified object
若是使用美圓符號而忽略了方括號,將會看到如下錯誤信息:
Syntax error in FROM clause.
若是您嘗試使用普通單引號,將出現如下錯誤信息:
Syntax error in query.Incomplete query clause.
指定命名區域
若要指定命名的單元格區域做爲記錄源,只需使用定義的名稱。例如:
strQuery = "SELECT * FROM MyRange"
指定未命名區域
若要指定未命名的單元格區域做爲記錄源,請在工做表名的後面加上用標準 Excel 行/列表示法表示的區域,並用方括號將其括起。例如:
strQuery = "SELECT * FROM [Sheet1$A1:B10]"
指定工做表時應注意的事項:提供程序認爲數據表從指定工做表上最左上方的非空單元格開始。換句話說,數據表能夠從第 3 行,C 列開始,這沒有問題。但在這種狀況下,舉個例子來講,就不能在數據左上方的 A1 單元格中鍵入工做表標題。
指定區域時應注意的事項:指定工做表做爲記錄源時,提供程序將新記錄添加到工做表中現有記錄的下面(若是有可用空間)。指定區域(命名區域或未命名區域)時,Jet 也將新記錄添加到區域中現有記錄的下面(若是有可用空間)。可是,若是對原區域從新執行查詢,則獲得的記錄集不包含新添加到該區域外的記錄。
使用 2.5 版以前的 MDAC 時,若是指定了命名區域,則沒法將新記錄添加到該區域定義的界限以外,不然將出現如下錯誤信息:
Cannot expand named range.
使用 ADO 數據控件選擇 Excel 數據
在 ADODC 屬性對話框的常規選項卡上指定 Excel 數據源的鏈接設置後,單擊記錄源選項卡。若是選擇的 CommandType 爲 adCmdText,則可使用上文介紹的語法在命令文本對話框中輸入一個 SELECT 查詢。若是選擇的 CommandType 爲 adCmdTable,並且使用的是 Jet 提供程序,所選工做簿中的可用命名區域和工做表的名稱都會顯示在下拉列表中,命名區域排在前面。
此對話框會正確地在工做表名稱後面加上美圓符號,但不會添加必要的方括號。結果,若是隻選擇工做表名稱並單擊肯定,則稍後可能會收到如下錯誤信息:
Syntax error in FROM clause.
您必需手動在工做表名稱的先後加上方括號。(此組合框容許進行編輯。)若是使用的是 ODBC 提供程序,則在此下拉列表中只能看到命名區域。可是,能夠手動輸入帶有正確分隔符的工做表名稱。
使用數據環境命令選擇 Excel 數據
設置完 Excel 數據源的數據環境鏈接後,建立一個新的 Command 對象。若是選擇的數據源爲 SQL 語句,則可使用前面介紹的語法在文本框中輸入一個查詢。若是選擇的數據源爲數據庫對象,請在第一個下拉列表中選擇表,若是您使用的是 Jet 提供程序,所選工做簿中的可用命名區域和工做表名稱都會顯示在該下拉列表中,命名區域排在前面。(從該位置選擇工做表名稱時,不須要像在使用 ADO 數據控件時那樣在工做表名稱的先後加上方括號。)若是使用的是 ODBC 提供程序,則在此下拉列表中只能看到命名區域。可是,能夠手動輸入工做表名稱。
如何更改 Excel 數據:編輯、添加和刪除
編輯
可使用普通 ADO 方法來編輯 Excel 數據。對應於 Excel 工做表中包含 Excel 公式(以「=」開始)的單元格的記錄集字段是隻讀的,不能對其進行編輯。記住 Excel 的 ODBC 鏈接默認是隻讀的,除非在鏈接設置中另行指定。請參見上文中的「使用 Microsoft OLE DB Provider for ODBC Drivers」一節。
添加
若是有可用空間,能夠將記錄添加到 Excel 記錄源中。可是,若是將新記錄添加到了原來指定的區域以外,那麼在對原來指定的區域從新進行查詢時,將看不到這些記錄。請參見上文中「指定區域時應注意的事項」一節。
在某些情形中,使用 ADO Recordset 對象的 AddNew 和 Update 方法向 Excel 表插入新數據行時,ADO 可能會將數據值插入錯誤的列。 有關其餘信息,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章:
314763
(http://support.microsoft.com/kb/314763/ ) FIX:ADO 將數據插入 Excel 中錯誤的列
刪除
刪除 Excel 數據時,受到的限制要比從關係數據源中刪除數據時更多。在關係數據庫中,「行」除了表示一條「記錄」外沒有其餘意義;但在 Excel 工做表中卻不一樣。能夠刪除字段(單元格)中的值。但不能:
-
一次刪除一整條記錄,不然將出現如下錯誤信息:
Deleting data in a linked table is not supported by this ISAM.
只能經過分別清空各個字段的內容來刪除一條記錄。
-
刪除包含 Excel 公式的單元格中的值,不然將出現如下錯誤信息:
Operation is not allowed in this context.
-
雖然電子表格中已被刪除的數據原來所在的行如今是空行,但沒法將其刪除,並且記錄集將繼續顯示對應於這些空行的空記錄。
使用 ADO 編輯 Excel 數據時應注意的事項:使用 ADO 在 Excel 中插入文本數據時,文本值前面帶有一個單引號。這在後面處理新數據時可能會致使問題。
從 Excel 檢索數據源結構(元數據)
使用 ADO 能夠檢索有關 Excel 數據源(表和字段)的結構的數據。雖然使用兩種 OLE DB 提供程序時至少都返回相同數量(不多)字段的有用信息,但結果在二者之間仍有細微差異。使用 ADO Connection 對象的 OpenSchema 方法可檢索此元數據,該方法返回一個 ADO Recordset 對象。也可使用更強大的 Microsoft ActiveX Data Objects Extensions for Data Definition Language and Security (ADOX) 庫來檢索元數據。然而,對於 Excel 數據源,「表」既能夠是工做表也能夠是命名區域,而「字段」則是幾種有限的通常數據類型之一,因此這一附加的功能沒有什麼用處。
查詢表信息
在關係數據庫提供的各類對象中(表、視圖、存儲過程,等等),Excel 數據源僅提供至關於表的對象,它由指定工做簿中的工做表和定義的命名區域組成。命名區域被視爲「表」,而工做表被視爲「系統表」。除「table_type」屬性外,檢索不到太多有用的表信息。使用如下代碼能夠檢索工做簿中可用表的列表:
Set rs = cn.OpenSchema(adSchemaTables)
Jet 提供程序返回的記錄集包含九 (9) 個字段,但其中只有四 (4) 個字段有數據:
-
table_name
-
table_type(「表」或「系統表」)
-
date_created
-
date_modified
對於一個給定的表,兩個日期字段始終顯示相同的值,該值爲「最後修改日期」。換句話說,「date_created」不可靠。
ODBC 提供程序返回的記錄集也包含九 (9) 個字段,但其中只有三 (3) 個字段有數據:
根據 ADO 文檔,只檢索工做表列表是能夠作到的 — 例如經過向 OpenSchema 方法指定如下附加標準:
Set rs = cn.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "System Table"))
但遺憾的是,對於 Excel 數據源,若是使用的 MDAC 版本高於 2.0,不管使用哪一種提供程序此方法都不行。
查詢字段信息
Excel 數據源中的每一個字段(列)都屬於如下數據類型之一:
-
數字(ADO 數據類型 5,adDouble)
-
貨幣(ADO 數據類型 6,adCurrency)
-
邏輯或布爾值(ADO 數據類型 11,adBoolean)
-
日期(使用 Jet 時,爲 ADO 數據類型 7,adDate;使用 ODBC 時爲數據類型 135,adDBTimestamp)
-
文本(一種 ADO ad...Char 類型,例如,202,adVarChar;200,adVarWChar,或類似類型)
對於數字列,返回的 numeric_precision 始終爲 15(是 Excel 中的最大精度);對於文本列,返回的 character_maximum_length 始終爲 255(是 Excel 列中文本的最大顯示寬度,但不是最大長度)。除了 data_type 屬性以外,得不到多少有用的字段信息。使用如下代碼能夠檢索表中可用字段的列表:
Set rs = cn.OpenSchema(adSchemaTables, Array(Empty, Empty, "TableName", Empty))
Jet 提供程序返回的記錄集包含 28 個字段。對於數字字段,其中八 (8) 個有數據;對於文本字段,其中九 (9) 個有數據。有用的字段極可能是:
-
table_name
-
column_name
-
ordinal_position
-
data_type
ODBC 提供程序返回的記錄集包含 29 個字段。對於數字字段,其中十 (10) 個有數據;對於文本字段,其中 11 個有數據。有用的字段與上文所述相同。
枚舉表和字段及其屬性
可使用 Visual Basic 代碼(以下例所示)來枚舉 Excel 數據源中的表和列,以及有關各個表和列的可用信息。本示例將其結果輸出到同一窗體上的一個列表框 List1。
Dim cn As ADODB.Connection
Dim rsT As ADODB.Recordset
Dim intTblCnt As Integer, intTblFlds As Integer
Dim strTbl As String
Dim rsC As ADODB.Recordset
Dim intColCnt As Integer, intColFlds As Integer
Dim strCol As String
Dim t As Integer, c As Integer, f As Integer
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & App.Path & _
"\ExcelSrc.xls;Extended Properties=Excel 8.0;"
'.Provider = "MSDASQL"
'.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=" & App.Path & "\ExcelSrc.xls; "
.CursorLocation = adUseClient
.Open
End With
Set rsT = cn.OpenSchema(adSchemaTables)
intTblCnt = rsT.RecordCount
intTblFlds = rsT.Fields.Count
List1.AddItem "Tables: " & intTblCnt
List1.AddItem "--------------------"
For t = 1 To intTblCnt
strTbl = rsT.Fields("TABLE_NAME").Value
List1.AddItem vbTab & "Table #" & t & ": " & strTbl
List1.AddItem vbTab & "--------------------"
For f = 0 To intTblFlds - 1
List1.AddItem vbTab & rsT.Fields(f).Name & _
vbTab & rsT.Fields(f).Value
Next
List1.AddItem "--------------------"
Set rsC = cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, strTbl, Empty))
intColCnt = rsC.RecordCount
intColFlds = rsC.Fields.Count
For c = 1 To intColCnt
strCol = rsC.Fields("COLUMN_NAME").Value
List1.AddItem vbTab & vbTab & "Column #" & c & ": " & strCol
List1.AddItem vbTab & vbTab & "--------------------"
For f = 0 To intColFlds - 1
List1.AddItem vbTab & vbTab & rsC.Fields(f).Name & _
vbTab & rsC.Fields(f).Value
Next
List1.AddItem vbTab & vbTab & "--------------------"
rsC.MoveNext
Next
rsC.Close
List1.AddItem "--------------------"
rsT.MoveNext
Next
rsT.Close
cn.Close
使用數據視圖窗口
在Visual Basic 的「數據視圖」窗口中建立 Excel 數據源的數據連接時,「數據視圖」中顯示的信息與上文所述能夠經過編程方式檢索到的信息相同。特別應注意 Jet 提供程序將工做表和命名區域都列在「表」下,而 ODBC 提供程序僅在「表」下顯示命名區域。若是使用的是 ODBC 提供程序,並且未定義任何命名區域,「表」列表中將不顯示任何內容。
Excel 的限制
使用 Excel 做爲數據源受限於 Excel 工做簿和工做表的內部限制。這包括但不限於如下事件:
-
工做表大小:65,536 行,256 列
-
單元格內容(文本):32,767 個字符
-
工做簿中的工做表數:受可用內存限制
-
工做簿中的名稱數:受可用內存限制
有關如何在 Visual Basic .NET 中使用 ADO.NET 檢索和修改 Excel 工做簿中的記錄的更多信息,請單擊下面的文章編號,查看 Micro...
有關如何在 Visual Basic .NET 中使用 ADO.NET 檢索和修改 Excel 工做簿中的記錄的更多信息,請單擊下面的文章編號,查看 Microsoft 知識庫中相應的文章:
316934 (http://support.microsoft.com/kb/316934/ ) 如何在 Visual Basic .NET 中使用 ADO.NET 檢索和修改 Excel 工做簿中的記錄
有關其餘信息,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章:
295646
(http://support.microsoft.com/kb/295646/ ) 如何使用 ADO 將數據從 ADO 數據源傳輸到 Excel
246335
(http://support.microsoft.com/kb/246335/ ) 如何使用「自動化」功能將數據從 ADO 記錄集傳輸到 Excel
247412
(http://support.microsoft.com/kb/247412/ ) INFO:將數據從 Visual Basic 傳輸到 Excel 的方法
278973
(http://support.microsoft.com/kb/278973/ ) SAMPLE:ExcelADO 演示如何在 Excel 工做簿中使用 ADO 來讀寫數據
318373
(http://support.microsoft.com/kb/318373/ ) 如何使用 Visual Basic .NET 中的 GetOleDbSchemaTable 方法從 Excel 中檢索元數據
有關更多信息,請參閱如下 Microsoft 培訓和認證教程: