web-dev-qa-db-fra.com

Exporter vers Excel dans ASP.Net Core 2.0

J'avais l'habitude d'exporter des données vers Excel dans asp.net mvc en utilisant le code ci-dessous 

    Response.AppendHeader("content-disposition", "attachment;filename=ExportedHtml.xls");
    Response.Charset = "";
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.ContentType = "application/vnd.ms-Excel";
    this.EnableViewState = false;
    Response.Write(ExportDiv.InnerHtml);
    Response.End();

Lorsque ce code est exécuté, il crée un fichier et demande un emplacement pour enregistrer 

J'ai essayé de travailler avec NPOI et de créer un fichier Excel très bien, mais je ne peux pas enregistrer le fichier sur l'emplacement du client.

Existe-t-il un moyen de faire en sorte que le code ci-dessus fonctionne sur asp.net core 2.0 ou tout autre moyen permettant de sauvegarder des données au format Excel sur un ordinateur client?

5
Tanwer

Il y a plusieurs façons d'y parvenir. 

Option 1: sauvegarder sur wwwroot

Vous pouvez générer Excel et l'enregistrer dans le dossier wwwroot. Et ensuite, vous pouvez le servir de contenu statique sur la page.

Par exemple, vous avez un dossier appelé "temp" dans le dossier wwwroot qui contient tous les excels nouvellement générés.

<a href="\temp\development\user1\2018\5\9\Excel1.xlsx" download>Download</a>

Il y a des limites à cette approche. L'un d'entre eux est le nouvel attribut download. Cela ne fonctionne que sur les navigateurs modernes.

Option 2: tableau d'octets

Une autre méthode consiste à générer Excel, à le convertir en tableau d'octets et à le renvoyer au contrôleur. Pour cela, j'utilise une bibliothèque appelée "EPPlus" (v: 4.5.1) qui prend en charge .Net Core 2.0.

Voici quelques exemples de codes que j’ai rassemblés pour vous donner une idée. Ce n'est pas prêt pour la production.

using OfficeOpenXml;
using OfficeOpenXml.Style;

namespace DL.SO.Web.UI.Controllers
{
    public class ExcelController : Controller
    {
        public IActionResult Download()
        {
            byte[] fileContents;

            using (var package = new ExcelPackage())
            {
                var worksheet = package.Workbook.Worksheets.Add("Sheet1");

                // Put whatever you want here in the sheet
                // For example, for cell on row1 col1
                worksheet.Cells[1, 1].Value = "Long text";

                worksheet.Cells[1, 1].Style.Font.Size = 12;
                worksheet.Cells[1, 1].Style.Font.Bold = true;

                worksheet.Cells[1, 1].Style.Border.Top.Style = ExcelBorderStyle.Hair;

                // So many things you can try but you got the idea.

                // Finally when you're done, export it to byte array.
                fileContents = package.GetAsByteArray();
            }

            if (fileContents == null || fileContents.Length == 0)
            {
                return NotFound();
            }

            return File(
                fileContents: fileContents,
                contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                fileDownloadName: "test.xlsx"
            );
        }
    }
}
9
David Liang

Voici notre solution à cela:

 Depends on EPPlus.Core/1.5.4

using OfficeOpenXml;

public class XmlService
{
    // [...]
    public void getXlsxFile(SomeTableObject tbl, ref byte[] bytes)
    {
        using (ExcelPackage pck = new ExcelPackage())
        {
            ExcelWorksheet ws = pck.Workbook.Worksheets.Add(tbl.name);
            ws.Cells["A1"].LoadFromDataTable(tbl, true);
            bytes = pck.GetAsByteArray();
        }
    }
}

Plus d'informations sur EPPlus sont disponibles ici et le code source ci-dessus est disponible sur notre repo open source (GPL) .

1
Chaim Eliyah

D'accord avec la réponse de David Liang.

Faites glisser les modifications si vous souhaitez exporter l'ensemble de DataTable.

            string export="export";
            DataTable dt = new DataTable();
            //Fill datatable
            dt = *something*

            byte[] fileContents;
            using (var package = new ExcelPackage())
            {
                var worksheet = package.Workbook.Worksheets.Add(export);
                worksheet.Cells["A1"].LoadFromDataTable(dt, true);
                fileContents = package.GetAsByteArray();
            }
            if (fileContents == null || fileContents.Length == 0)
            {
                return NotFound();
            }
            return File(
                fileContents: fileContents,
                contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                fileDownloadName: export + ".xlsx"
            );
1
Rohil Patel