Verwenden von ADO.NET zum Abrufen und Ändern von Datensätzen in einer Excel-Arbeitsmappe mit Visual Basic .NET

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 316934 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
316934 How To Use ADO.NET to Retrieve and Modify Records in an Excel Workbook With Visual Basic .NET
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Artikel beschreibt, wie Sie mit ADO.NET Daten aus einer Microsoft Excel-Arbeitsmappe abrufen, Daten in einer vorhandenen Arbeitsmappe ändern oder Daten zu einer neuen Arbeitsmappe hinzufügen können. Sie können den Jet OLE DB-Provider verwenden, um mit ADO.NET auf Excel-Arbeitsmappen zuzugreifen. Dieser Artikel liefert Ihnen die Informationen, die Sie für die Verwendung des Jet OLE DB-Provider benötigen, wenn Excel die Zieldatenquelle ist.

Verwendung des Jet OLE DB-Provider mit Microsoft Excel-Arbeitsmappen

Mit dem Microsoft Jet-Datenbankmodul können Sie über nachträglich zu installierende ISAM-Treiber (ISAM = Indexed Sequential Access Method) auf Daten in Dateien zusätzlicher Datenbankformate zugreifen, z. B. auf Excel-Arbeitsmappen. Geben Sie den Datenbanktyp in den erweiterten Eigenschaften ("Extended Properties") für die Verbindung an, um externe Formate zu öffnen, die vom Microsoft Jet 4.0 OLE DB Provider unterstützt werden. Der Jet OLE DB Provider unterstützt in Verbindung mit Excel-Arbeitsmappen die folgenden Datenbanktypen:
Excel 3.0
Excel 4.0
Excel 5.0
Excel 8.0
Hinweis: Verwenden Sie den Quelldatenbanktyp "Excel 5.0" für Arbeitsmappen in Microsoft Excel 5.0 und 7.0 (95) und den Quelldatenbanktyp "Excel 8.0" für Arbeitsmappen in Microsoft Excel 8.0 (97), 9.0 (2000) und 10.0 (2002). Die Beispiele in diesem Artikel verwenden Excel-Arbeitsmappen im Excel 2000- und Excel 2002-Format.

Verbindungszeichenfolge

Verwenden Sie eine Verbindungszeichenfolge mit folgender Syntax, um mit dem Jet OLE DB-Provider auf eine Excel-Arbeitsmappe zuzugreifen:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Book1.xls;Extended Properties="Excel 8.0;HDR=YES;"
Geben Sie in der Verbindungszeichenfolge den vollständigen Pfad und Dateinamen für die Arbeitsmappe im Parameter Data Source an. Der Parameter Extended Properties kann zwei Eigenschaften enthalten: eine Eigenschaft für die ISAM-Version und eine Eigenschaft, die angibt, ob die Tabelle(n) Kopfzeilen enthält bzw. enthalten.

Bei Excel-Arbeitsmappen ist die erste Zeile in einem Bereich standardmäßig die Kopfzeile (Feldnamen). Wenn die erste Zeile Spaltenüberschriften enthält, können Sie in den erweiterten Eigenschaften der Verbindungszeichenfolge HDR=NO angeben. Wenn Sie in der Verbindungszeichenfolge HDR=NO angeben, vergibt der Jet OLE DB-Provider automatisch Namen für die Felder (F1 für das erste Feld, F2 für das zweite Feld usw.).

Datentypen

Im Gegensatz zu herkömmlichen Datenbanken gibt es bei Excel-Tabellen keine Möglichkeit, die Datentypen der Spalten direkt zu bestimmen. Der OLE DB Provider untersucht stattdessen eine acht Zeilen in einer Spalte, um den Datentyp des Feldes zu erraten. Sie können die Anzahl der zu durchsuchenden Zeilen ändern, indem Sie in den "Extended Properties" Ihrer Verbindungszeichenfolge einen Wert zwischen eins (1) und sechzehn (16) für die Einstellung MAXSCANROWS angeben.

Konventionen für die Benennung von Tabellen

Sie können auf mehrere Arten auf eine Tabelle oder einen Bereich in einer Excel-Arbeitsmappe verweisen:
  • Verwenden Sie den Namen des Tabellenblattes, gefolgt von einem Dollarzeichen (z. B. [Sheet1$] oder [My Worksheet$]). Eine Tabelle in einer Arbeitsmappe, auf die so verwiesen wurde, besteht aus dem gesamten Bereich, der von dem Tabellenblatt aufgespannt wird.
    Select * from [Sheet1$]
  • Verwenden Sie einen Bereich mit einem festgelegten Namen (z. B. [MyNamedRange]).
    Select * from [MyNamedRange]
  • Verwenden Sie einen Bereich mit einer bestimmten Adresse (z. B. [Sheet1$A1:B10]).
    Select * from [Sheet1$]
Hinweis: Das auf den Tabellennamen folgende Dollarzeichen zeigt an, dass die Tabelle vorhanden ist. Wenn Sie eine neue Tabelle erstellen wie im Abschnitt Neue Arbeitsmappen und Tabellen erstellen in diesem Artikel beschrieben, verwenden Sie das Dollarzeichen nicht.

Verwendung von Excel-Arbeitsmappen als ADO.NET-Datenquellen

Datensätze abrufen

Sie haben in ADO.NET zwei Möglichkeiten, Sätze aus einer Datenbank abzurufen: mit einem DataSet oder einem DataReader.

Ein Dataset ist ein Cache mit Datensätzen, die aus einer Datenquelle abgerufen wurden.Bei den Daten im Dataset handelt es sich in der Regel um eine stark reduzierte Version des Datenbankinhalts.Sie können damit jedoch ohne Verbindung zur Datenbank genauso arbeiten wie mit den eigentlichen Daten. Neben dem Abrufen von Daten können Sie ein DataSet auch zur Aktualisierung der zu Grunde liegenden Datenbank verwenden.

Alternativ können Sie einen DataReader verwenden, um einen schreibgeschützten, vorwärtsgerichteten Datenstrom von einer Datenbank abzurufen. Durch die Verwendung des DataReader-Programms verbessert sich die Leistung, und die Systembelastung verringert sich, da sich jeweils nur eine Zeile im Speicher befindet. Wenn Sie ein großes Datenvolumen abzurufen haben und nicht beabsichtigen, die zu Grunde liegende Datenbank zu ändern, ist ein DataReader gegenüber einem Dataset zu bevorzugen.

Datensätze hinzufügen und aktualisieren

