HOWTO · Csharp

Schreiben in eine Excel-Datei in C#

Wir können die Microsoft Office-API verwenden, um in eine Excel-Datei in C# zu schreiben.

Auf dieser Seite

Um Daten aus C# in eine Excel-Arbeitsmappe zu schreiben, verwenden Sie Microsoft Office Interop, wenn das Programm die installierte Excel-Desktopanwendung automatisieren soll. Mit Interop können Sie eine Arbeitsmappe erstellen, Zellen füllen und eine native .xlsx-Datei speichern. Auf dem Computer, auf dem das Programm ausgeführt wird, muss Excel installiert sein. Ist Excel in der Zielumgebung nicht verfügbar, verwenden Sie eine Tabellenbibliothek, die Arbeitsmappendateien direkt erstellt.

Den passenden Ansatz zum Schreiben in Excel für Ihre Anwendung wählen

Microsoft Office Interop startet Excel und kommuniziert über COM mit dessen Objektmodell. Verwenden Sie Interop für Desktopautomatisierung, die von Excel selbst abhängt, etwa wenn Sie Excel-spezifisches Verhalten von Arbeitsmappen benötigen. Interop ist keine eigenständige Bibliothek zum Schreiben von Dateien: Ein Interop-Verweis im Projekt installiert Excel nicht auf einem anderen Computer.

Für einfache tabellarische Daten, die keine Arbeitsblätter, Formeln oder Formatierungen benötigen, ist eine CSV-Datei eine schlankere Alternative. Excel kann CSV-Text öffnen, doch eine CSV-Datei ist keine Excel-Arbeitsmappe und kann deren Funktionen nicht speichern. Die folgenden Beispiele zeigen diese beiden Ergebnisse getrennt.

Microsoft Office Interop in C# einrichten

Fügen Sie in Visual Studio über den Dialog „Verweise“ des Projekts einen COM-Verweis auf die Microsoft Excel Object Library hinzu. Die Version der Bibliothek hängt von der installierten Office-Version ab. Bei einem früh gebundenen Verweis importieren Sie Microsoft.Office.Interop.Excel, zum Beispiel mit using Excel = Microsoft.Office.Interop.Excel;, damit sich Excel-Typen von ähnlich benannten .NET-Typen unterscheiden lassen.

Das folgende Arbeitsmappenbeispiel verwendet über die Excel-COM-ProgID Late Binding und benötigt daher diesen Namespace im Quellcode nicht. Es automatisiert weiterhin Excel und setzt voraus, dass Excel zur Laufzeit unter Windows installiert ist. Verwenden Sie den früh gebundenen Verweis, wenn Sie Excel-Typen zur Kompilierzeit und IntelliSense benötigen. Late Binding eignet sich, wenn die Zielumgebung die installierte Excel-Version vorgibt und Sie einen versionsspezifischen Verweis vermeiden möchten. Ein Verweis allein macht Excel auf einem Server oder einem anderen Computer nicht verfügbar.

Eine Arbeitsmappe erstellen und Daten in Zellen schreiben

Dieses Interop-Beispiel startet Excel, fügt eine Arbeitsmappe hinzu, schreibt eine Kopfzeile und zwei Datenzeilen und speichert eine native .xlsx-Datei im temporären Systemverzeichnis. Der Formatwert 51 steht für Excels Dateiformat xlOpenXMLWorkbook. Eine GUID macht den Ausgabedateinamen bei jedem Lauf eindeutig, sodass die ausgeblendete Excel-Instanz nicht auf eine Überschreibungsabfrage wartet. Der Code ist für Windows mit installiertem Excel auf dem Desktop vorgesehen; eine Laufzeitausgabe wird nicht gezeigt.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

using System;
using System.IO;
using System.Runtime.InteropServices;

