Abfragen und Aktualisieren von Excel-Daten mithilfe von ADO aus ASP

Zusammenfassung

In diesem Artikel wird veranschaulicht, wie Sie Informationen in einer Excel-Kalkulationstabelle mithilfe von ActiveX Data Objects (ADO) von einer ASP-Seite (Active Server Pages) abfragen und aktualisieren. In diesem Artikel werden auch die Einschränkungen beschrieben, die mit diesem Anwendungstyp verbunden sind.

Wichtig

ASP/ADO-Anwendungen unterstützen zwar den Zugriff auf mehrere Benutzer, ein Excel-Arbeitsblatt hingegen nicht. Daher unterstützt diese Methode zum Abfragen und Aktualisieren von Informationen keinen gleichzeitigen Zugriff mit mehreren Benutzern.

Weitere Informationen

Verwenden Sie den Microsoft ODBC-Treiber für Excel, um auf die Daten in Ihrem Excel-Arbeitsblatt für dieses Beispiel zuzugreifen. Erstellen Sie eine Tabelle, um auf die Daten zuzugreifen, indem Sie einen benannten Bereich in Ihrer Excel-Kalkulationstabelle erstellen.

Schritte zum Erstellen einer Beispielanwendung

  • Erstellen Sie die Excel-Datei ADOtest.xls mit den folgenden Daten in sheet1:

    column1 column2 spalte3
    Rr das 15
    Bb test 20
    Ee Funktioniert 25

    Hinweis

    Wenn eine Spalte in Ihrer Excel-Tabelle sowohl Text als auch Zahlen enthält, kann der Excel-ODBC-Treiber den Datentyp der Spalte nicht richtig interpretieren. Stellen Sie sicher, dass alle Zellen in einer Spalte denselben Datentyp aufweisen. Die folgenden drei Fehler können auftreten, wenn jede Zelle in einer Spalte nicht denselben Typ aufweist oder wenn Sie die Typen zwischen "text" und "allgemein" gemischt haben:

    1. Fehler "80040e21" des Microsoft OLE DB-Anbieters für ODBC-Treiber. Die Anforderungseigenschaften können von diesem ODBC-Treiber nicht unterstützt werden.
    2. Fehler "80004005" des Microsoft OLE DB-Anbieters für ODBC-Treiber: Die Abfrage kann nicht aktualisiert werden, da sie keine durchsuchbaren Spalten enthält, die als hoffnungsvoller Schlüssel verwendet werden können.
    3. Fehler "80004005": Fehler beim abfragebasierten Update des Microsoft OLE DB-Anbieters für ODBC-Treiber. Die zu aktualisierende Zeile konnte nicht gefunden werden.
  • Erstellen Sie einen benannten Bereich, myRange1, in Ihrer Kalkulationstabelle:

    1. Markieren Sie den Zeilen- und Spaltenbereich, in dem sich Ihre Daten befinden.
    2. Zeigen Sie im Menü Einfügen auf Name, und klicken Sie auf Definieren.
    3. Geben Sie als Benannter Bereichsname den Namen myRange1 ein.
    4. Klicken Sie auf OK.

    Der benannte Bereich myRange1 enthält die folgenden Daten:

    column1 column2 spalte3
    Rr das 15
    Bb test 20
    Ee Funktioniert 25

    Hinweis

    • ADO geht davon aus, dass die erste Zeile in einer Excel-Abfrage die Spaltenüberschriften enthält. Daher muss der benannte Bereich die Spaltenüberschriften enthalten. Dies unterscheidet sich von DAO.
    • Spaltenüberschriften dürfen keine Zahl sein. Der Excel-Treiber kann sie nicht interpretieren und gibt stattdessen einen Zellbezug zurück. Beispielsweise würde eine Spaltenüberschrift von "F1" falsch interpretiert.
  • Erstellen Sie einen ODBC-Systemdatenquellennamen (DSN), der auf die ADOTest.xls-Datei verweist.

    1. Öffnen Sie im Systemsteuerung den ODBC-Administrator.
    2. Klicken Sie auf der Registerkarte System DSN auf Hinzufügen.
    3. Wählen Sie Microsoft Excel-Treiber (*.xls) aus, und klicken Sie auf Fertig stellen. Wenn diese Option nicht vorhanden ist, müssen Sie den Microsoft ODBC-Treiber für Excel über das Excel-Setup installieren.
    4. Wählen Sie ADOExcel als Datenquellenname aus.
    5. Stellen Sie sicher, dass die Version auf die richtige Version von Excel festgelegt ist.
    6. Klicken Sie auf "Arbeitsmappe auswählen...", navigieren Sie zur ADOTest.xls Datei, und klicken Sie auf OK.
    7. Klicken Sie auf die Schaltfläche "Optionen>>", und deaktivieren Sie das Kontrollkästchen "Schreibgeschützt".
    8. Klicken Sie auf OK und dann erneut auf OK.
  • Legen Sie Berechtigungen für die ADOTest.xls-Datei fest.

Wenn anonym auf Ihre Active Server-Seite zugegriffen wird, müssen Sie sicherstellen, dass das anonyme Konto (IUSR_<MachineName>) mindestens Über Lese-/Schreibzugriff (RW) auf das Arbeitsblatt verfügt. Wenn Sie Informationen aus dem Arbeitsblatt löschen möchten, müssen Sie die Entsprechenden Berechtigungen erteilen.

Wenn Sie den Zugriff auf Ihre Active Server-Seite authentifizieren, müssen Sie sicherstellen, dass alle Benutzer, die auf Ihre Anwendung zugreifen, über die entsprechenden Berechtigungen verfügen.

Wenn Sie nicht die entsprechenden Berechtigungen für das Arbeitsblatt festlegen, erhalten Sie eine Fehlermeldung ähnlich der folgenden:

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. Erstellen Sie eine neue ASP-Seite, und fügen Sie den folgenden Code ein:

       <!-- 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. Speichern Und benennen Sie Ihre Active Server-Seite, und zeigen Sie sie im Browser an. Folgendes wird angezeigt:

    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|
    

Hinweis

Für die erste Zeile ihres benannten Bereichs (nach den Überschriften) wurde eine Aktualisierung durchgeführt.