如何從 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」 之間混合了類型,就會發生下列三個錯誤:

    1. Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e21' 此 ODBC 驅動程式無法支援要求屬性。
    2. Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80004005' 查詢無法更新,因為它不包含可搜尋的數據行,可做為等候索引鍵使用。
    3. Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80004005' 查詢型更新失敗。 找不到要更新的數據列。
  • 在電子表格中建立命名範圍 myRange1:

    1. 反白顯示數據 () 和數據行 (數據所在) 區域。
    2. 在 [插入] 功能表上,指向 [名稱],然後按下 [定義]。
    3. 輸入名稱 myRange1 作為命名範圍名稱。
    4. 按一下 [確定]。

    具名範圍 myRange1 包含下列數據:

    column1 column2 column3
    Rr 15
    Bb 測試 20
    Ee 工程 25

    注意事項

    • ADO 假設 Excel 查詢中的第一個數據列包含數據行標題。 因此,具名範圍必須包含數據行標題。 這與 DAO 的行為不同。
    • 數據行標題不可以是數位。 Excel 驅動程式無法解譯它們,而是傳回單元格參考。 例如,“F1” 的數據行標題會被錯誤解譯。
  • 建立指向 ADOTest.xls 檔案的 ODBC 系統數據源名稱 (DSN) 。

    1. 從 控制台,開啟 ODBC 系統管理員。
    2. 在 [系統 DSN] 索引標籤上,按兩下 [新增]。
    3. 選取 [Microsoft Excel Driver (*.xls) ],然後按兩下 [完成]。 如果此選項不存在,您必須從 Excel 安裝程式安裝 Microsoft ODBC Driver for Excel。
    4. 選擇 [ADOExcel] 作為 [數據源名稱]。
    5. 請確定 [版本] 已設定為正確的 Excel 版本。
    6. 按兩下 [選取活頁簿...],流覽至 ADOTest.xls 檔案,然後按兩下 [確定]。
    7. 按兩下 [選項]>> 按鈕,並清除 [只讀] 複選框。
    8. 按兩下 [確定],然後再按兩下 [確定]。
  • 設定 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.
  1. 建立新的 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 -->
    
  2. 儲存並命名您的使用中伺服器頁面,並在瀏覽器中檢視它。 您會看到下列訊息:

    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|
    

注意事項

在標題) 之後,已在命名範圍 (的第一個數據列上執行更新。