在ASP.Net Core 2.0中导出到Excel

Tan*_*wer 12 c# excel asp.net-core-2.0

我曾经使用下面的代码将数据导出到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();
Run Code Online (Sandbox Code Playgroud)

当此代码运行时,它会创建一个文件并要求保存位置

我尝试使用NPOI并很好地创建Excel文件,但无法在客户端位置保存文件.

有没有办法让上面的代码适用于asp.net core 2.0或者我可以在客户端机器上以excel格式保存数据的任何其他方式?

Dav*_*ang 22

有很多方法可以实现这一目标.

选项1:保存到wwwroot

您可以生成Excel并将其保存到wwwroot文件夹中.然后,您可以将其作为页面上的静态内容提供.

例如,文件夹中有一个名为"temp"的wwwroot文件夹,用于包含所有新生成的Excel.

<a href="\temp\development\user1\2018\5\9\excel1.xlsx" download>Download</a>
Run Code Online (Sandbox Code Playgroud)

这种方法存在局限性.其中一个是新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"
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

同意梁大卫的回答。

如果要导出整个数据表,请进行幻灯片修改。

            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"
            );
Run Code Online (Sandbox Code Playgroud)