Abou Chleih

{the magic lies between the brackets}

Menu Close

[C#] Auslesen einer Excel Datei #1 – Interop-Assembly

Um Daten aus einer Excel-Datei in das Programm zu laden, gibt es mehrere Wege:

  • Zugriff auf die Excel-Datei über die Interop-Schnittstelle
  • Zugriff auf die Excel-Datei über einen Datenbank-Provider (hier: OLEDB)

Beginnen wir mit dem ersten genannten Weg, dem Zugriff über die Interop-Assembly.
Um einen Zugriff zu erhalten, müssen wir zuerst die Assembly einbinden, dies tun wir, indem wir einen Verweis auf die DLL hinzufügen.
Dazu klicken wir mit der rechten Maustaste auf das Item „Verweise“ im gewünschten Projekt und betätigen das Feld „Verweis hinzufügen…“.
Verweis_hinzufügen

Anschließend öffnet sich Dialog, indem wir einige DLLs finden.
Wir benötigen die Microsoft.Office.Interop.Excel-DLL, welche im Reiter .NET zu finden ist.

Interop_Excel_Verweis
Anschließend binden wir den Namespace der DLL in das Projekt (die gewünschte Klasse) ein.

 using Microsoft.Office.Interop.Excel; 

Nun zum eigentlichen Auslesen.
Zuerst müssen wir die verschiedenen Variablen anlegen, die Excel benötigt:

  • Die Excel-Applikation
  • Das Workbook
  • Das Worksheet
ApplicationClass app = new ApplicationClass(); //Die Excel-Applikation
Workbook book = null; //Das Workbook
Worksheet sheet = null; //Das Worksheet

Nun weisen wir die Werte zu:

 book = app.Workbooks.Open(path, Missing.Value, Missing.Value,
                                         Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                                         Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                                         Missing.Value, Missing.Value, Missing.Value, Missing.Value);

Dies lässt Excel das Workbook öffnen.
Falls dies im Hintergrund geschehen soll (Excel soll nicht sichtbar laufen), müssen folgende Optionen gesetzt sein:

 app.Visible = false;
app.ScreenUpdating = false;
app.DisplayAlerts = false; 

Nun da wir das komplette Excel-File geöffnet haben, wollen wir die Dateien der verschiedenen Worksheets (zu Deutsch: Tabellenblätter) auslesen.
Dazu weisen wir dem Objekt vom Typ Worksheet das Worksheet aus dem Excel-File zu:

 sheet = (Worksheet)book.Worksheets[1]; 

Es ist zu beachten, dass hier das erste Worksheet auch den Index 1 hat. (Kein zero-based-indexing!)
Jetzt lesen wir das Worksheet aus. Dazu muss man angeben, ab welcher Zelle und bis zu welcher Zelle man auslesen will, man muss also einen Bereich (eine Range) angeben.
Für dies existiert die Klasse Range.
Nun weisen wir der Range den gesamten Bereich zu, in dem Werte stehen.
Dazu erstellen wir ein char-Array bzw. einen string (ein String ist ein char-Array):

 string alphabet= "ABCDEFGHIJKLMNOPQRSTUVQXYZ"; 

Nun lesen wir aus, wie viele Spalten es gibt:

 int colCount = sheet.UsedRange.Columns.Count; 

Den Buchstaben der letzten Spalte bekommen wir nun ganz einfach durch Nutzen des Index (colCount):

 char lastColChar = alphabet[iColumnCount]; 

Um die letzte genutzte Spalte zu finden nutzen wir:

int rowCount = sheet.UsedRange.Rows.Count; 

Die Range definieren wir dann wie folgt:

 Range range = sheet.get_Range("A1", lastColChar.toString() + rowCount.toString()); 

Der erste Parameter definiert die obere, rechte Zelle, der zweite die untere, linke.
Nun haben wir den Bereich definiert.
Das Auslesen ist nun sehr simpel:
Da wir alle benötigten Daten haben, können wir ein Array erstellen und das Array schnell füllen:

 object[,] myExcelFileValues = (object[,])range.Value2; 

Nun haben wir alle Zellen im Speicher und können Excel beenden (!!!), dies ist wichtig, da die Datei sonst nicht freigegeben wird.
Dies geschieht nach dem First-In-Last-Out-Prinzip.
Zuerst löschen wir also das Range-Objekt:

 range = null; 

Nun löschen wir das Worksheet und rufen den GarbageCollector auf:

Marshal.FinalReleaseComObject(sheet);
app.DisplayAlerts = false;
sheet = null; 
GC.Collect();
GC.WaitForPendingFinalizers(); 

Anschließend lassen wir das Workbook schließen und löschen das Workbook-Objekt:

  book.Close(false, Missing.Value, Missing.Value); 
 Marshal.FinalReleaseComObject(book);
 book = null;

Daraufhin schließen wir Excel/die Applikation und löschen diese aus dem Speicher:

 app.Quit();
Marshal.FinalReleaseComObject(app);
app = null; 

Nun ist das Programm beendet.