如何使用 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”之间混合了类型,则可能会出现以下三个错误:
- 适用于 ODBC 驱动程序的 Microsoft OLE DB 提供程序错误“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 test 20 Ee 工程 25 注意
- ADO 假定 Excel 查询中的第一行包含列标题。 因此,命名区域必须包含列标题。 这是与 DAO 不同的行为。
- 列标题不能是数字。 Excel 驱动程序无法解释它们,而是返回单元格引用。 例如,将错误解释“F1”的列标题。
(指向 ADOTest.xls 文件的 DSN) 创建 ODBC 系统数据源名称。
- 从控制面板打开 ODBC 管理员。
- 在“系统 DSN”选项卡上,单击“添加”。
- 选择“Microsoft Excel Driver (*.xls) ”,然后单击“完成”。 如果此选项不存在,则需要从 Excel 安装程序安装适用于 Excel 的 Microsoft ODBC 驱动程序。
- 选择“ADOExcel”作为“数据源名称”。
- 确保“版本”设置为正确的 Excel 版本。
- 单击“选择工作簿...”,浏览到 ADOTest.xls 文件,然后单击“确定”。
- 单击“选项>>”按钮并清除“只读”检查框。
- 单击“确定”,然后再次单击“确定”。
设置对 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.
创建新的 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 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