class Program
{
    static void Main()
    {
        if (Environment.OSVersion.Platform != PlatformID.Win32NT)
        {
            Console.WriteLine("This example requires Windows with Excel installed.");
            return;
        }

        object excelApp = null;
        object workbooks = null;
        object workbook = null;
        object worksheets = null;
        object worksheet = null;
        object cells = null;

        try
        {
            Type excelType = Type.GetTypeFromProgID("Excel.Application");
            if (excelType == null)
            {
                Console.WriteLine("Excel is not registered on this computer.");
                return;
            }

            dynamic app = Activator.CreateInstance(excelType);
            excelApp = app;
            app.Visible = false;
            workbooks = app.Workbooks;
            dynamic books = workbooks;
            workbook = books.Add();
            dynamic book = workbook;
            worksheets = book.Worksheets;
            dynamic sheets = worksheets;
            worksheet = sheets[1];
            dynamic sheet = worksheet;

            cells = sheet.Range["A1:B3"];
            dynamic dataRange = cells;
            object[,] values =
            {
                { "Name", "Age" },
                { "Ava", 28 },
                { "Liam", 31 }
            };
            dataRange.Value2 = values;

            string fileName = "example-" + Guid.NewGuid().ToString("N") + ".xlsx";
            string path = Path.Combine(Path.GetTempPath(), fileName);
            book.SaveAs(path, 51);
            Console.WriteLine("Saved " + Path.GetFileName(path));
        }
        catch (Exception ex)
        {
            Console.WriteLine("Excel operation failed: " + ex.Message);
        }
        finally
        {
            CloseWorkbook(workbook);
            ReleaseComObject(cells);
            ReleaseComObject(worksheet);
            ReleaseComObject(worksheets);
            ReleaseComObject(workbook);
            ReleaseComObject(workbooks);
            QuitExcel(excelApp);
            ReleaseComObject(excelApp);
        }
    }

    static void CloseWorkbook(object value)
    {
        if (value == null) return;
        try { ((dynamic)value).Close(false); }
        catch { }
    }

    static void QuitExcel(object value)
    {
        if (value == null) return;
        try { ((dynamic)value).Quit(); }
        catch { }
    }

    static void ReleaseComObject(object value)
    {
        if (value == null) return;
        try
        {
            if (Marshal.IsComObject(value)) Marshal.FinalReleaseComObject(value);
        }
        catch { }
    }
}

Für einfache tabellarische Daten schreibt ein separates CSV-Beispiel Text mit durch Kommas getrennten Werten, den Excel öffnen kann. Es erstellt keine Arbeitsmappe und unterstützt weder mehrere Arbeitsblätter noch Formeln oder Formatierungen. Für die Beispielwerte ist keine CSV-Quotierung erforderlich. Bei beliebigen Texten müssen Sie Felder mit Kommas, Anführungszeichen oder Zeilenumbrüchen in Anführungszeichen setzen und enthaltene Anführungszeichen verdoppeln.

Führen Sie dieses Beispiel aus:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string path = "example.csv";
        string contents = "Name,Age\nJohn Doe,30\n";
        File.WriteAllText(path, contents);
        Console.WriteLine("Wrote " + path);
    }
}
Wrote example.csv

In eine vorhandene Excel-Datei schreiben

Öffnen Sie die Arbeitsmappe über ihren vollständigen Pfad, behalten Sie den ausgewählten Bereich als COM-Referenz und geben Sie diese bei der Bereinigung frei. Save aktualisiert die geöffnete Datei an Ort und Stelle; verwenden Sie SaveAs, wenn Sie einen neuen Pfad oder eine Kopie anlegen möchten. Ersetzen Sie den Beispielpfad durch den Pfad der Arbeitsmappe, die Sie bearbeiten wollen. Für dieses Beispiel mit Excel auf dem Windows-Desktop wird keine Laufzeitausgabe gezeigt.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

using System;
using System.IO;
using System.Runtime.InteropServices;

class Program
{
    static void Main()
    {
        if (Environment.OSVersion.Platform != PlatformID.Win32NT)
        {
            Console.WriteLine("This example requires Windows with Excel installed.");
            return;
        }

        object excelApp = null;
        object workbooks = null;
        object workbook = null;
        object worksheets = null;
        object worksheet = null;
        object cells = null;
        string path = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
            "report.xlsx");

