Question La génération d'un fichier Excel avec EPPlus échoue


Lorsque j'essaie de générer un fichier Excel à l'aide d'EPPlus, Excel affiche le message d'erreur suivant:

Excel ne peut pas ouvrir le fichier «myfilename.xlsx» car le format de fichier ou l'extension de fichier n'est pas valide. Vérifiez que le fichier n'a pas été endommagé et que l'extension du fichier correspond au format du fichier.

Voici mon code:

public ActionResult Index()
{
    using (ExcelPackage package = new ExcelPackage())
    {
        // I populate the worksheet here.  I'm 90% sure this is fine
        // because the stream file size changes based on what I pass to it.

        var stream = new MemoryStream();
        package.SaveAs(stream);

        string fileName = "myfilename.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());
        return File(stream, contentType, fileName);
    }
}

Une idée de ce que je fais mal?


14
2018-03-07 20:26


origine


Réponses:


Tout ce que vous devez faire est de réinitialiser la position du flux. stream.Position = 0;

Toi ne devrait pas écrire directement à la réponse, ce n'est pas la manière MVC. Il ne suit pas le bon pipeline MVC et associe étroitement le code d'action de votre contrôleur à l'objet Response.

Lorsque vous ajoutez un nom de fichier comme troisième paramètre dans File(), MVC ajoute automatiquement le correct Content-Disposition en-tête ... vous n'avez donc pas besoin de l'ajouter manuellement.

En bref, voici ce que vous voulez:

public ActionResult Index()
{
    using (ExcelPackage package = new ExcelPackage())
    {
        // I populate the worksheet here.  I'm 90% sure this is fine
        // because the stream file size changes based on what I pass to it.

        var stream = new MemoryStream();
        package.SaveAs(stream);

        string fileName = "myfilename.xlsx";
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        stream.Position = 0;
        return File(stream, contentType, fileName);
    }
}

27
2017-09-03 18:57



Votre code ne s'affiche pas stream être écrit à la HttpResponse - probablement fait dans le File méthode que vous n'avez pas postée.

Une des manières de travailler est la suivante:

Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader(
            "content-disposition", String.Format(CultureInfo.InvariantCulture, "attachment; filename={0}", fileName));
Response.BinaryWrite(package.GetAsByteArray());
Response.End();

10
2018-03-07 20:37



Semblable à la réponse de Joe, je devais toujours appeler Response.ClearHeaders():

   protected void btnDownload_Click(object sender, EventArgs e)
   {

       ExcelPackage pck = new ExcelPackage();
       var ws = pck.Workbook.Worksheets.Add("Sample2");

       ws.Cells["A1"].Value = "Sample 2";
       ws.Cells["A1"].Style.Font.Bold = true;
       var shape = ws.Drawings.AddShape("Shape1", eShapeStyle.Rect);
       shape.SetPosition(50, 200);
       shape.SetSize(200, 100);
       shape.Text = "Sample 2 outputs the sheet using the Response.BinaryWrite method";
       Response.Clear();    
       Response.ClearHeaders();
       Response.BinaryWrite(pck.GetAsByteArray());
       Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
       Response.AddHeader("content-disposition", "attachment;  filename=Sample2.xlsx");
       Response.End();
  }

2
2018-02-11 07:55