C#-Projekt: Zugriff auf Excel-Dateien

Der Zugriff auf Excel-Dateien und -Funktionen mit C# ist eigentlich recht einfach. Zunächst muss ein Verweis auf die COM-Bibliothek Microsoft Excel 11.0 Object Library hinzugefügt und dann noch der entsprechende Namespace inkludiert werden mittels:
using Microsoft.Office.Interop.Excel;

Änderungen bei Excel 2007: Es muss die COM-Bibliothek Microsoft Excel 12.0 Object Library verwendet werden.
Änderungen bei Excel 2010: Es muss die COM-Bibliothek Microsoft Excel 14.0 Object Library verwendet werden.

Dann kann man munter drauflos programmieren, vielleicht wie folgt:
// benötigte Objekte vorbereiten Microsoft.Office.Interop.Excel.Application excel = null; Workbook wb = null; try { // Excel starten excel = new Microsoft.Office.Interop.Excel.Application(); excel.Visible = false; // Datei öffnen wb = excel.Workbooks.Open( @"C:\test.xlsx", ExcelKonstanten.UpdateLinks.DontUpdate, ExcelKonstanten.ReadOnly, ExcelKonstanten.Format.Nothing, "", // Passwort "", // WriteResPasswort ExcelKonstanten.IgnoreReadOnlyRecommended, XlPlatform.xlWindows, "", // Trennzeichen ExcelKonstanten.Editable, ExcelKonstanten.DontNotifiy, ExcelKonstanten.Converter.Default, ExcelKonstanten.DontAddToMru, ExcelKonstanten.Local, ExcelKonstanten.CorruptLoad.NormalLoad); // Arbeitsblätter lesen Sheets sheets = wb.Worksheets; // ein Arbeitsblatt auswählen... Worksheet ws = (Worksheet)sheets.get_Item("Tabelle1"); // ...oder eine Zelle Range range = (Range)ws.get_Range("A1", "A1"); // deren Wert auslesen string zellwert = range.Value2.ToString(); Console.WriteLine(zellwert); } catch (Exception e) { Console.WriteLine(e.Message); } finally { wb.Close(false, null, null); excel.Quit(); }
Ich habe mir der Einfachheit halber die Werte, die als Parameter für die Methode Worbook.Workbooks.Open benötigt werden, in eine kleine Hilfsklasse geschrieben. Die Werte habe ich von der Microsoft-Seite.

/// <summary> /// Diese Klasse enthält alle Konstanten, die beim Zugriff auf Excel /// benötigt werden. Die Beschreibungen sind von Microsoft übernommen /// und daher noch auf Englisch. /// </summary> private static class ExcelKonstanten { /// <summary> /// Specifies the way links in the file are updated. If this /// argument is omitted, the user is prompted to specify how /// links will be updated. Otherwise, this argument is one of /// the values listed in the following table. /// </summary> public enum UpdateLinks { DontUpdate = 0, ExternalOnly = 1, RemoteOnly = 2, ExternalAndRemote = 3 }; /// <summary> /// True to open the workbook in read-only mode. /// </summary> public const bool ReadOnly = true; public const bool ReadWrite = false; /// <summary> /// If Microsoft Excel is opening a text file, this argument /// specifies the delimiter character, as shown in the following /// table. If this argument is omitted, the current delimiter /// is used. /// </summary> public enum Format { Tabs = 1, Commas = 2, Spaces = 3, Semicolons = 4, Nothing = 5, CustomCharacter = 6 }; /// <summary> /// True to have Microsoft Excel not display the read-only /// recommended message (if the workbook was saved with the /// Read-Only Recommended option). /// </summary> public const bool IgnoreReadOnlyRecommended = true; public const bool DontIgnoreReadOnlyRecommended = false; /// <summary> /// If the file is a Microsoft Excel 4.0 add-in, this argument /// is True to open the add-in so that its a visible window. /// If this argument is False or omitted, the add-in is opened /// as hidden, and it cannot be unhidden. This option doesn't /// apply to add-ins created in Microsoft Excel 5.0 or later. /// If the file is an Excel template, True to open the specified /// template for editing. False to open a new workbook based on /// the specified template. The default value is False. /// </summary> public const bool Editable = true; public const bool NotEditable = false; /// <summary> /// If the file cannot be opened in read/write mode, this /// argument is True to add the file to the file notification /// list. Microsoft Excel will open the file as read-only, poll /// the file notification list, and then notify the user when /// the file becomes available. If this argument is False or /// omitted, no notification is requested, and any attempts to /// open an unavailable file will fail. /// </summary> public const bool Notify = true; public const bool DontNotifiy = false; /// <summary> /// The index of the first file converter to try when opening /// the file. The specified file converter is tried first; if /// this converter doesnt recognize the file, all other converters /// are tried. The converter index consists of the row numbers /// of the converters returned by the FileConverters property. /// </summary> public enum Converter { Default = 0 }; /// <summary> /// True to add this workbook to the list of recently used files. /// The default value is False. /// </summary> public const bool AddToMru = true; public const bool DontAddToMru = false; /// <summary> /// True saves files against the language of Microsoft Excel /// (including control panel settings). False (default) saves /// files against the language of Visual Basic for Applications /// (VBA) (which is typically US English unless the VBA project /// where Workbooks.Open is run from is an old internationalized /// XL5/95 VBA project). /// </summary> public const bool Local = true; public const bool NotLocal = false; public enum CorruptLoad { NormalLoad = 0, RepairFile = 1, ExtractData = 2 }; }

