17. Apr 2023
Lesedauer 15 Min.
Nimm doch Excel
EPPlus
Die Tabellenkalkulation Excel ist wahrscheinlich das am häufigsten eingesetzte Office-Tool. Mit der Bibliothek EPPlus stehen dessen Funktionen auch über .NET zur Verfügung.

Microsoft Excel hat sich in der Unternehmenswelt als unverzichtbares Werkzeug etabliert. Der Grund ist sicher seine Anpassungsfähigkeit und der Wunsch der Menschen, Dinge übersichtlich darzustellen. Und da kommt so eine Tabelle gerade recht.In der Regel werden die Daten per Hand in die Tabellenzellen eingegeben. Doch können diese natürlich auch aus Programmen geliefert werden. Die Frage ist nur: Wie kommen sie in Excel?Der Schwerpunkt dieser 117. Episode von Frameworks und mehr liegt auf EPPlus [1]. Diese Bibliothek wird damit beworben, den Zugriff auf Excel und Excel-Dateien über .NET und C# zu ermöglichen. Damit stehen Features von Excel wie das Erstellen von Arbeitsmappen, Arbeitsblättern, Tabellen, Formeln, Diagrammen und vieles mehr in C# zur Verfügung.
Herausforderungen und Lösungsansätze
Besonders wenn die Daten zu umfangreich sind oder beispielsweise nicht in Form von CSV-Dateien zur Verfügung stehen, bietet sich eine programmatische Datenkonvertierung an.Die Automatisierung von Excel ist allerdings aufgrund einiger Herausforderungen schwierig. Ein Problem bei der Automatisierung besteht darin, dass Prozesse und Workflows oft sehr komplex sind. Dies führt dazu, dass die Skripte, die zur Automatisierung verwendet werden, ebenfalls sehr komplex werden. Eine Lösung für dieses Problem besteht darin, die Automatisierung in kleinere, gut definierte Schritte zu unterteilen und dafür zu sorgen, dass jeder Schritt einfach und leicht zu verstehen ist. Alternativ lässt sich die Automatisierung direkt in die Anwendungen integrieren, die mit der Datenerzeugung oder Datenverwaltung beschäftigt sind, siehe den Kasten Automatisieren von Excel. So entfällt eine eigene Pipeline zum Erstellen von Excel-Dateien.Automatisieren von Excel
Die Automatisierung ermöglicht es Anwendungen, die in Sprachen wie C# geschrieben sind, andere Anwendungen zu steuern. Somit können Sie beispielsweise in Ihrer .NET-Software Excel anweisen, eine Arbeitsmappe zu erstellen, Daten hinzuzufügen oder Diagramme zu erzeugen.
Eine weitere Herausforderung besteht darin, dass Excel-Dateien häufig in verschiedenen Versionen und Formaten erstellt und verwendet werden. Damit die Automatisierung reibungslos funktioniert, ist es wichtig, sicherzustellen, dass die Pipeline mit allen möglichen Dateiformaten und -versionen von Excel kompatibel ist.Die Automatisierung von Excel über .NET und C# bringt ebenfalls einige Herausforderungen mit sich. Beispielsweise ist es mitunter schwierig, die richtigen Objekte zu finden und darauf zuzugreifen.Dies kann besonders frustrierend sein, wenn wir Code schreiben, der auf verschiedenen Versionen von Excel ausgeführt werden muss. Eine bekannte Lösung dafür ist, die Interop-Bibliothek von Microsoft zu verwenden. Diese Bibliothek bietet eine Reihe von Klassen und Methoden, mit denen sich Excel-Objekte steuern lassen, unabhängig von der Version, die auf dem Computer installiert ist.Wenn große Datenmengen in Excel verarbeitet werden, kann dies aber zu Performance-Problemen führen, insbesondere wenn wir Code schreiben müssen, der viele Daten bearbeitet oder viele Excel-Objekte erstellt. Eine Form der Abhilfe kann sein, das Excel-Objektmodell gar nicht zu verwenden und stattdessen die Daten direkt in den Arbeitsspeicher zu laden. Eine weitere Möglichkeit besteht darin, die Excel-Datei in ein anderes Format zu konvertieren, wie zum Beispiel CSV oder XML, und die Daten dann zu importieren.Allen Herausforderungen und Lösungsansätzen gemein ist die Tatsache, dass es sich in den seltensten Fällen lohnt, diese Ansteuerung und Automatisierung von Excel selbst zu implementieren – also tatsächlich von Hand Excel-konforme Dateien und Daten zu erzeugen und nicht auf fertige Tools, Frameworks und Bibliotheken zurückzugreifen. Dieser immense Aufwand lohnt sich in der Praxis eher selten.
Was ist EPPlus?
EPPlus wird von den Brüdern Jan Källman und Mats Alm entwickelt, die in Stockholm leben. Jan startete EPPlus auf CodePlex im Jahr 2009, weil er für ein Projekt, an dem er arbeitete, eine Bibliothek für Tabellenkalkulationen benötigte und es zu dieser Zeit keine gute Bibliothek mit ausreichender Leistung und Funktionalität gab.EPPlus ist eine Open-Source-Bibliothek für .NET, die es ermöglicht, Excel-Dateien ohne Microsoft-Office-Installation zu erstellen, zu bearbeiten und zu lesen. Der Name ist angelehnt an die Bibliothek ExcelPackage (EP), den Vorgänger von EPPlus. Daher auch der Name, der sich aus der Abkürzung EP und dem Zusatz Plus zusammensetzt. Die Bibliothek bietet eine Vielzahl von Funktionen, die das Erstellen und Bearbeiten von Excel-Dateien sehr einfach und effizient gestaltet. EPPlus bezeichnet sich daher als Spreadsheet-Bibliothek für das .NET Framework und .NET Core. Auf der Website wird das Projekt als die beliebteste Excel-Bibliothek beschrieben, da EPPlus laut NuGet bereits über 67 Millionen Mal heruntergeladen wurde.Zu den Funktionen von EPPlus gehören das Erstellen von Arbeitsmappen und Arbeitsblättern, das Einfügen von Daten, das Formatieren von Zellen, das Erstellen von Diagrammen, das Hinzufügen von Kommentaren und Hyperlinks, das Lesen von Daten aus Excel-Dateien und vieles mehr. Das, was in Excel möglich ist, lässt sich auch über EPPlus in Code abbilden und damit automatisieren.Zudem unterstützt die Bibliothek alle Excel-Dateiformate einschließlich XLSX, XLSM und XLTM. Sie ist einfach zu verwenden und enthält eine umfangreiche Dokumentation und Beispiele, die einen Einstieg erleichtern.Mit Version 6 und 6.1 von EPPlus sind einige Neuerungen hinzugekommen. Dazu gehört die volle Funktionalität in allen .NET-Umgebungen, wie beispielsweise Linux, Blazor und Windows. Erfreulich ist, dass EPPlus nicht mehr die Bibliotheken System.Drawing.Common [2] oder libgdiplus [3] als Abhängigkeiten auf Nicht-Windows-Plattformen benötigt. Zudem ist die Unterstützung für neue Bildformate wie SVG, ICO und WEBP hinzugekommen.Als weitere Features in Version 6 gibt es nun einen HTML- und CSS-Export ebenso wie einen Export nach JSON. Die Unterstützung für .NET 6 ist ebenso neu hinzugekommen wie mehr als dreißig Funktionen bei der Formelberechnung.In Version 6.1 gibt es zudem verbesserte Sicherheit beim Signieren von VBA-Makros sowie die Unterstützung für Agile- und V3-Signaturen. Eine neue ToCollection-Methode vereinfacht den Export von Tabellenkalkulationsdaten direkt in .NET-Klassen. Zudem gibt es nun Methoden zum Gruppieren, Aufheben der Gruppierung und Erweitern von Zeilen und Spalten. Sehr wichtig ist die Unterstützung von .NET 7, die mit der Version 6.1.1 hinzugekommen ist.Wer den Einsatz von EPPlus ab Version 6 plant und vorher schon eine ältere Version im Einsatz hatte, sollte einen Blick auf die Breaking Changes [4] werfen. Hier hat sich einiges getan, beispielsweise bezogen auf die Unterstützung von .NET-Versionen und die zuvor benannten Abhängigkeiten. Auch bei der Schnittstelle gibt es einige Änderungen, sodass Anpassungen im eigenen Code wohl nötig werden.Installation
Dank des NuGet-Pakets [5] ist die Installation von EPPlus kein großer Aufwand:dotnet add <span class="hljs-keyword">package</span> <span class="hljs-title">EPPlus</span>
Die Bibliothek unterstützt eine ganze Reihe von Plattformen und Frameworks, wie zum Beispiel .NET Standard 2.0 und 2.1, das .NET Framework in Version 3.5 und 4.6.2, sowie .NET 6 und .NET 7. Das Testprojekt basiert auf einer Konsolenanwendung auf Basis von .NET 7 und C# 11. Das funktionierte in den Tests problemlos. Unter .NET 7 gibt es unter anderem Abhängigkeiten auf die zusätzlichen Projekte EPPlus.Interfaces und EPPlus.System.Drawing.Im erstgenannten Projekt sind alle Schnittstellen gekapselt, die für den Zugriff auf Excel in den unterschiedlichsten Versionen notwendig sind. Das zweitgenannte Projekt enthält alles Notwendige, um in einer Exceldatei zeichnen zu können – beispielsweise Rechtecke oder Linien, aber auch Bilder, Diagramme und dergleichen.Beim Schreiben dieses Artikels ist die Version 6.1.3 die aktuelle Ausgabe der Bibliothek, die Ende Februar 2023 erschienen ist. Das Projekt wird sehr gut gepflegt und der Code [6] steht auf GitHub zur Verfügung. Als Lizenz kommt die PolyForm Noncommercial License [7] in Version 1.0.0 zum Einsatz. Dass die Themen Lizenzen und Lizenzierung bei EPPlus wichtig sind, zeigt das Demoprojekt sehr gut.
LGPL zu PolyForm
Ursprünglich wurde EPPlus unter der LGPL-Lizenz veröffentlicht. Ab Version 5 wurde die Lizenz auf PolyForm Noncommercial 1.0.0 geändert. Das ist eine Lizenz, die nur die nicht-kommerzielle Nutzung erlaubt. In Kombination mit dieser Lizenz werden nun Lizenzen für Kunden verkauft, die EPPlus in einem kommerziellen Unternehmen einsetzen. EPPlus wurde nie vermarktet, begann sich aber trotzdem in der .NET-Community zu verbreiten. Irgendwann im Jahr 2014 war es das am häufigsten heruntergeladene Tabellenkalkulationspaket auf NuGet. Im Jahr 2019 hatte es über 6,5 Millionen Downloads und war unter den Top 100 der am häufigsten heruntergeladenen Pakete. Dabei handelte es sich um ein Hobbyprojekt und die gesamte Arbeit an der Bibliothek fand in der Freizeit statt.Ein Teil des Codes in EPPlus war zu diesem Zeitpunkt bereits zehn Jahre alt und bedurfte einer Überarbeitung. Gleichzeitig wurden neue Versionen von Excel, dem .NET Framework und .NET Core eingeführt und die Entwickler mussten noch mehr Arbeit aufwenden, um mit diesen Entwicklungen Schritt zu halten. Das Kernteam beschloss Ende 2018 daher, EPPlus Software zu gründen, um Vollzeit an EPPlus arbeiten zu können. Das führte schnell zu einem deutlich besseren Produkt, aber auch zu der Notwendigkeit, über Lizenzen Geld zu verdienen.Bevor wir die Bibliothek EPPlus nutzen können, ist die Lizenz im Projekt zu setzen. Welche Lizenz zum Einsatz kommen soll, lässt sich problemlos konfigurieren.Das geht entweder im Code, in der Datei AppSettings.json oder in einer web.config-Datei. Für das Demoprojekt zum Artikel kommt die nichtkommerzielle Lizenz zum Einsatz. Im Code sieht das wie folgt aus:ExcelPackage.LicenseContext =
LicenseContext.NonCommercial<span class="hljs-comment">;</span>
Soll EPPlus hingegen kommerziell eingesetzt werden, muss das so aussehen – das Beispiel nutzt die Datei AppSettings.json zur Konfiguration:
{
{
<span class="hljs-string">"EPPlus"</span>: {
<span class="hljs-string">"ExcelPackage"</span>: {
<span class="hljs-string">"LicenseContext"</span>: <span class="hljs-string">"Commercial"</span>
}
}
}
}
Als Alternative zu diesen drei Möglichkeiten können wir die Umgebungsvariable EPPlusLicenseContext im System setzen, sodass der dort hinterlegte Wert herangezogen wird. Wichtig ist, diese Umgebungsvariable auf der Benutzer- oder Prozessebene zu setzen.
Dateien öffnen und speichern
Mit der Bibliothek lassen sich Excel-Dateien komfortabel öffnen, verändern und nach der Veränderung wieder speichern. Das ist beispielsweise nützlich, um ein Template zu öffnen, anzupassen und nach der Anpassung unter einem anderen Namen zu speichern. Wie das funktioniert, zeigt das Listing 1 an einem Beispiel.Listing 1: Das Laden und Speichern von Excel-Dateien
<span class="hljs-keyword">using</span> (<span class="hljs-keyword">var</span> <span class="hljs-keyword">package</span> = <span class="hljs-keyword">new</span> <span class="hljs-type">ExcelPackage</span>(<span class="hljs-keyword">new</span> <br/><span class="hljs-type"></span> FileInfo(@<span class="hljs-string">"data\new-file.xlsx"</span>)))<br/><span class="hljs-keyword">using</span> (<span class="hljs-keyword">var</span> template = File.Open((<br/> @<span class="hljs-string">"data\template.xlsx"</span>), FileMode.Open))<br/>{<br/> <span class="hljs-keyword">package</span>.Load(template);<br/><br/> <span class="hljs-keyword">var</span> sheet = <br/> <span class="hljs-keyword">package</span>.Workbook.Worksheets.Add(<span class="hljs-string">"Tabelle2"</span>);<br/> sheet.Cells[<span class="hljs-string">"D1"</span>].Value = <span class="hljs-string">"Etwas Text in einer "</span> + <br/> <span class="hljs-string">"zu kleinen Spalte..."</span>;<br/> sheet.Cells[<span class="hljs-string">"D2"</span>].Value = <br/> <span class="hljs-string">"Diese Informationen stehen in Tabelle2..."</span>;<br/><br/> <span class="hljs-keyword">package</span>.Save();<br/>}
Die veränderte Excel-Datei speichern wir in der Datei mit Namen new-file.xlsx. Diese Datei wird als Excel-Paket im Code erstellt, damit wir die Excel-Funktionen von EPPlus nutzen können. Das File.Open öffnet die Excel-Datei template.xlsx und stellt diese in einer Variablen zur Verfügung. Anschließend lässt sich die Datei laden, ein neues Tabellenblatt hinzufügen, dieses an zwei Stellen, nämlich in zwei Zellen, verändern und diese Veränderung über den Aufruf der save-Methode speichern. Das Ergebnis dieser Transformation ist in Bild 1 zu sehen. Auf der linken Seite ist das Template zu sehen. Auf der rechten Seite die neu gespeicherte Datei mit dem Tabellenblatt 1, das unverändert ist, und dem neuen Tabellenblatt 2. Letzteres enthält unsere Textzeilen in der Spalte D1 und D2.

