Экспорт в Excel в ASP.Net Core 2.0 - PullRequest
0 голосов
/ 09 мая 2018

Я использовал для экспорта данных, чтобы преуспеть в asp.net MVC, используя код ниже

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

Когда этот код запускается, он создает файл и запрашивает место для сохранения

Я пытался работать с NPOI и очень хорошо создать файл Excel, но не могу сохранить файл в расположении клиента.

Есть ли способ заставить вышеуказанный код работать на asp.net core 2.0 или любым другим способом, где я могу сохранить данные в формате Excel на клиентской машине?

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Вот наше решение для этого:

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

Более подробная информация о EPPlus доступна здесь , а вышеприведенный исходный код можно найти на нашем репо с открытым исходным кодом (GPL) .

0 голосов
/ 28 декабря 2018

Согласился с ответом Дэвида Ляна.

Слайд-модификации, если вы хотите экспортировать весь 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"
            );
0 голосов
/ 09 мая 2018

Есть много способов достичь этого.

Вариант 1: сохранить в wwwroot

Вы можете создать Excel и сохранить его в папке wwwroot. И тогда вы можете использовать его как статический контент на странице.

Например, у вас есть папка с именем temp в папке wwwroot, в которой содержатся все новые сгенерированные экземпляры.

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

У этого подхода есть ограничения. 1 из них - новый атрибут download. Работает только в современных браузерах.

Вариант 2: байтовый массив

Другой способ - сгенерировать Excel, преобразовать его в байтовый массив и отправить обратно в контроллер. Для этого я использую библиотеку «EPPlus» (v: 4.5.1), которая поддерживает .Net Core 2.0.

Ниже приведены лишь некоторые примеры кодов, которые я собрал, чтобы дать вам идею. Это не производство готово.

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"
            );
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...