Über uns Stefan

Polyglot Clean Code Developer

57 Kommentare

  1. Hi,

    Ich habe win7 64 bit, office 2010 und vs2008. Ich kann die Microsoft Excel 14.0 Object Library nicht finden. Bei mir ist nur die 12.0 vorhanden.

    Grüße, Oli

  2. Danke für die Hilfe, das funktioniert auch soweit alles ganz gut, jedoch springt er bei mir direkt zum Ende wenn er eine leere Zelle erwischt.

    Ein Codeausschnitt

    if (crange11.Value.ToString() != null)
    { czellwert11 = crange11.Value2.ToString();
    czellwertint11 = Convert.ToInt16(czellwert11);
    }
    else
    {czellwertint11 = 0;}

    Wenn die Zelle leer ist, geht er einfach nicht in die Else-Schleife.

    Hat jemand eine Lösung???

  3. Hat sich erledigt, wenn eine Zelle leer ist, kann man sie nicht in einen String umwandeln, heißt in

    if (crange11.Value.ToString() != null)

    muss das .ToString() rausgenommen werden

  4. Vielen Dank!!!

    Super Anleitung hat mir sehr geholfen!

  5. Hallo Stefan,

    erst einmal vielen Dank für Deine Mühe.
    Das Auslesen einer Zelle funktionierte bei mir auf Anhieb. Klasse!

    Frage: Wie kann ich jedoch mehrere Zellen auslesen?

    Hintergrund: Ich habe eine Excel-Liste mit 2 Spalten. In der ersten stehen Namen und in der zweiten stehen die dazugehörigen Email-Adressen. Ich möchte meiner Freundin nun den Gefallen tun, für ihre Arbeit ein Script zu schreiben, welches ihr etwas Arbeit abnimmt. Das Script soll mit einem Button-Druck, jedem Mitarbeiter eine Mail mit dem aktuellen Gleitzeit- und Urlaubsstand aus einer anderen Excel-Liste senden.
    Per Google und msdn finde ich leider nur das Auslesen EINER Zelle.
    Für einen Tipp, wie ich die Sache realisieren könnte, wäre ich Dir sehr dankbar.

    Viele Grüße
    Andre

  6. Hallo Andre, dafür wirst du dir dann ein Programm schreiben müssen. Grundsätzlich kannst du ja nur auf eine Zelle gleichzeitig zugreifen. Die restliche Logik muss dann dein Programm übernehmen (z.B. mit einer Schleife durch die Zellen wandern).

  7. Das Einlesen einer Excel-Datei funktioniert problemlos (zumindest bei xls), aber ist sehr langsam. Wenn ich nun versuche, ein Eintrag (Datum) hinzuzufügen, kann ich die Datei nicht mehr einlesen. Ein Öffnen mit Excel funktioniert und zeigt auch alles korrekt an!
    Wie muss ich ein Datum korrekt übergeben? Mein Versuch für Schreiben / Lesen:
    ws.Cells[zeile, 1] = DateTime.Now.ToShortDateString();
    dt = DateTime.FromOADate((double)range.Value2.ToString());

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax