Saschas Weblog

ESCde Developer Blog

  Home :: Kontakt :: RSS Feed
  30 Posts :: 0 Artikel :: 10 Kommentare :: 32 Trackbacks

Archiv

Post Kategorien

ESCde

ESCde Blogger

Donnerstag, 05. Juli 2007 #

Der Zugriff auf Exceldateien unter .Net 2.0 ist dank ADO.Net erstaunlich einfach. Dazu wird der OleDbProvider verwendet.

string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;
    Data Source=D:\Excel\Workbook.xls;Extended Properties=""Excel 8.0;HDR=YES;""";

Dieser ConnectionString enthält den Speicherort der Datei und gibt an, dass die erste Zeile der Worksheets die Spaltennamen enthält.

Nachdem die Connection geöffnet ist, verhält sich alles, wie von ADO.Net gewohnt.
Mit Hilfe der GetSchema() Methode lassen sich Informationen zu den vorhandenen Tabellen (gleich Worksheets) und Spalten abrufen.

using (OleDbConnection connection = new OleDbConnection(connectionString))
{
    connection.Open();

    DataTable tables = connection.GetSchema("Tables");
    DataTable columns = connection.GetSchema("Columns");
}

In den nachfolgenden Screenshots sieht man die jeweilige DataTable mit den Schemainformationen im DataSet-Visualizer des Visual Studio Debuggers. Achtung: Excel hängt für den Tabellenname ein $ an den Namen des Worksheets. Hier: Worksheetname "Studenten" wird zu Tabelle "Studenten$".

Select-Abfragen funktionieren auch mit Parameter und das Ergebnis lässt sich an Steuerelemente binden.

OleDbCommand selectCommand = new OleDbCommand(
    "SELECT [MatrikelNr], [Vorname], [Nachname] FROM [Studenten$] " +
    "WHERE [Nachname] LIKE @Nachname", 
    connection);
selectCommand.Parameters.AddWithValue("Nachname", "A%");

OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand);

DataTable studenten = new DataTable();
adapter.Fill(studenten);

this.GridView1.DataSource = studenten;
this.GridView1.DataBind();

Auch die Insert- und Update-Commands funktionieren wie erwartet:

OleDbCommand insertCommand = new OleDbCommand(
    "INSERT INTO [Studenten$] ([MatrikelNr], [Vorname], [Nachname]) " +  
    "VALUES (@MatrikelNR, @Vorname, @Nachname)",
    connection);
insertCommand.Parameters.AddWithValue("MatrikelNr", "123459");
insertCommand.Parameters.AddWithValue("Vorname", "Bert");
insertCommand.Parameters.AddWithValue("Nachname", "Becker");
int rowsAffected = insertCommand.ExecuteNonQuery();