如何使用 ASP 中的 ADO 查询和更新 Excel 数据

摘要

本文演示如何使用 ActiveX 数据对象 (ADO) 从 Active Server Pages (ASP) 页查询和更新 Excel 电子表格中的信息。 本文还介绍了与此类应用程序关联的限制。

重要

尽管 ASP/ADO 应用程序支持多用户访问,但 Excel 电子表格不支持。 因此,这种查询和更新信息的方法不支持多用户并发访问。

更多信息

若要访问本示例的 Excel 电子表格中的数据,请使用 Microsoft ODBC Driver for Excel。 通过在 Excel 电子表格中创建命名区域,创建用于访问数据的表。

创建示例应用程序的步骤

  • 在 sheet1 中使用以下数据创建 Excel 文件 ADOtest.xls:

    column1 column2 column3
    Rr 15
    Bb test 20
    Ee 工程 25

    注意

    如果 Excel 电子表格中的列同时包含文本和数字,则 Excel ODBC 驱动程序无法正确解释该列应为哪种数据类型。 请确保列中的所有单元格都具有相同的数据类型。 如果列中的每个单元格的类型不同,或者“text”和“general”之间混合了类型,则可能会出现以下三个错误:

    1. 适用于 ODBC 驱动程序的 Microsoft OLE DB 提供程序错误“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 test 20
    Ee 工程 25

    注意

    • ADO 假定 Excel 查询中的第一行包含列标题。 因此,命名区域必须包含列标题。 这是与 DAO 不同的行为。
    • 列标题不能是数字。 Excel 驱动程序无法解释它们,而是返回单元格引用。 例如,将错误解释“F1”的列标题。
  • (指向 ADOTest.xls 文件的 DSN) 创建 ODBC 系统数据源名称。

    1. 从控制面板打开 ODBC 管理员。
    2. 在“系统 DSN”选项卡上,单击“添加”。
    3. 选择“Microsoft Excel Driver (*.xls) ”,然后单击“完成”。 如果此选项不存在,则需要从 Excel 安装程序安装适用于 Excel 的 Microsoft ODBC 驱动程序。
    4. 选择“ADOExcel”作为“数据源名称”。
    5. 确保“版本”设置为正确的 Excel 版本。
    6. 单击“选择工作簿...”,浏览到 ADOTest.xls 文件,然后单击“确定”。
    7. 单击“选项>>”按钮并清除“只读”检查框。
    8. 单击“确定”,然后再次单击“确定”。
  • 设置对 ADOTest.xls 文件的权限。

如果活动服务器页是匿名访问的,则需要确保匿名帐户 (IUSR_< MachineName>) 至少具有读/写 (RW) 电子表格的访问权限。 如果要从电子表格中删除信息,则需要相应地授予权限。

如果要对活动服务器页的访问权限进行身份验证,则需要确保所有访问应用程序的用户都具有相应的权限。

如果未对电子表格设置适当的权限,则会收到类似于以下内容的错误消息:

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|
    

注意

在标题) 之后,已对命名范围 (的第一行执行更新。