Consulta y actualización de datos de Excel mediante ADO desde ASP

Resumen

En este artículo se muestra cómo consultar y actualizar información en una hoja de cálculo de Excel mediante Objetos de datos ActiveX (ADO) desde una página de Active Server Pages (ASP). En el artículo también se describen las limitaciones asociadas a este tipo de aplicación.

Importante

Aunque las aplicaciones ASP/ADO admiten el acceso multiusuario, una hoja de cálculo de Excel no lo hace. Por lo tanto, este método de consulta y actualización de información no admite el acceso simultáneo de varios usuarios.

Más información

Para acceder a los datos de la hoja de cálculo de Excel de este ejemplo, use microsoft ODBC Driver for Excel. Cree una tabla para acceder a los datos mediante la creación de un rango con nombre en la hoja de cálculo de Excel.

Pasos para crear una aplicación de ejemplo

  • Cree el ADOtest.xls de archivo de Excel con los siguientes datos en sheet1:

    column1 columna 2 column3
    Rr éste 15
    Bb test 20
    ee Obras 25

    Nota:

    Si una columna de la hoja de cálculo de Excel contiene texto y números, el controlador ODBC de Excel no puede interpretar correctamente qué tipo de datos debe ser la columna. Asegúrese de que todas las celdas de una columna son del mismo tipo de datos. Los tres errores siguientes pueden producirse si cada celda de una columna no es del mismo tipo o si tiene los tipos mezclados entre "text" y "general":

    1. Error "80040e21" Del proveedor OLE DB de Microsoft para controladores ODBC, las propiedades de la solicitud no pueden ser compatibles con este controlador ODBC.
    2. Error '80004005' del proveedor OLE DB de Microsoft para controladores ODBC La consulta no se puede actualizar porque no contiene columnas que se puedan buscar para usarlas como clave de esperanza.
    3. Error de actualización basada en consultas del proveedor OLE DB de Microsoft para controladores ODBC "80004005". No se encontró la fila que se va a actualizar.
  • Cree un rango con nombre, myRange1, en la hoja de cálculo:

    1. Resalte las filas y el área de columnas donde residen los datos.
    2. En el menú Insertar, seleccione Nombre y haga clic en Definir.
    3. Escriba el nombre myRange1 para el nombre del rango con nombre.
    4. Haga clic en Aceptar.

    El rango con nombre myRange1 contiene los datos siguientes:

    column1 columna 2 column3
    Rr éste 15
    Bb test 20
    ee Obras 25

    Nota:

    • ADO supone que la primera fila de una consulta de Excel contiene los encabezados de columna. Por lo tanto, el rango con nombre debe incluir los encabezados de columna. Este comportamiento es diferente al de DAO.
    • Los encabezados de columna no pueden ser un número. El controlador de Excel no puede interpretarlos y, en su lugar, devuelve una referencia de celda. Por ejemplo, un encabezado de columna de "F1" se interpretaría mal.
  • Cree un nombre de origen de datos del sistema ODBC (DSN) que apunte al archivo ADOTest.xls.

    1. En el Panel de control, abra el administrador de ODBC.
    2. En la pestaña DSN del sistema, haga clic en Agregar.
    3. Seleccione Controlador de Microsoft Excel (*.xls) y haga clic en Finalizar. Si esta opción no existe, debe instalar el controlador ODBC de Microsoft para Excel desde la instalación de Excel.
    4. Elija ADOExcel para el nombre del origen de datos.
    5. Asegúrese de que la versión está establecida en la versión correcta de Excel.
    6. Haga clic en "Seleccionar libro...", vaya al archivo ADOTest.xls y haga clic en Aceptar.
    7. Haga clic en el botón "Opciones>>" y desactive la casilla "Solo lectura".
    8. Haga clic en Aceptar y, a continuación, haga clic en Aceptar de nuevo.
  • Establezca permisos en el archivo ADOTest.xls.

Si se accede a la página de Active Server de forma anónima, debe asegurarse de que la cuenta anónima (IUSR_<MachineName>) tenga al menos acceso de lectura y escritura (RW) a la hoja de cálculo. Si desea eliminar información de la hoja de cálculo, debe conceder los permisos correspondientes.

Si va a autenticar el acceso a la página de Active Server, debe asegurarse de que todos los usuarios que acceden a la aplicación tienen los permisos adecuados.

Si no establece los permisos adecuados en la hoja de cálculo, recibirá un mensaje de error similar al siguiente:

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. Cree una nueva página ASP y pegue el código siguiente:

       <!-- 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. Guarde y asigne un nombre a la página de Active Server y su visualización en el explorador. Aparecerá lo siguiente:

    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|
    

Nota:

Se realizó una actualización en la primera fila del rango con nombre (después de los encabezados).