web-dev-qa-db-ja.com

ASP.Net Core 2.0でExcelにエクスポートする

私は以下のコードを使用してasp.net mvcでExcelにデータをエクスポートしていました

    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コア2.0で動作させる方法や、クライアントマシンでExcel形式でデータを保存できる他の方法はありますか?

10
Tanwer

それを達成する方法はたくさんあります。

オプション1:wwwrootに保存

Excelを生成して、wwwrootフォルダーに保存できます。そして、それをページ上の静的コンテンツとして提供できます。

たとえば、wwwrootフォルダー内に 'temp'というフォルダーがあり、新しく生成されたすべてのExcelが含まれています。

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

このアプローチには制限があります。それらの1つは、新しいdownload属性です。最新のブラウザでのみ機能します。

オプション2:バイト配列

別の方法は、Excelを生成し、バイト配列に変換してコントローラーに送り返すことです。そのために、.Net Core 2.0をサポートする「EPPlus」(v:4.5.1)というライブラリを使用します。

以下は、アイデアを提供するためにまとめたサンプルコードの一部です。生産準備ができていません。

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"
            );
        }
    }
}
16
David Liang

David Liangの答えに同意しました。

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"
            );
4
Rohil Patel

これに対する解決策は次のとおりです。

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の詳細については、 here を参照してください。上記のソースコードは our open source repo(GPL) にあります。

1
Chaim Eliyah