如何從 ASP 使用 ADO 查詢及更新 Excel 數據
摘要
本文示範如何從 Active Server Pages (ASP) 頁面使用 ActiveX Data Objects (ADO) 查詢及更新 Excel 電子表格中的資訊。 本文也會說明與這種應用程式類型相關聯的限制。
重要事項
雖然 ASP/ADO 應用程式支援多使用者存取,但 Excel 電子表格則不支援。 因此,這個查詢和更新資訊的方法不支援多使用者並行存取。
其他相關資訊
若要存取此範例 Excel 電子表格中的數據,請使用 Microsoft ODBC Driver for Excel。 在 Excel 電子表格中建立具名範圍,以建立數據表來存取數據。
建立範例應用程式的步驟
在 sheet1 中使用下列數據建立 Excel 檔案 ADOtest.xls:
column1 column2 column3 Rr 這 15 Bb 測試 20 Ee 工程 25 注意事項
如果您 Excel 電子表格中的數據行同時包含文字和數位,則 Excel ODBC 驅動程式無法正確解譯數據行應該為的數據類型。 請確定數據列中的所有數據格都是相同的數據類型。 如果數據行中的每個儲存格都不是相同類型,或您在 「text」 和 「general」 之間混合了類型,就會發生下列三個錯誤:
- Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e21' 此 ODBC 驅動程式無法支援要求屬性。
- Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80004005' 查詢無法更新,因為它不包含可搜尋的數據行,可做為等候索引鍵使用。
- Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80004005' 查詢型更新失敗。 找不到要更新的數據列。
在電子表格中建立命名範圍 myRange1:
- 反白顯示數據 () 和數據行 (數據所在) 區域。
- 在 [插入] 功能表上,指向 [名稱],然後按下 [定義]。
- 輸入名稱 myRange1 作為命名範圍名稱。
- 按一下 [確定]。
具名範圍 myRange1 包含下列數據:
column1 column2 column3 Rr 這 15 Bb 測試 20 Ee 工程 25 注意事項
- ADO 假設 Excel 查詢中的第一個數據列包含數據行標題。 因此,具名範圍必須包含數據行標題。 這與 DAO 的行為不同。
- 數據行標題不可以是數位。 Excel 驅動程式無法解譯它們,而是傳回單元格參考。 例如,“F1” 的數據行標題會被錯誤解譯。
建立指向 ADOTest.xls 檔案的 ODBC 系統數據源名稱 (DSN) 。
- 從 控制台,開啟 ODBC 系統管理員。
- 在 [系統 DSN] 索引標籤上,按兩下 [新增]。
- 選取 [Microsoft Excel Driver (*.xls) ],然後按兩下 [完成]。 如果此選項不存在,您必須從 Excel 安裝程式安裝 Microsoft ODBC Driver for Excel。
- 選擇 [ADOExcel] 作為 [數據源名稱]。
- 請確定 [版本] 已設定為正確的 Excel 版本。
- 按兩下 [選取活頁簿...],流覽至 ADOTest.xls 檔案,然後按兩下 [確定]。
- 按兩下 [選項]>> 按鈕,並清除 [只讀] 複選框。
- 按兩下 [確定],然後再按兩下 [確定]。
設定 ADOTest.xls 檔案的許可權。
如果您的 Active Server Page 是以匿名方式存取,您必須確定匿名帳戶 (IUSR_< MachineName>) 至少具有讀取/寫入 (RW) 電子表格的存取權。 如果您想要從電子表格中刪除資訊,您需要據以授與許可權。
如果您要驗證 Active Server Page 的存取權,您必須確保所有存取您應用程式的使用者都具有適當的許可權。
如果您未在電子表格上設定適當的許可權,您會收到類似下列的錯誤訊息:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Excel Driver] The Microsoft Jet database engine cannot open the file '(unknown)'. It is already opened exclusively by another user, or you need permission to view its data.
建立新的 ASP 頁面,並貼上下列程式代碼:
<!-- Begin ASP Source Code --> <%@ LANGUAGE="VBSCRIPT" %> <% Set objConn = Server.CreateObject("ADODB.Connection") objConn.Open "ADOExcel" Set objRS = Server.CreateObject("ADODB.Recordset") objRS.ActiveConnection = objConn objRS.CursorType = 3 'Static cursor. objRS.LockType = 2 'Pessimistic Lock. objRS.Source = "Select * from myRange1" objRS.Open %> <br> <% Response.Write("Original Data") 'Printing out original spreadsheet headings and values. 'Note that the first recordset does not have a "value" property 'just a "name" property. This will spit out the column headings. Response.Write("<TABLE><TR>") For X = 0 To objRS.Fields.Count - 1 Response.Write("<TD>" & objRS.Fields.Item(X).Name & "</TD>") Next Response.Write("</TR>") objRS.MoveFirst While Not objRS.EOF Response.Write("<TR>") For X = 0 To objRS.Fields.Count - 1 Response.write("<TD>" & objRS.Fields.Item(X).Value) Next objRS.MoveNext Response.Write("</TR>") Wend Response.Write("</TABLE>") 'The update is made here objRS.MoveFirst objRS.Fields(0).Value = "change" objRS.Fields(1).Value = "look" objRS.Fields(2).Value = "30" objRS.Update 'Printing out spreadsheet headings and values after update. Response.Write("<br>Data after the update") Response.Write("<TABLE><TR>") For X = 0 To objRS.Fields.Count - 1 Response.Write("<TD>" & objRS.Fields.Item(X).Name & "</TD>") Next Response.Write("</TR>") objRS.MoveFirst While Not objRS.EOF Response.Write("<TR>") For X = 0 To objRS.Fields.Count - 1 Response.write("<TD>" & objRS.Fields.Item(X).Value) Next objRS.MoveNext Response.Write("</TR>") Wend Response.Write("</TABLE>") 'ADO Object clean up. objRS.Close Set objRS = Nothing objConn.Close Set objConn = Nothing %> <!-- End ASP Source Code -->
儲存並命名您的使用中伺服器頁面,並在瀏覽器中檢視它。 您會看到下列訊息:
Original Data: |column1|column2|column3| |------------|------------|------------| |rr|this|30| |bb|test|20| |tt|works|25| Data after the update: |column1|column2|column3| |------------|------------|------------| |change|look|30| |bb|test|20| |tt|works|25|
注意事項
在標題) 之後,已在命名範圍 (的第一個數據列上執行更新。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應