Einleitung: Warum "ohne Office" und was steckt drin?
\n\nWenn Sie jemals gesucht haben, wie man eine Excel-Datei in C# generiert, sind Sie sicherlich auf die kultige Frage auf Stack Overflow mit Zehntausenden von Aufrufen gestoßen. Und der Hauptschmerz dort ist der Satz "without installing Microsoft Office". Warum? Weil COM-Objekte mitzuschleppen, von der Excel-Version auf dem Server abhängig zu sein und Fehler wie "Retrieving the COM class factory for component... failed" zu fangen, der Weg in die Hölle für einen Entwickler ist.
\n\nAber wie erstellt man dann .XLSX- und .XLS-Dateien? Die Antwort liegt in der Struktur des Formats selbst. Modernes Excel (ab 2007) ist ein gewöhnliches ZIP-Archiv mit XML-Dateien darin. Ja, Sie haben richtig gehört: Nehmen Sie eine beliebige .xlsx-Datei, benennen Sie sie in .zip um, öffnen Sie sie – und Sie sehen Ordner wie xl, _rels, docProps und eine Menge XML-Dokumente. Jedes Blatt, jede Zelle, jeder Stil – das ist sorgfältig strukturiertes XML. Und das alte .XLS-Format ist ein binäres Format (BIFF), aber auch dafür gibt es Open-Source-Lösungen.
In diesem Artikel werfen wir einen Blick unter die Haube dieses Prozesses: Wir analysieren beliebte Bibliotheken, schreiben Live-Code und verstehen, was wirklich passiert, wenn wir Save() aufrufen. Los geht's!
1. Die drei Säulen von C# für die Arbeit mit Excel ohne Office
\n\nHeutzutage gibt es drei Hauptkandidaten, die die Aufgabe "out of the box" lösen. Jeder von ihnen arbeitet direkt mit dem Format, ohne installiertes Office zu benötigen.
\n\n1.1. EPPlus (Lizenz LGPL / Proprietär)
\nDie beliebteste Bibliothek für .NET. Ursprünglich kostenlos, aber ab Version 5.0 auf eine kostenpflichtige Lizenz für die kommerzielle Nutzung umgestellt. Für Bildungszwecke und kleine Projekte kann sie jedoch weiterhin verwendet werden (Version 4.5.3.3 ist die letzte freie). EPPlus funktioniert nur mit .XLSX.
\n\nWie es unter der Haube funktioniert: EPPlus verwendet System.IO.Packaging (das besagte ZIP-Archiv) und generiert XML-Dateien gemäß der Office Open XML (OOXML)-Spezifikation. Es kann Stile, Formeln, Diagramme erstellen – alles, was Sie in Excel sehen.
1.2. ClosedXML
\nKostenlos, Open-Source (MIT-Lizenz). Funktioniert ebenfalls nur mit .XLSX. Zeichnet sich durch eine sehr benutzerfreundliche API aus, die an die Arbeit mit Excel selbst erinnert: Sie arbeiten mit Workbook, Worksheet, Cell. Unter der Haube – derselbe Open XML, aber ClosedXML übernimmt die gesamte Routine zur Erstellung der XML-Struktur.
1.3. NPOI
\nPort der berühmten Java-Bibliothek Apache POI. Der Hauptvorteil: Es kann sowohl mit .XLSX (über XSSFWorkbook) als auch mit dem alten .XLS (über HSSFWorkbook) arbeiten. Kostenlos, Open-Source (Apache 2.0). Ideal, wenn Sie Unterstützung für Legacy-Formate benötigen.
\n\nUnter der Haube für .XLS: NPOI schreibt binäre Daten direkt im BIFF8-Format. Das ist komplexer als XML, erfordert aber keine Komprimierung.
\n\n2. Code schreiben: Excel-Datei auf drei Arten erstellen
\n\nLassen Sie uns einen einfachen Bericht mit Kopfzeilen und Daten erstellen. Unten finden Sie Beispiele für jede Bibliothek.
\n\n2.1. Beispiel mit ClosedXML (am einfachsten)
\n\nusing ClosedXML.Excel;\n\n// Arbeitsmappe erstellen\nusing (var workbook = new XLWorkbook())\n{\n // Blatt hinzufügen\n var worksheet = workbook.Worksheets.Add("Bericht");\n\n // Kopfzeilen\n worksheet.Cell(1, 1).Value = "Name";\n worksheet.Cell(1, 2).Value = "Alter";\n worksheet.Cell(1, 3).Value = "Stadt";\n\n // Daten\n worksheet.Cell(2, 1).Value = "Anna";\n worksheet.Cell(2, 2).Value = 28;\n worksheet.Cell(2, 3).Value = "Moskau";\n\n worksheet.Cell(3, 1).Value = "Ivan";\n worksheet.Cell(3, 2).Value = 35;\n worksheet.Cell(3, 3).Value = "Sankt Petersburg";\n\n // Stil für Kopfzeilen\n var headerRange = worksheet.Range("A1:C1");\n headerRange.Style.Font.Bold = true;\n headerRange.Style.Fill.BackgroundColor = XLColor.LightGray;\n\n // Spaltenbreite automatisch anpassen\n worksheet.Columns().AdjustToC