ADO.NET bietet drei Möglichkeiten, Datensätze in einer Arbeitsmappe einzufügen und zu aktualisieren:
  • Führen Sie einen Befehl direkt aus, um Datensätze einzeln nacheinander einzufügen oder zu aktualisieren. Dazu können Sie ein OLEDbCommand-Objekt für Ihre Verbindung erstellen und seine Eigenschaft CommandText auf einen gültigen Befehl zum Einfügen von Datensätzen

    INSERT INTO [Sheet1$] (F1, F2) values ('111', 'ABC')
    oder einen Befehl zum Aktualisieren von Datensätzen

    UPDATE [Sheet1$] SET F2 = 'XYZ' WHERE F1 = '111'
    einstellen und dann die Methode ExecuteNonQuery aufrufen.
  • Ändern Sie ein DataSet, das Sie mit einer Tabelle/Abfrage aus einer Excel-Arbeitsmappe gefüllt haben, und rufen Sie dann die Methode Update des DataAdapter auf, um die Arbeitsmappe mit den Änderungen aus dem DataSet zu aktualisieren. Um jedoch die Methode Update für die Aktualisierung verwenden zu können, müssen Sie parametrisierte Befehle für den InsertCommand
    INSERT INTO [Sheet1$] (F1, F2) values (?, ?)
    und UpdateCommand des DataAdapter verwenden:
     UPDATE [Sheet1$] SET F2 = ? WHERE F1 = ?
    Parametrisierte INSERT- und UPDATE-Befehle sind erforderlich, da der OleDbDataAdapter keine Schlüssel-/Indexinformationen für Excel-Arbeitsmappen liefert. Ohne Schlüssel-/Indexfelder kann der CommandBuilder die Befehle nicht automatisch generieren.
  • Exportieren Sie Daten aus einer anderen Datenquelle in eine Excel-Arbeitsmappe, vorausgesetzt, die andere Datenquelle kann in Verbindung mit dem Jet OLE DB-Provider verwendet werden. Zu den Datenquellen, die Sie auf diese Weise in Verbindung mit dem Jet OLE DB-Provider verwenden können, gehören Textdateien, Microsoft Access-Datenbanken und natürlich andere Excel-Arbeitsmappen.Mit einem einzigen INSERT INTO-Befehl können Sie Daten aus einer anderen Tabelle/Abfrage in Ihre Arbeitsmappe exportieren:
     INSERT INTO [Sheet1$] IN 'C:\Book1.xls' 'Excel 8.0;' SELECT * FROM MyTable"
    INSERT INTO setzt voraus, dass die Zieltabelle (oder das Arbeitsblatt) bereits vorhanden ist; die Daten werden an die Zieltabelle angehängt.

    Sie können Ihre Tabelle/Abfrage auch mit SELECT..INTO in eine Arbeitsmappe exportieren:
     SELECT * INTO [Excel 8.0;Database=C:\Book1.xls].[Sheet1] FROM [MyTable]
    Wenn Sie SELECT..INTO verwenden und die Zieltabelle oder -arbeitsmappe nicht existiert, wird sie erstellt. Wenn die Tabelle bereits vorhanden ist, bevor der Befehl SELECT..INTO ausgegeben wird, wird eine Fehlermeldung angezeigt.
Der Abschnitt Beispielcode in diesem Artikel veranschaulicht die verschiedenen Möglichkeiten zum Hinzufügen und Aktualisieren von Datensätzen in einer Arbeitsmappe.

Datensätze löschen

Zwar können Sie mit dem Jet OLE DB-Provider Datensätze in einer Excel-Arbeitsmappe einfügen und aktualisieren, Löschvorgänge sind jedoch nicht möglich. Wenn Sie versuchen, einen oder mehrere Datensätze zu löschen, wird folgende Fehlermeldung angezeigt:
DISAM unterstützt das Löschen von Daten in einer verknüpften Tabelle nicht.
Diese Einschränkung hängt mit der Behandlung von Excel-Arbeitsmappen als Datenbanken zusammen.

Neue Arbeitsmappen und Tabellen erstellen

Führen Sie den Befehl CREATE TABLE aus, um eine Tabelle in einer Excel-Arbeitsmappe zu erstellen:
CREATE TABLE Sheet1 (F1 char(255), F2 char(255))
Wenn Sie diesen Befehl ausführen, wird ein neues Arbeitsblatt mit dem Namen der Tabelle erstellt, den Sie im Befehl angegeben haben.
CREATE TABLE Sheet1 (F1 char(255), F2 char(255))
Wenn die Arbeitsmappe für die Verbindung nicht vorhanden ist, wird sie erstellt.

Sample CodeDer Abschnitt Beispielcode veranschaulicht, wie Sie mit dem Befehl CREATE TABLE eine neue Arbeitsmappe und Tabelle erstellen können.

Vorgehensweise

