EPPlus ist eine .NET-Library, die man für ASP.NET-Webseiten verwenden kann,
um Excel-Dateien zu erstellen.
Über diese StackOverflow
Seite bin ich zu dieser Library gekommen.
Folgende Schritte sind umzusetzen:
using OfficeOpenXml; using OfficeOpenXml.Style;
/r:bin\EPPlus.dll
.
C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc /target:library /r:bin\EPPlus.dll /out:bin\[LibraryName].dll src\[LibraryName]\*.cs
Im folgenden Beispiel wird angenommen, dass Daten in einem DataTable
Objekt namens
pResult
vorliegen.
Die folgenden Befehle werden innerhalb folgender Anweisung durchgeführt:
using (ExcelPackage pPackage = new ExcelPackage()) {
Mit folgendem Befehl wird ein Datenblatt mit dem Namen Download
erstellt:
ExcelWorksheet pWorkSheet = pPackage.Workbook.Worksheets.Add("Download");
Mit folgendem Befehl werden die Daten aus dem DataTable
Objekt namens
pResult
in die Tabelle geschrieben, beginnend ab Zelle A2:
pWorkSheet.Cells["A2"].LoadFromDataTable(pResult, false);
Der Nachteil dieser Methode ist, dass alle Daten als Text eingefügt werden. (Ich komme später darauf zurück, wie ich das Problem gelöst habe.)
Es gibt mehrere Möglichkeiten, um Zellbereiche zu markieren. Hier die Varianten, die ich bis jetzt verwendet habe:
ExcelRange pRange = pWorkSheet.Cells["A1:B3"];
ExcelRange pRange = pWorkSheet.Cells[1, 1, 2, 3];Dabei handelt es sich bei den Parametern um die Zeilen Id Start, Spalten Id Start, Zeilen Id Ende, Spalten Id Ende.
Mit folgenden Befehlen können den Zellen A1 und B1 Text-Werte zugewiesen werden:
pWorkSheet.Cells[1, 1].Value = "Überschrift A1"; pWorkSheet.Cells[1, 2].Value = "Überschrift A2";
Mit den folgenden Befehlen wird die Schrift der Zellen von A1 und B1 fett formatiert und ein gelber Hintergrund eingestellt. Zusätzlich wird noch die Autofilter-Funktionalität aktiviert.
using (ExcelRange pRange = pWorkSheet.Cells["A1:B1"]) { pRange.Style.Font.Bold = true; pRange.Style.Fill.PatternType = ExcelFillStyle.Solid; pRange.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.Yellow); pRange.AutoFilter = true; }
Der folgende Code verbindet in der ersten Zeile die ersten 10 Spalten. Es wird die Schriftgröße 20 und fett eingestellt. Die horizontale Ausrichtung wird auf zentriert eingestellt. Danach wird in der ersten Zelle der Text der Überschrift gesetzt.
pWorkSheet.Cells[1,1,1,10].Merge = true; pWorkSheet.Cells[1,1,1,10].Style.Font.Bold = true; pWorkSheet.Cells[1,1,1,10].Style.Font.Size = 20; pWorkSheet.Cells[1,1,1,10].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; pWorkSheet.Cells[1,1].Value = "Meine Überschrift";
Die folgenden Befehle wählen eine Zeile aus, setzen deren Höhe auf 25, die Schriftart auf Arial und hinterlegen die Zellen mit einer hellgrünen Farbe.
int iRowId = 10; pWorkSheet.Row(iRowId).Height = 25; pWorkSheet.Row(iRowId).Style.Font.Name = "Arial"; pWorkSheet.Row(iRowId).Style.Fill.PatternType = ExcelFillStyle.Solid; System.Drawing.Color pColor = System.Drawing.Color.LightGreen; pWorkSheet.Row(iRowId).Style.Fill.BackgroundColor.SetColor(pColor);
Mit folgendem Code konnte ich den Zellen einer Spalte Integer Werte zuweisen. Das automatisierte Laden der
Daten aus dem DataTable
Objekt erzeugte Textwerte:
int iRowNum = pResult.Rows.Count; for (int i = 0; i < iRowNum; i++) { DataRow pRow = pResult.Rows[i]; try { int iValue = Int32.Parse(pRow["IntegerValues"].ToString()); pWorkSheet.Cells[(i+2), 1].Value = iValue; } catch (Exception) {} }
Um Datumswerte in Zellen einzufügen habe ich folgende Methode geschrieben:
private void SetDateToExcelCell(ExcelRange pRange, DateTime pDateTime) { if (pRange == null) return; if (pDateTime.Equals(DateTime.MinValue)) return; pRange.Style.Numberformat.Format = "yyyy-mm-dd"; pRange.Value = pDateTime; }
Man kann somit mit folgenden Aufruf das aktuelle Datum in die Zelle A2 einfügen:
SetDateToExcelCell(pWorkSheet.Cells[2, 1], DateTime.Now);
Alternativ könnte man bei der Wertzuweisung in der Methode auch eine Formel verwenden, was aber dazu führt, dass die automatische Anpassung der Spaltenbreite nicht mehr richtig funktioniert, weil anscheinend die Breite des Formelwerts nicht berücksichtigt wird.
pRange.Formula = "=DATE(" + pDateTime.Year + "," + pDateTime.Month + "," + pDateTime.Day + ")";
Mit folgenden Befehlen kann man die automatische Spaltenbreite einstellen:
iRowNum = pResult.Rows.Count+1; pWorkSheet.Cells["A1:M" + iRowNum].AutoFitColumns(0);
Der folgende Code setzt das Ausdrucksformat auf A3 im Querformat. Außerdem werden alle befüllten Zellen als Druckbereich definiert, der auf eine Seite ausgedruckt werden soll.
pWorkSheet.PrinterSettings.Orientation = eOrientation.Landscape; pWorkSheet.PrinterSettings.PaperSize = ePaperSize.A3; pWorkSheet.PrinterSettings.FitToPage = true;
Mit folgenden Befehlen startet man den Download der Excel-Datei:
Response.Clear(); Response.AddHeader("content-disposition", "attachment; filename=Download.xlsx"); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.BinaryWrite(pPackage.GetAsByteArray()); Response.End();
Danach ist noch der Code-Block zu schließen, mit dem die Excel-Befehle eröffnet wurden.
Die ASPX-Seite für den Download muss somit nur die Referenz auf den Code-Behind beinhalten,
weil der Response nur die Excel-Datei darstellt.
<%@ Assembly Name="MyDLL" %> <%@ Import Namespace="MyNamespace" %> <%@ page language="C#" CodeBehind="Download.aspx.cs" Inherits="MyNamespace.Download"%>