it-swarm.com.de

Schreiben einer Excel-Datei in EPPlus

Ich habe tagelang daran festgehalten und trotz aller Hilfe hat keine dieser Lösungen für mich funktioniert. Ich möchte eine Excel-Datei mit der EPPlus-Bibliothek erstellen, die einige grundlegende Daten enthält, die ich aus einer gespeicherten Prozedur beziehe. Dies ist der Code, den ich in meiner ExportDocument.cs-Datei habe:

public static ExcelPackage CreateExcelDocument(int [] arr)
{
    String path = @"D:\temp\testsheet3.xlsx";
    //FileInfo newFile = null;
    /*if (!File.Exists(path + "\\testsheet2.xlsx"))
    newFile = new FileInfo(path + "\\testsheet2.xlsx");
    else
        return newFile;*/
    using (ExcelPackage package = new ExcelPackage())
    {
        ExcelWorksheet ws = package.Workbook.Worksheets.Add("testsheet");
        ws.Cells["B1"].Value = "Number of Used Agencies";
        ws.Cells["C1"].Value = "Active Agencies";
        ws.Cells["D1"].Value = "Inactive Agencies";
        ws.Cells["E1"].Value = "Total Hours Volunteered";
        ws.Cells["B1:E1"].Style.Font.Bold = true;

        int x = 2;
        char pos = 'B';
        foreach (object o in arr)
        {
            String str = pos + x.ToString();
            ws.Cells[str].Value = o.ToString();
            if (pos > 'E')
            {
                pos = 'B';
                x++;
            }
            pos++;
        }
        package.Save();
        return package;
    }
}

Bei dem gesamten kommentierten Code handelt es sich um verschiedene Dinge, die ich im Internet gefunden habe, um zu versuchen. Beachten Sie, dass dies eine Schulorganisation ist und wir MVC nicht verwenden. Ich benutze dann den Code hinter Datei, um diese Methode wie folgt zu ziehen:

protected void GenerateReport(Object o, EventArgs e)
{
    Session["reportSession"] = ddReport.SelectedItem.Value.ToString();
    int [] arr = new int [ReportRepository.GetAgencyCounts().Count];
    ReportRepository.GetAgencyCounts().CopyTo(arr, 0);

    ExcelPackage pck = ExportDocument.CreateExcelDocument(arr);
    /*try
    {
        byte [] data = ExportDocument.CreateExcelDocument(arr).GetAsByteArray();
        Response.Clear();
        Response.Buffer = true;
        Response.BinaryWrite(data);
        Response.AddHeader("content-length", data.Length.ToString());
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.Flush();
        Response.Close();
        Response.End();
    }
    catch (Exception ex) { }*/

    /*var stream = new MemoryStream();
    pck.SaveAs(stream);

    String filename = "myfile.xlsx";
    String contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    var cd = new System.Net.Mime.ContentDisposition
    {
        Inline = false,
        FileName = filename
    };
    Response.AppendHeader("Content-Disposition", cd.ToString());
    stream.Position = 0;

    return File(stream, contentType, filename);*/

    /*Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + file.Name);
    Response.TransmitFile(Path.GetFullPath(file.Name));
    Response.Flush();
    Response.Close();*/

    /*Response.ClearHeaders();
    Response.BinaryWrite(pck.GetAsByteArray());
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.AddHeader("content-disposition", "attachment;  filename=Sample2.xlsx");
    Response.Flush();
    Response.Close();*/
}

Beachten Sie erneut, dass der gesamte kommentierte Code Dinge sind, die ich aus verschiedenen Quellen gefunden habe und die nicht funktioniert haben.

Ich erhalte also keine Fehler, aber wenn ich auf die Schaltfläche in meiner Anwendung klicke, um den Code hinter der Methode auszuführen, passiert nichts. Es wird geladen und läuft, aber es werden keine Dateien erstellt, es öffnet sich nichts. Es ist das erste Mal, dass ich EPPlus verwende, und ich bin nicht ganz vertraut mit dem programmgesteuerten Exportieren von Dingen nach Excel, sodass ich mich hier verloren fühle.

Gibt es irgendwelche Vorschläge, die ihr habt? Gerne kläre ich auch Punkte ab, auf die ich noch nicht vollständig eingegangen bin.

22
Rahlord

Haben Sie sich die mit EPPlus gelieferten Muster angesehen?

Hier erfahren Sie, wie Sie eine Datei erstellen http://epplus.codeplex.com/wikipage?title=ContentSheetExample

Dieses Beispiel zeigt Ihnen, wie Sie damit eine Datei zurückstreamen können http://epplus.codeplex.com/wikipage?title=WebapplicationExample

So erzeugen wir mit dem Paket eine Datei.

var newFile = new FileInfo(ExportFileName);
using (ExcelPackage xlPackage = new ExcelPackage(newFile))
{                       
    // do work here                            
    xlPackage.Save();
}
30
Dreaddan

Es ist am besten, wenn Sie mit DataSets und/oder DataTables gearbeitet haben. Sobald Sie dies haben, können Sie im Idealfall direkt aus Ihrer gespeicherten Prozedur mit den richtigen Spaltennamen für Überschriften die folgende Methode anwenden:

ws.Cells.LoadFromDataTable(<DATATABLE HERE>, true, OfficeOpenXml.Table.TableStyles.Light8);

.. was ein wunderschönes Excelsheet mit einem schönen Tisch ergibt!

Angenommen, Sie haben ein ExcelPackage -Objekt wie in Ihrem obigen Code mit dem Namen pck.

Response.Clear();

Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", "attachment;filename=" + sFilename);

Response.BinaryWrite(pck.GetAsByteArray());
Response.End();
13
banging

Wenn Sie über eine Sammlung von Objekten verfügen, die Sie mit einer gespeicherten Prozedur laden, können Sie auch LoadFromCollection verwenden.

using (ExcelPackage package = new ExcelPackage(file))
{
    ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("test");

    worksheet.Cells["A1"].LoadFromCollection(myColl, true, OfficeOpenXml.Table.TableStyles.Medium1);

    package.Save();
}
7
Adarsh Shah