Das Laden und Speichernvon Excel-Dateien, um sie als Template zu nutzen(Bild 1)
Autor
Ein Arbeitsblatt erstellen und Daten einfügen
Was das vorherige Beispiel zudem gezeigt hat, ist, wie einfach EPPlus es uns macht, Excel-Dateien zu laden und Arbeitsblätter hinzuzufügen. Grundlage dafür ist die Klasse ExcelPackage, die im Code als Schnittstelle zu einer Excel-Datei beziehungsweise den Excel-Funktionen dient. Auf diese Weise lässt sich eine neue Datei erstellen beziehungsweise laden:using (ExcelPackage package =
new ExcelPackage()) { ... }
Arbeitsblätter können wir anschließend über die Worksheets-Auflistung abrufen oder erstellen. Die folgende Zeile Code zeigt, wie ein Arbeitsblatt hinzugefügt wird:
var worksheet =
package.Workbook.Worksheets.Add("New Sheet");
Dahinter verbirgt sich die Klasse ExcelWorksheet, mit der wir Zugriff auf die Inhalte des Arbeitsblatts beziehungsweise der Excel-Funktionen für Arbeitsblätter haben. Auf diese Weise können wir mit Zellen oder Zellbereichen interagieren, beispielsweise um Daten einzufügen, zu verändern, zu löschen oder die Formatierung anzupassen.Die Bibliothek EPPlus bietet uns darüber hinaus nicht nur die Möglichkeit, einzelne Zellen mit Daten zu füllen, sondern diese Daten lassen sich auch aus anderen Datenquellen laden. Die folgende Zeile Code nutzt dazu als Beispiele eine fiktive DataTable als Datenquelle:
worksheet.Cells["A1"].LoadFromDataTable(...);
Zellen auswählen
Bei der Auswahl von Zellen lässt uns EPPlus viele Freiheiten. Die Basis stellt die Klasse ExcelRange dar, die einen Bereich von Zellen darstellt. Dieser Bereich darf eine Zelle oder mehrere Zellen umfassen. Das erlaubt maximale Flexibilität beim Einfügen, Bearbeiten und Löschen von Daten. Einige der grundlegenden Funktionen zeigt das Listing 2.Listing 2: Der Zugriff auf Zellen
using (var package = new ExcelPackage(new <br/> FileInfo(@"data\new-file.xlsx")))<br/>{<br/> var sheet = <br/> package.Workbook.Worksheets.Add("Tabelle3");<br/><br/> // One cell<br/> var cellA2 = sheet.Cells["A2"];<br/> var alsoCellA2 = sheet.Cells[2, 1];<br/><br/> // A range<br/> var ranger = sheet.Cells["A2:C5"];<br/> var sameRanger = sheet.Cells[2, 1, 5, 3];<br/><br/> // sheet.Cells["A1,A4"] // Just A1 and A4<br/> // sheet.Cells["1:1"] // A row<br/> // sheet.Cells["A:B"] // Two columns<br/><br/> // Linq<br/> var l = sheet.Cells["A1:A5"].Where(<br/> range =&gt; range.Comment != null);<br/><br/> ranger.Value = "pushing";<br/><br/> // Offset: down 5 rows, right 10 columns<br/> var movedRanger = ranger.Offset(5, 10);<br/> movedRanger.Value = "Moved";<br/><br/> package.SaveAs(<br/> new FileInfo(@"data\new-file2.xlsx"));<br/>}
Die Daten landen in einem neuen Arbeitsblatt. Dort wird als Nächstes zunächst der Inhalt einzelnen Zellen verändert. Dazu reicht es aus, über die Eigenschaft Cells per Indizes oder Schlüssel auf Zellen zuzugreifen.Bereiche lassen sich über die von Excel bekannte Notation mit einem Doppelpunkt selektieren: A2:C4. Als Alternative steht die Nutzung multipler Indizes zur Verfügung, um einen Bereich zu definieren.Spannend ist in diesem Kontext die Nutzung von LINQ als Abfragesprache. Damit lassen sich Zellen und Bereiche von Zellen selektieren, die einem bestimmten Kriterium entsprechen. Das ist ebenfalls sehr nützlich, um komplexe, datengetriebene Anwendungsszenarien umzusetzen. Des Weiteren steht der Zugriff über Offsets zur Verfügung. Wir können uns eine bestimmte Anzahl von Zeilen und Spalten nach unten beziehungsweise rechts bewegen, um beginnend von diesem Punkt eine Menge an Zellen zu selektieren.
Formatierungen
Eine wichtige Eigenschaft von Excel ist es, unter anderem Spalten, Zeilen und Zellen formatieren zu können. Auch das steht über EPPlus zur Verfügung und lässt sich dadurch automatisieren. Beispielsweise lassen sich Zellen formatieren, Rahmen ziehen, die Vordergrund- und Hintergrundfarbe anpassen und vieles mehr. In Listing 3 sind einige dieser Beispiele zu sehen. Über die Style- und Font-Eigenschaften haben wir Zugriff auf ebendiese Einstellungen für eine Zelle. So lässt sich zum Beispiel die Schriftart verändern:Listing 3: Das Styling von Zellen und Bereichen
using (var package = new ExcelPackage(new <br/> FileInfo(@"data\new-file3.xlsx")))<br/>{<br/> var sheet = <br/> package.Workbook.Worksheets.Add("Tabelle5");<br/> sheet.TabColor = Color.Red;<br/><br/> // Cells with style<br/> var font = sheet.Cells["A1"].Style.Font;<br/> sheet.Cells["A1"].Value = "Bold and proud";<br/> sheet.Cells["A1"].Style.Font.Name = "Arial";<br/> font.Bold = true;<br/> font.Color.SetColor(Color.Green);<br/><br/> sheet.Cells["A3"].Style.Font.SetFromFont(<br/> "Arial", 15);<br/> sheet.Cells["A3"].Value = "SetFromFont(Font)";<br/><br/> // Borders need to be made<br/> sheet.Cells["A1:A2"].Style.Border<br/> .BorderAround(ExcelBorderStyle.Dotted);<br/> sheet.Cells[5, 5, 9, 8].Style.Border<br/> .BorderAround(ExcelBorderStyle.Dotted);<br/><br/> // More style<br/> sheet.Cells[5, 5, 9, 8].Merge = true;<br/> sheet.Cells["D14"].Style.ShrinkToFit = true;<br/> sheet.Cells["D14"].Style.Font.Size = 24;<br/> sheet.Cells["D14"].Value = "Shrinking for fit";<br/><br/> sheet.Cells["D15"].Style.WrapText = true;<br/> sheet.Cells["D15"].Value = "A wrap, yummy!";<br/> sheet.Cells["D16"].Value = "No wrap, ouch!";<br/><br/> // Setting a background color requires setting the <br/> // PatternType first<br/> sheet.Cells["F6:G8"].Style.Fill.PatternType = <br/> ExcelFillStyle.Solid;<br/> sheet.Cells["F6:G8"].Style.Fill.BackgroundColor<br/> .SetColor(Color.Red);<br/><br/> // Horizontal Alignment<br/> var centerStyle = package.Workbook.Styles<br/> .CreateNamedStyle("Center");<br/> centerStyle.Style.HorizontalAlignment = <br/> ExcelHorizontalAlignment.Center;<br/> sheet.Cells["B5"].StyleName = "Center";<br/> sheet.Cells["B5"].Value = "I'm centered";<br/><br/> sheet.Cells["B6"].Style.HorizontalAlignment = <br/> ExcelHorizontalAlignment.Center;<br/> sheet.Cells["B6"].Value = "I'm not centered? :(";<br/><br/> package.SaveAs(<br/> new FileInfo(@"data\new-file4.xlsx"));<br/>}
sheet.Cells["A1"].Style.Font.Name = "Arial";
Das Verbinden und Zusammenführen von Zellen lässt sich ebenfalls über eine simple Eigenschaft implementieren:
sheet.Cells[5, 5, 9, 8].Merge = true;
Wenn Rahmen notwendig sind, lassen sich diese sehr komfortabel um Bereiche von Zellen einfügen:
sheet.Cells["A1:A2"].Style
.Border.BorderAround(ExcelBorderStyle.Dotted);
Das ist lediglich ein Ausschnitt der Features, die EPPlus in diesem Bereich anbietet. In Bild 2 ist das Resultat des Beispielcodes zu sehen.

Das Ergebnis des Stylingsverschiedener Zellen und Bereiche(Bild 2)
Autor
Auch die Hintergrundfarbe des Tabs für das Arbeitsblatt lässt sich anpassen, was folgender Code realisiert:
sheet.TabColor = Color.Red;
Einfügen unterschiedlicher Daten
Beim Einfügen unterschiedlicher Daten bietet uns EPPlus ebenfalls zahlreiche Optionen an. Listing 4 zeigt dazu eine ganze Reihe Möglichkeiten. Beispielsweise fügt der Code Text ein, Zahlen, Prozentwerte, Geldbeträge, Datumsangaben und Uhrzeiten und einen Hyperlink. Neben dem Einfügen der entsprechenden Daten müssen die Zellen oder die Bereiche von Zellen vorher korrekt formatiert sein. Spätestens beim Öffnen in Excel tauchen sonst Probleme auf. Beispielsweise wird über den folgenden AufrufListing 4: Das Einfügen von Daten auf verschiedenen Wege
using (var package = new ExcelPackage(<br/> new FileInfo(@"data\new-file2.xlsx")))<br/>{<br/> var sheet = package.Workbook<br/> .Worksheets.Add("Tabelle4");<br/><br/> // Format as text<br/> sheet.Cells["A1"].Style.Numberformat.Format = "@";<br/><br/> // Numbers<br/> sheet.SetValue("A1", "Numbers");<br/> sheet.Cells["B1"].Value = 15.32;<br/> sheet.Cells["B1"].Style.Numberformat.Format = <br/> "#,##0.00";<br/><br/> // Percentage<br/> sheet.Cells["C1"].Value = 0.5;<br/> sheet.Cells["C1"].Style.Numberformat.Format = "0%";<br/><br/> // Money<br/> sheet.Cells["A2"].Value = "Moneyz";<br/> sheet.Cells["B2,D2"].Value = 15000.23D;<br/> sheet.Cells["C2,E2"].Value = -2000.50D;<br/> sheet.Cells["B2:C2"].Style.Numberformat.Format = <br/> "#,##0.00 [$€-813];[RED]-#,##0.00 [$€-813]";<br/> sheet.Cells["D2:E2"].Style.Numberformat.Format = <br/> "[$$-409]#,##0";<br/><br/> // DateTime<br/> sheet.Cells["A3"].Value = "Timey Wimey";<br/> sheet.Cells["B3"].Style.Numberformat.Format = <br/> "yyyy-mm-dd";<br/> sheet.Cells["B3"].Formula = <br/> $"=DATE({DateTime.Now:yyyy,MM,dd})";<br/> sheet.Cells["C3"].Style.Numberformat.Format = <br/> DateTimeFormatInfo.CurrentInfo<br/> .FullDateTimePattern;<br/> sheet.Cells["C3"].Value = DateTime.Now;<br/> sheet.Cells["D3"].Style.Numberformat.Format = <br/> "dd/MM/yyyy HH:mm";<br/> sheet.Cells["D3"].Value = DateTime.Now;<br/><br/> // A hyperlink (mailto: works also)<br/> sheet.Cells["C25"].Hyperlink = <br/> new Uri("https://itenium.be", UriKind.Absolute);<br/> sheet.Cells["C25"].Value = "Besuche uns";<br/> sheet.Cells["C25"].Style.Font.Color.SetColor(<br/> Color.Blue);<br/> sheet.Cells["C25"].Style.Font.UnderLine = true;<br/><br/> sheet.Cells["Z1"].Clear();<br/> sheet.Cells.AutoFitColumns();<br/><br/> package.SaveAs(<br/> new FileInfo(@"data\new-file3.xlsx"));<br/>}
sheet.Cells["B1"].Style.Numberformat.Format =
"#,##0.00";
die Zelle B1 als Zahl formatiert, bevor Daten eingefügt werden. Das Resultat dieser Code-Beispiele ist in Bild 3 zu sehen. Die Informationen sind korrekt dargestellt und Excel kann die Daten angemessen interpretieren. Auch der Link funktioniert. Das zeigt einige der Möglichkeiten, um mit wenig Aufwand viele verschiedene Daten über C# in ein Arbeitsblatt einzufügen.

Das Resultat nach dem Einfügenverschiedener Daten mit unterschiedlichen Datentypen(Bild 3)
Autor
Bedingte Formatierungen und Formeln
Über EPPlus lassen sich zudem bedingte Formatierungen und Formeln im Allgemeinen nutzen. Die Kombination von beiden Features zeigt Listing 5. Dort ist in einem Arbeitsblatt für einen Bereich von Zellen eine bedingte Formatierung hinterlegt. Zahlen kleiner fünf werden gelb dargestellt. Zahlen größer oder gleich fünf sind grün. Das Ergebnis dieser bedingten Formatierung ist in Bild 4 zu sehen. Das erlaubt es uns, komplexere Szenarien umzusetzen und Excel-Dateien vorzubereiten, die dynamisch auf Daten reagieren, auch wenn diese Daten nachträglich verändert werden und nicht schon bei der Erzeugung der Datei zur Verfügung standen.Listing 5: Bedingte Formatierung mit einer Formel
using (var package = new ExcelPackage(<br/> new FileInfo(@"data\new-file4.xlsx")))<br/>{<br/> var sheet = <br/> package.Workbook.Worksheets.Add("Tabelle6");<br/><br/> var address = new ExcelAddress("B4:B9");<br/> var rule = sheet.ConditionalFormatting<br/> .AddTwoColorScale(address);<br/><br/> rule.LowValue.Type = <br/> eExcelConditionalFormattingValueObjectType.Num;<br/> rule.LowValue.Value = 4;<br/> rule.LowValue.Color = <br/> ColorTranslator.FromHtml("#FFFFEB84");<br/> rule.HighValue.Type = <br/> eExcelConditionalFormattingValueObjectType<br/> .Formula;<br/> rule.HighValue.Formula = <br/> "IF($G$1=\"A&lt;/x:&amp;'cfRule&gt;\",1,5)";<br/> rule.StopIfTrue = true;<br/> rule.Style.Font.Bold = true;<br/> package.SaveAs(<br/> new FileInfo(@"data\new-file5.xlsx"));<br/>}

Das Resultatder bedingten Formatierung von Zellen und Bereichen von Zellen(Bild 4)
Autor
Optionen wie Spaltenbreite und Druckeinstellungen
Neben Optionen zu Zellen lassen sich auch Änderungen an Spalten und allgemeine Einstellungen vornehmen. Die Spaltenbreite lässt sich auf zwei Arten einstellen:sheet.Column(1).AutoFit();
sheet.Column(1).Width = 10;
Die erste Zeile Code passt die Breite automatisch dem Inhalt an, was in vielen Fällen eine gute Option ist. Soll die Excel-Datei aber spezifischer formatiert sein, lässt sich die Spaltenbreite auch manuell über die Width-Eigenschaft anpassen.Weitere Einstellungen betreffen zum Beispiel die Druckeinstellungen. Diese lassen sich pro Arbeitsblatt konfigurieren, wie die nachfolgenden Zeilen Code verdeutlichen:
sheet.PrinterSettings.Orientation =
eOrientation.Landscape;
sheet.PrinterSettings.PaperSize = ePaperSize.A3;
sheet.PrinterSettings.FitToPage = true;
Auf diese Weise können wir im Code bereits Einstellungen vornehmen, die später der Benutzer im Zweifel vergisst.
Alternativen
Auch wenn die Bibliothek EPPlus sehr bekannt ist und beliebt zu sein scheint, haben sich über die Zeit einige Alternativen etabliert. Einige Beispiele für diese Alternativen, sowohl freie als auch kommerzielle Bibliotheken, sind die folgenden:- IronXL: Ein einfaches C#- und VB-Excel-API, mit dem sich Excel-Tabellendateien in .NET blitzschnell lesen, bearbeiten und erstellen lassen. Es ist nicht notwendig, Microsoft Office oder sogar Excel Interop zu installieren. IronXL unterstützt dabei .NET Core, das .NET Framework, Xamarin, Mobile, Linux, macOS und den Einsatz in Azure [8].
- ClosedXML: Eine Open-Source-Bibliothek, die Excel-Dateien erstellen, bearbeiten und lesen kann, ohne dass dazu Microsoft Office oder Excel installiert sein muss. Das Projekt unterstützt Excel-2007–2019-Dateiformate (XLSX), Tabellenkalkulationen, Diagramme sowie Formeln und bietet zudem eine Fluent-Syntax [9].
- NPOI: Eine weitere Open-Source-Bibliothek, die das Schreiben, Lesen und Bearbeiten von Excel-Dateien (bis zu Version 2007) unterstützt. NPOI ist in der Lage, mit verschiedenen Formaten von Excel-Dateien umzugehen, einschließlich XLS, XLSX und XLSM. Das Projekt enthält zudem APIs zum Lesen und Schreiben von Word-Dokumenten und PowerPoint-Präsentationen [10].
- GemBox.Spreadsheet: Eine kommerzielle Bibliothek, die Excel-Dateien in .NET und C# verarbeitet. Das Projekt unterstützt alle gängigen Excel-Dateiformate einschließlich XLSX, XLS, XLSM und CSV. Darüber hinaus bietet die Bibliothek eine schnelle und einfache Möglichkeit, Excel-Workbook-Dokumente zu erstellen, zu bearbeiten und zu analysieren [11].
- Aspose.Cells: Eine weitere kommerzielle Bibliothek, die in .NET und C# Excel-Dateien verarbeiten kann. Das Projekt unterstützt Excel-Dateien bis zur Version 2019 und bietet Funktionen zum Lesen, Schreiben und Manipulieren von Excel-Dokumenten, einschließlich Formatierung, Formeln, Diagrammen und Pivot-Tabellen [12].
- Excel-DNA: Ein unabhängiges Projekt, das .NET in Microsoft Excel integriert, um dessen native Funktionen zu erweitern. Mit C#, Visual Basic.NET oder F# ist es möglich, eine eigenständige Add-in-Datei (XLL) mit leistungsstarken benutzerdefinierten Funktionen (UDFs), benutzerdefinierten Ribbon-Oberflächen und vielem, vielem mehr zu erstellen [13].
- .NET Excel Framework: Ein leistungsstarkes Framework für die Arbeit mit Microsoft Excel. Dieses Framework verfügt über eine Excel-Erstellungs- und Bearbeitungsbibliothek, mit der sich Microsoft-Excel-Dateien in jeder .NET-Anwendung erstellen, lesen und bearbeiten lassen. Das Projekt bietet ein von Excel inspiriertes Spreadsheet UI Control zum Erstellen, Bearbeiten, Anzeigen und Formatieren von Excel-Dokumenten in eigenen Anwendungen. Die leistungsstarken Konvertierungs-APIs erleichtern zudem die Konvertierung von Excel-Dateien in PDF, Bilder und weitere Formate [14].
Fazit
Die Bibliothek EPPlus ist zusammenfassend eine äußerst leistungsfähige und flexible Bibliothek für die Arbeit mit Excel-Dateien in .NET-Anwendungen. Das Projekt bietet ein einfaches und intuitives API und dank der umfangreichen Funktionalitäten ist die Bibliothek eine gute Wahl, wenn es darum geht, schnell und effizient Excel-Dateien zu erstellen, zu bearbeiten und zu analysieren.Besonders hervorzuheben ist die Vielfalt an Funktionen, die EPPlus bietet. Die Bibliothek unterstützt eine breite Palette von Excel-Funktionen, einschließlich Diagrammen, Pivot-Tabellen, Datentypen und Formatierungsoptionen. Darüber hinaus ermöglicht das Projekt die Integration von Bildern und Formen in Excel-Dateien, was eine weitere Stärke darstellt.Ein weiterer Vorteil von EPPlus ist die Leistungsfähigkeit. Die Bibliothek ist sehr schnell und effizient und kann mit sehr großen Excel-Dateien umgehen. Außerdem bietet sie die Möglichkeit, die Daten direkt in die Excel-Datei zu schreiben, ohne dass eine separate Datenquelle benötigt wird.Insgesamt ist EPPlus eine ausgezeichnete Bibliothek, die Entwicklern eine Vielzahl von Funktionen und Möglichkeiten zur Verfügung stellt, um Excel-Dateien zu erstellen und zu bearbeiten.Durch ihr einfaches und intuitives API und ihre hohe Leistungsfähigkeit ist sie eine hervorragende Wahl für alle, die mit Excel-Dateien in .NET-Umgebungen arbeiten. Daher hat sich EPPlus die Wertung „Sehr gut“ verdient und eine Empfehlung noch dazu.Wer auf der Suche nach einer Bibliothek ist, um Excel-Daten und Excel-Dateien in .NET zu bearbeiten, sollte sich EPPlus einmal genauer anschauen.Fussnoten
- Website zu EPPlus, http://www.epplussoftware.com
- Informationen zur Abhängigkeit System.Drawing.Common, http://www.dotnetpro.de/SL2305Frameworks1
- Informationen zur Abhängigkeit libgdiplus, http://www.dotnetpro.de/SL2305Frameworks2
- Übersicht der Breaking Changes in der Version 6 von EPPlus, http://www.dotnetpro.de/SL2305Frameworks3
- NuGet-Paket zu EPPlus, http://www.dotnetpro.de/SL2305Frameworks4
- Repository zu EPPlus auf GitHub, http://www.dotnetpro.de/SL2305Frameworks5
- Informationen zur Lizenz „PolyForm Noncommercial License“, http://www.dotnetpro.de/SL2305Frameworks6
- Website zu IronXL, http://www.dotnetpro.de/SL2305Frameworks7
- Repository zu ClosedXML auf GitHub, http://www.dotnetpro.de/SL2305Frameworks8
- Repository zu NPOI auf GitHub, http://www.dotnetpro.de/SL2305Frameworks9
- Website zum Projekt GemBox.Spreadsheet, http://www.dotnetpro.de/SL2305Frameworks10
- Website zu Aspose.Cells, http://www.dotnetpro.de/SL2305Frameworks11
- Website zu Excel-DNA, https://excel-dna.net
- Website zum Projekt .NET Excel Framework, http://www.dotnetpro.de/SL2305Frameworks12