Beispielcode

  1. Starten Sie ein neues Microsoft Visual Basic .NETWindows-Anwendungs-Objekt.

    Form1 wird standardmäßig erstellt.
  2. Fügen Sie in Form1 sechs Optionsfeld-Steuerelemente und ein Schaltflächen-Steuerelement hinzu.
  3. Markieren Sie alle Optionsfeld-Steuerelemente und stellen Sie die Eigenschaft Size (Größe) auf 200,24 ein.
  4. Klicken Sie im Menü Ansicht auf Code.
  5. Fügen Sie die folgende Zeile ganz am Anfang des Codemoduls hinzu:
    Imports System.Data.OleDb
  6. Fügen Sie in der Klasse Form den folgenden Code ein:
    Private m_sConn1 As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                   "Data Source=C:\ExcelData1.xls;" & _
                   "Extended Properties=""Excel 8.0;HDR=YES"""
    
    Private m_sConn2 As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                   "Data Source=C:\ExcelData2.xls;" & _
                   "Extended Properties=""Excel 8.0;HDR=YES"""
    
    Private m_sNorthwind = _
          "C:\Program Files\Microsoft Office\Office10\Samples\Northwind.mdb"
    
    Private m_sAction As String
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
          RadioButton1.Text = "Create_Workbook"
          RadioButton2.Text = "Retrieve_Records"
          RadioButton3.Text = "Add_Records"
          RadioButton4.Text = "Update_Records"
          RadioButton5.Text = "Update_Individual_Cells"
          RadioButton6.Text = "Use_External_Source"
          Button1.Text = "Go!"
    End Sub
    
    Private Sub RadioButtons_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
          Handles RadioButton1.Click, RadioButton2.Click, RadioButton3.Click, _
          RadioButton4.Click, RadioButton5.Click, RadioButton6.Click
          m_sAction = sender.Text'Store the text for the selected radio button
    End Sub
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
          Try
             ' Call the associated routine to add/update/modify the workbook.
             Select Case m_sAction
                Case "Create_Workbook" : Create_Workbook()
                Case "Retrieve_Records" : Retrieve_Records()
                Case "Add_Records" : Add_Records()
                Case "Update_Records" : Update_Records()
                Case "Update_Individual_Cells" : Update_Individual_Cells()
                Case "Use_External_Source" : Use_External_Source()
             End Select
    
          Catch ex As OleDbException
             Dim er As OleDbError
             For Each er In ex.Errors
                MsgBox(er.Message)
             Next
          Catch ex2 As System.InvalidOperationException
             MsgBox(ex2.Message)
          End Try
    
    
    End Sub
    
    Public Sub Create_Workbook()
    
          ' If the workbooks already exist, prompt to delete.
          Dim answer As MsgBoxResult
          If Dir("C:\ExcelData1.xls") <> "" Or Dir("C:\ExcelData2.xls") <> "" Then
              answer = MsgBox("Delete existing workbooks (C:\ExcelData1.xls and " & _
                       "C:\ExcelData2.xls)?", MsgBoxStyle.YesNo)
              If answer = MsgBoxResult.Yes Then
                  If Dir("C:\ExcelData1.xls") <> "" Then Kill("C:\ExcelData1.xls")
                  If Dir("C:\ExcelData2.xls") <> "" Then Kill("C:\ExcelData2.xls")
              Else
                  Exit Sub
              End If
          End If
    
    '==========================================================================
          ' Create a workbook with a table named EmployeeData. The table has 3 
          ' fields: ID (char 255), Name (char 255) and Birthdate (date).  
    '==========================================================================
          Dim conn As New OleDbConnection()
          conn.ConnectionString = m_sConn1
          conn.Open()
          Dim cmd1 As New OleDbCommand()
          cmd1.Connection = conn
          cmd1.CommandText = "CREATE TABLE EmployeeData (Id char(255), Name char(255), BirthDate date)"
          cmd1.ExecuteNonQuery()
          cmd1.CommandText = "INSERT INTO EmployeeData (Id, Name, BirthDate) values ('AAA', 'Andrew', '12/4/1955')"
          cmd1.ExecuteNonQuery()
          conn.Close()
    
    '==========================================================================
          ' Create a workbook with a table named InventoryData. The table has 3 
          ' fields: Product (char 255), Qty (float) and Price (currency). 
    '==========================================================================
    
          conn.ConnectionString = m_sConn2
          conn.Open()
          Dim cmd2 As New OleDbCommand()
          cmd2.Connection = conn
          cmd2.CommandText = "CREATE TABLE InventoryData (Product char(255), Qty float, Price currency)"
          cmd2.ExecuteNonQuery()
          cmd2.CommandText = "INSERT INTO InventoryData (Product, Qty, Price) values ('Cola', 200, 1.35)"
          cmd2.ExecuteNonQuery()
          cmd2.CommandText = "INSERT INTO InventoryData (Product, Qty, Price) values ('Chips', 550, 0.89)"
          cmd2.ExecuteNonQuery()
          conn.Close()
    
          ' NOTE: You can ALTER and DROP tables in a similar fashion.
    
    End Sub
    
    Public Sub Retrieve_Records()
    
          '==========================================================
          'Use a DataReader to read data from the EmployeeData table.
          '==========================================================
    
          Dim conn1 As New System.Data.OleDb.OleDbConnection(m_sConn1)
          conn1.Open()
          Dim cmd1 As New System.Data.OleDb.OleDbCommand("Select * From [EmployeeData$]", conn1)
          Dim rdr As OleDbDataReader = cmd1.ExecuteReader
    
          Debug.WriteLine(vbCrLf & "EmployeeData:" & vbCrLf & "=============")
          Do While rdr.Read()
             Debug.WriteLine(System.String.Format("{0,-10}{1, -15}{2}", _
                rdr.GetString(0), rdr.GetString(1), _
                rdr.GetDateTime(2).ToString("d")))
          Loop
          rdr.Close()
          conn1.Close()
    
          '========================================================
          'Use a DataSet to read data from the InventoryData table.
          '========================================================
          Dim conn2 As New OleDbConnection(m_sConn2)
          Dim da As New OleDbDataAdapter("Select * From [InventoryData$]", conn2)
          Dim ds As DataSet = New DataSet()
          da.Fill(ds)
          Debug.WriteLine(vbCrLf & "InventoryData:" & vbCrLf & "==============")
          Dim dr As DataRow
          For Each dr In ds.Tables(0).Rows'Show results in output window
             Debug.WriteLine(System.String.Format("{0,-15}{1, -6}{2}", _
                dr("Product"), dr("Qty"), dr("Price")))
          Next
          conn2.Close()
    
    End Sub
    
    Public Sub Add_Records()
    
    '==========================================================================
          ' Run an INSERT INTO command to add new records to the workbook. 
    '==========================================================================
          Dim conn1 As New System.Data.OleDb.OleDbConnection(m_sConn1)
          conn1.Open()
          Dim cmd As New System.Data.OleDb.OleDbCommand()
          cmd.Connection = conn1
          cmd.CommandText = "INSERT INTO [EmployeeData$] (ID, Name, BirthDate) values ('CCC', 'Charlie', '10/14/48')"
          cmd.ExecuteNonQuery()
          cmd.CommandText = "INSERT INTO [EmployeeData$] (ID, Name, BirthDate) values ('DDD', 'Deloris', '7/19/98')"
          cmd.ExecuteNonQuery()
          conn1.Close()
    
          '====================================================================
          'Use the InsertCommand object to add new records to the InventoryData
          'table.
          '====================================================================
          Dim conn2 As New OleDbConnection(m_sConn2)
          Dim da As New OleDbDataAdapter("Select * From [InventoryData$]", conn2)
          Dim ds As DataSet = New DataSet()
          da.Fill(ds, "MyExcelTable")
    
          ' Generate the InsertCommand and add the parameters for the command.
          da.InsertCommand = New OleDbCommand( _
             "INSERT INTO [InventoryData$] (Product, Qty, Price) VALUES (?, ?, ?)", conn2)
          da.InsertCommand.Parameters.Add("@Product", OleDbType.VarChar, 255, "Product")
          da.InsertCommand.Parameters.Add("@Qty", OleDbType.Double).SourceColumn = "Qty"
          da.InsertCommand.Parameters.Add("@Price", OleDbType.Currency).SourceColumn = "Price"
    
          ' Add two new records to the dataset.
          Dim dr As DataRow
          dr = ds.Tables(0).NewRow
          dr("Product") = "Bread" : dr("Qty") = 390 : dr("Price") = 1.89 : ds.Tables(0).Rows.Add(dr)
          dr = ds.Tables(0).NewRow
          dr("Product") = "Milk" : dr("Qty") = 99 : dr("Price") = 2.59 : ds.Tables(0).Rows.Add(dr)
    
          ' Apply the dataset changes to the actual data source (the workbook).
          da.Update(ds, "MyExcelTable")
          conn2.Close()
    
    End Sub
    
    Public Sub Update_Records()
    
    '==========================================================================
          ' Run an UPDATE command to change a record in the EmployeeData
          ' table.
    '==========================================================================
          Dim conn1 As New System.Data.OleDb.OleDbConnection(m_sConn1)
          conn1.Open()
          Dim cmd As New System.Data.OleDb.OleDbCommand()
          cmd.Connection = conn1
          cmd.CommandText = "UPDATE [EmployeeData$] " & _
                        "SET NAME = 'Aaron', BirthDate = '5/4/1975' WHERE ID = 'AAA'"
          cmd.ExecuteNonQuery()
          conn1.Close()
    
          '====================================================================
          ' Use the UpdateCommand object to modify records in the InventoryData
          ' table.
          '====================================================================
          Dim conn2 As New OleDbConnection(m_sConn2)
          Dim da As New OleDbDataAdapter("Select * From [InventoryData$]", conn2)
          Dim ds As DataSet = New DataSet()
          da.Fill(ds, "MyInventoryTable")
    
          ' Generate the UpdateCommand and add the parameters for the command.
          da.UpdateCommand = New OleDbCommand( _
             "UPDATE [InventoryData$] SET Qty = ?, Price=? WHERE Product = ?", conn2)
          da.UpdateCommand.Parameters.Add("@Qty", OleDbType.Numeric).SourceColumn = "Qty"
          da.UpdateCommand.Parameters.Add("@Price", OleDbType.Currency).SourceColumn = "Price"
          da.UpdateCommand.Parameters.Add("@Product", OleDbType.VarChar, 255, "Product")
    
          ' Update the first two records.
          ds.Tables(0).Rows(0)("Qty") = 1000
          ds.Tables(0).Rows(0)("Price") = 10.1
          ds.Tables(0).Rows(1)("Qty") = 2000
          ds.Tables(0).Rows(1)("Price") = 20.2
    
          ' Apply the dataset changes to the actual data source (the workbook).
          da.Update(ds, "MyInventoryTable")
          conn2.Close()
    
    End Sub
    
    Public Sub Update_Individual_Cells()
    
    '==========================================================================
          ' Update individual cells on the EmployeeData worksheet; 
          ' specifically, cells F3, G3, and I4 are modified.
    '==========================================================================
    
          ' NOTE: The connection string indicates that the table does *NOT* 
          ' have a header row.
          Dim conn As New System.Data.OleDb.OleDbConnection(m_sConn1.Replace("HDR=YES", "HDR=NO"))
          conn.Open()
          Dim cmd As New System.Data.OleDb.OleDbCommand()
          cmd.Connection = conn
          cmd.CommandText = "UPDATE [EmployeeData$F3:G3] SET F1 = 'Cell F3', F2 = 'Cell G3'"
          cmd.ExecuteNonQuery()
          cmd.CommandText = "UPDATE [EmployeeData$I4:I4] SET F1 = 'Cell I4'"
          cmd.ExecuteNonQuery()
          conn.Close()
    
    End Sub
    
    Public Sub Use_External_Source()
    
          ' Open a connection to the sample Northwind Access database.
          Dim conn As New System.Data.OleDb.OleDbConnection( _
                "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & m_sNorthwind & ";")
          conn.Open()
          Dim cmd As New System.Data.OleDb.OleDbCommand()
          cmd.Connection = conn
    
    '=======================================================================
          ' Run an INSERT..INTO command on the Northwind database to append 
          ' the records from a table/query to an existing table in the Excel 
          ' workbook.
    '=======================================================================
          cmd.CommandText = "INSERT INTO [EmployeeData$] IN 'C:\ExcelData1.xls' 'Excel 8.0;'" & _
             "SELECT EmployeeID AS ID, FirstName AS Name, BirthDate FROM Employees"
          cmd.ExecuteNonQuery()
    
    '==========================================================================
          ' Run a SELECT..INTO command on the Northwind database to insert 
          ' all the records from a table/query into a new sheet in the Excel 
          ' workbook.
    '==========================================================================
          cmd.CommandText = "SELECT * INTO [Excel 8.0;Database=C:\ExcelData2.xls].[ProductSales]" & _
                          "FROM [Product Sales for 1997]"
          cmd.ExecuteNonQuery()
    
          conn.Close()
    
    End Sub
  7. Ändern Sie den Pfad zur Access-Beispieldatenbank "Northwind" für das Element "m_sNorthwind" im Code, sofern erforderlich.

Testen der Anwendung

  1. Zeigen Sie im Menü Ansicht auf Andere Fenster. Klicken Sie auf Ausgabe, um das Fenster Ausgabe anzuzeigen.
  2. Drücken Sie die Taste [F5], um das Programm erstellen und ausführen zu lassen.
  3. Klicken Sie auf Create_Workbook und dann auf Go. Die Prozedur Create_Workbook führt CREATE TABLE-Befehle aus, um zwei neue Arbeitsmappen zu erstellen: "C:\ExcelData1.xls" und "C:\ExcelData2.xls". "ExcelData1.xls" enthält ein Blatt (eine Tabelle) namens "EmployeeData". "ExcelData2.xls" enthält ein Blatt (eine Tabelle) namens "InventoryData". Die Tabellen sind mit Datensätzen gefüllt.

    Hinweis: Öffnen Sie bei jedem verbleibendem Schritt in diesem Test die Arbeitsmappen in Excel, um die Ergebnisse zu prüfen. Oder klicken Sie auf Retrieve_Records, um den Inhalt der Tabelle(n) im Fenster Ausgabe von Visual Studio .NET anzuzeigen.
  4. Klicken Sie auf Retrieve_Records und dann auf Go. Die Prozedur Retrieve_Records extrahiert die Sätze aus den Tabellen und zeigt sie etwa so im Fenster Ausgabe an:
    EmployeeData:
    =============
    AAA       Andrew         12/4/1955
    
    InventoryData:
    ==============
    Cola           200   1.35
    Chips          550   0.89
  5. Klicken Sie auf Add_Records und dann auf Go. Die Routine Add_Records fügt in jeder Tabelle zwei Sätze hinzu:
    EmployeeData:
    =============
    AAA       Andrew         12/4/1955
    CCC       Charlie        10/14/1948
    DDD       Deloris        7/19/1998
    
    InventoryData:
    ==============
    Cola           200   1.35
    Chips          550   0.89
    Bread          390   1.89
    Milk           99    2.59
  6. Klicken Sie auf Update_Records und dann auf Go. Die Routine Update_Records aktualisiert zwei Sätze in jeder Arbeitsmappe:
    EmployeeData:
    =============
    AAA       Aaron          5/4/1975
    CCC       Charlie        10/14/1948
    DDD       Deloris        7/19/1998
    
    InventoryData:
    ==============
    Cola           1000  10.1
    Chips          2000  20.2
    Bread          390   1.89
    Milk           99    2.59
  7. Klicken Sie auf Update_Individual_Cells und dann auf Go. Die Routine Update_Individual_Cells ändert bestimmte Daten im Arbeitsblatt "EmployeeData in "ExcelData1.xls"; insbesondere werden die Zellen F3, G3 und I4 aktualisiert.
  8. Klicken Sie auf Use_External_Source und dann auf Go. Wenn Sie einen INSERT..INTO-Befehl verwenden, hängt die Routine Use_External_Source Datensätze aus der Northwind-Tabelle 'Employees' an das Arbeitsblatt "EmployeeData" in "ExcelData1.xls" an. Außerdem verwendet Use_External_Source einen SELECT..INTO-Befehl, um in "ExcelData2.xls" eine neue Tabelle (Arbeitsblatt) zu erstellen, die alle Datensätze aus der Northwind-Tabelle 'Products' enthält.

    Hinweis: Wenn Sie mehr als einmal auf Use_External_Source klicken, wird die Liste "Employees" mehrfach angehängt, da der Primärschlüssel nicht erkannt oder erzwungen wird.

Formatierung der Zellen

Wenn Sie ADO.NET dazu verwenden, Datensätze in einer vorhandenen Arbeitsmappe hinzuzufügen oder zu aktualisieren, können Sie Zellen in der Arbeitsmappe formatieren, die für die neuen oder aktualisierten Datensätze verwendet wird. Wenn Sie einen vorhandenen Datensatz (eine Zeile) in einer Arbeitsmappe aktualisieren, wird die Zellenformatierung beibehalten. Wenn Sie einen neuen Datensatz (Zeile) in einer Arbeitsmappe einfügen, übernimmt der neue Datensatz die Formatierung der vorhergehenden Zeile.

Die folgende Vorgehensweise zeigt, wie Sie mit dem Beispielcode die Formatierung in einer Arbeitsmappe anwenden können:
  1. Drücken Sie die Taste [F5], um das Beispiel zu erstellen und auszuführen.
  2. Klicken Sie in Form1 auf Create_Workbook und dann auf Go.
  3. Starten Sie Microsoft Excel und öffnen Sie "C:\ExcelData1.xls".
  4. Formatieren Sie die Zelle A2 fett.
  5. Formatieren Sie die Zelle B2 kursiv und unterstrichen und wählen Sie die zentrierte Ausrichtung.
  6. Wählen Sie ein langes Datumsformat für die Zelle C2.
  7. Speichern und schließen Sie "C:\ExcelData1.xls".
  8. Klicken Sie in Form1 auf Create_Workbook und dann auf Go.
  9. Öffnen Sie "C:\ExcelData1.xls" in Excel. Beachten Sie, dass die zwei neuen Zeilen die Formatierung der ersten Zeile übernommen haben.

Einschränkungen

Folgende Einschränkungen bestehen beim Jet OLE DB-Provider hinsichtlich Excel-Datenquellen:
  • Sie können mit ADO.NET keine Formeln in Zellen einfügen.
  • Der Jet OLE DB-Provider kann für Tabellen in einer Excel-Arbeitsmappe keine Schlüssel-/Indexdaten liefern. Deshalb können Sie den CommandBuilder nicht dazu verwenden, Datensätze in einer Excel-Arbeitsmappe automatisch zu aktualisieren und einzufügen.

Informationsquellen

Weitere Informationen finden Sie in den folgenden Artikeln der Microsoft Knowledge Base:
316756 PRB: Fehler tritt auf, wenn Sie ADO.NET OLEDbDataAdapter verwenden, um Excel-Arbeitsmappe zu ändern
257819 SO WIRD'S GEMACHT: Verwenden von ADO mit Excel-Daten von Visual Basic oder VBA
306022 SO WIRD'S GEMACHT: Übertragen von Daten in eine Excel-Arbeitsmappe mit Visual Basic .NET
306023 Wie Übertragen von Daten, indem Visual C# 2005 oder Visual C# verwendet, in einer Excel-Arbeitsmappe
311731 SO WIRD'S GEMACHT: Abfragen und Anzeigen von Excel-Daten mit ASP.NET und Visual Basic .NET
306572 SO WIRD'S GEMACHT: Abfragen und Anzeigen von Excel-Daten mit ASP.NET, ADO.NET und Visual C# .NET
278973 BEISPIEL: ExcelADO zeigt, wie ADO zum Lesen und Schreiben von Daten in Excel-Arbeitsmappen verwendet wird

Eigenschaften

Artikel-ID: 316934 - Geändert am: Freitag, 17. Februar 2006 - Version: 7.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Keywords: 
kbhowtomaster KB316934
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com