web-dev-qa-db-fra.com

Écrire un fichier Excel dans EPPlus

Je suis coincé là-dessus depuis des jours et malgré toute l'aide là-bas, aucune de ces solutions n'a fonctionné pour moi. Ce que je veux faire, c'est créer un fichier Excel à l'aide de la bibliothèque EPPlus avec quelques données de base que je tire d'une procédure stockée. Voici le code que j'ai dans mon fichier ExportDocument.cs:

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

Tout le code commenté est des choses différentes que j'ai trouvées sur Internet pour essayer. Notez qu'il s'agit d'une organisation scolaire et que nous n'utilisons pas MVC. J'utilise ensuite le code derrière le fichier pour extraire cette méthode comme ceci:

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();*/
}

Notez à nouveau que tout le code commenté est des choses que j'ai trouvées à partir de diverses sources qui n'ont pas fonctionné.

Je ne reçois donc aucune erreur mais lorsque je clique sur le bouton de mon application pour exécuter le code derrière la méthode, rien ne se passe. Il se charge et s'exécute mais aucun fichier n'est créé, rien ne s'ouvre. C'est la première fois que j'utilise EPPlus et je ne suis pas entièrement familiarisé avec l'exportation de choses vers Excel par programmation, donc je me sens perdu ici.

Y a-t-il des suggestions que vous avez? Je serais heureux de clarifier également tous les points que je n'ai pas abordés pleinement.

22
Rahlord

Avez-vous regardé les exemples fournis avec EPPlus?

Celui-ci vous montre comment créer un fichier http://epplus.codeplex.com/wikipage?title=ContentSheetExample

Celui-ci vous montre comment l'utiliser pour retransmettre un fichier http://epplus.codeplex.com/wikipage?title=WebapplicationExample

C'est ainsi que nous utilisons le package pour générer un fichier.

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

Il est préférable que vous travailliez avec DataSets et/ou DataTables. Une fois que vous avez cela, idéalement directement à partir de votre procédure stockée avec des noms de colonne appropriés pour les en-têtes, vous pouvez utiliser la méthode suivante:

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

.. qui produira une belle feuille excels avec une belle table!

Maintenant, pour servir votre fichier, en supposant que vous avez un objet ExcelPackage comme dans votre code ci-dessus appelé 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

Si vous avez une collection d'objets que vous chargez à l'aide de la procédure stockée, vous pouvez également utiliser LoadFromCollection.

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