        try
        {
            if (!File.Exists(path))
                throw new FileNotFoundException("Workbook not found; update the sample path.", path);

            Type excelType = Type.GetTypeFromProgID("Excel.Application");
            if (excelType == null)
                throw new InvalidOperationException("Excel is not registered on this computer.");

            dynamic app = Activator.CreateInstance(excelType);
            excelApp = app;
            app.Visible = false;
            workbooks = app.Workbooks;
            dynamic books = workbooks;
            workbook = books.Open(path);
            dynamic book = workbook;
            worksheets = book.Worksheets;
            dynamic sheets = worksheets;
            worksheet = sheets[1];
            dynamic sheet = worksheet;
            cells = sheet.Range["B2:C2"];
            dynamic selectedCells = cells;
            selectedCells.Value2 = new object[,] { { "Reviewed", DateTime.Today.ToString("yyyy-MM-dd") } };
            book.Save();
            Console.WriteLine("Updated " + Path.GetFileName(path));
        }
        catch (Exception ex)
        {
            Console.WriteLine("Excel operation failed: " + ex.Message);
        }
        finally
        {
            CloseWorkbook(workbook);
            ReleaseComObject(cells);
            ReleaseComObject(worksheet);
            ReleaseComObject(worksheets);
            ReleaseComObject(workbook);
            ReleaseComObject(workbooks);
            QuitExcel(excelApp);
            ReleaseComObject(excelApp);
        }
    }

    static void CloseWorkbook(object value)
    {
        if (value == null) return;
        try { ((dynamic)value).Close(false); }
        catch { }
    }

    static void QuitExcel(object value)
    {
        if (value == null) return;
        try { ((dynamic)value).Quit(); }
        catch { }
    }

    static void ReleaseComObject(object value)
    {
        if (value == null) return;
        try
        {
            if (Marshal.IsComObject(value)) Marshal.FinalReleaseComObject(value);
        }
        catch { }
    }
}

Wenn die Quelldatei eine CSV-Datei ist, verwenden Sie stattdessen Dateioperationen und schreiben Sie deren Zeilen neu. CSV-Dateien besitzen kein Objektmodell für Arbeitsblätter oder Zellen.

Excel schließen und Fehler behandeln

Dateioperationen können fehlschlagen, wenn ein Pfad nicht verfügbar oder das Ziel nicht beschreibbar ist. Auch Interop kann beim Starten von Excel, Öffnen einer Arbeitsmappe, Schreiben in eine Zelle oder Speichern fehlschlagen, etwa wenn die Arbeitsmappe gerade verwendet wird. Fangen Sie Fehler dort ab, wo die Anwendung eine hilfreiche Meldung anzeigen oder protokollieren kann. Stellen Sie das Schließen der Arbeitsmappe, Quit und die Freigabe von COM-Objekten in einen finally-Block. Das Abfangen eines Fehlers allein räumt Excel nicht auf. Im Beispiel ist jede Bereinigungsaktion abgesichert, damit ein Fehler beim Schließen die nachfolgenden Bereinigungsversuche nicht verhindert.

Begrenzen Sie die Lebensdauer der Excel-Anwendung auf den jeweiligen Vorgang und behalten Sie keine zusätzlichen COM-Referenzen, etwa nicht nachverfolgte Range-Objekte. Ändern Sie beim Anpassen des Beispiels den temporären Ausgabepfad in Ihr gewünschtes Ziel. Für Formatierungen legen Sie nach dem Schreiben der Werte die entsprechenden Eigenschaften des Arbeitsblattbereichs fest; CSV-Ausgaben können diese Formatierungen nicht bewahren. Wenn Sie das CSV-Beispiel in einer Anwendung verwenden, müssen Sie außerdem Fehler bei Dateioperationen behandeln.