EPPlus
Auf dieser Seite gibt es einen kurzen Erfahrungsbericht über das Arbeiten mit EPPlus:

Was ist EPPlus?

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.

Wie bindet man EPPlus in die ASP-Seite ein?

Folgende Schritte sind umzusetzen:
  • Auf die EPPlus-Download-Seite gehen und die gewünschte Version als Zip-Datei herunterladen.
  • Die Zip-Datei entpacken und die darin enthaltene EPPlus.dll in das bin-Verzeichnis der ASP.NET Applikation kopieren.
  • In den C# Dateien, in denen die EPPlus-Funktionalität verwendet werden soll, sind die entsprechenden Packages hinzuzufügen. Bisher habe ich nur folgende Packages benötigt:
                using OfficeOpenXml;
                using OfficeOpenXml.Style;
              
  • Beim Kompilieren der Sourcen, die EPPlus-DLL als Referenz hinzufügen mit /r:bin\EPPlus.dll.

    So ergab sich beispielsweise folgende Anweisung bei mir:
    C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc /target:library /r:bin\EPPlus.dll /out:bin\[LibraryName].dll src\[LibraryName]\*.cs

Ein erstes Code-Beispiel

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()) {
      

Erstellen eines Arbeitsblatts und Befüllen der Zellen

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.)

Definieren von Zellbereichen

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.

Einfügen und Formatieren der Überschrift

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;
      }
      

Verbundene Zellen als Überschrift

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";
      

Formatieren von Zeilen

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);
      

Einfügen von Integer Werten

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) {}
      }
      

Einfügen von Datums

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 + ")";
      

Anpassen der Spaltenbreite

Mit folgenden Befehlen kann man die automatische Spaltenbreite einstellen:
      iRowNum = pResult.Rows.Count+1;
      pWorkSheet.Cells["A1:M" + iRowNum].AutoFitColumns(0);
      

Setzen der Druckeinstellungen

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;
      

Download der Excel-Datei

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"%>