使用Magicodes.IE快速導出Excel


前言

總是有很多朋友咨詢Magicodes.IE如何基於ASP.NET Core導出Excel,出於從框架的體驗和易用性的角度,決定對Excel的導出進行獨立封裝,以便於大家更易於使用,開箱即用。

注意:Magicodes.IE是從框架的易用性和體驗的角度對Excel導出進行了封裝,但是希望大家先理解原理后再使用。

1.安裝包

Install-Package Magicodes.IE.Excel.AspNetCore

2.引用命名空間

using Magicodes.ExporterAndImporter.Excel.AspNetCore;

3.直接使用XlsxFileResult

參考Demo如下所示:

    [ApiController]
    [Route("api/[controller]")]
    public class XlsxFileResultTests : ControllerBase
    {
        /// <summary>
        /// 使用Byte數組導出Excel文件
        /// </summary>
        /// <returns></returns>
        [HttpGet("ByBytes")]
        public async Task<ActionResult> ByBytes()
        {
            //隨機生成100條數據
            var list = GenFu.GenFu.ListOf<ExportTestDataWithAttrs>(100);
            var exporter = new ExcelExporter();
            var bytes = await exporter.ExportAsByteArray<ExportTestDataWithAttrs>(list);
            //使用XlsxFileResult進行導出
            return new XlsxFileResult(bytes: bytes);
        }

        /// <summary>
        /// 使用流導出Excel文件
        /// </summary>
        /// <returns></returns>
        [HttpGet("ByStream")]
        public async Task<ActionResult> ByStream()
        {
            //隨機生成100條數據
            var list = GenFu.GenFu.ListOf<ExportTestDataWithAttrs>(100);
            var exporter = new ExcelExporter();
            var result = await exporter.ExportAsByteArray<ExportTestDataWithAttrs>(list);
            var fs = new MemoryStream(result);
            return new XlsxFileResult(stream: fs, fileDownloadName: "下載文件");
        }


        /// <summary>
        /// 使用泛型集合導出Excel文件
        /// </summary>
        /// <returns></returns>
        [HttpGet("ByList")]
        public async Task<ActionResult> ByList()
        {
            var list = GenFu.GenFu.ListOf<ExportTestDataWithAttrs>(100);
            return new XlsxFileResult<ExportTestDataWithAttrs>(data: list);
        }
    }

如上所示,引用 Magicodes.IE.Excel.AspNetCore之后,導出就會變得如此簡單。值得注意的是:

  1. 使用XlsxFileResult需引用包Magicodes.IE.Excel.AspNetCore
  2. XlsxFileResult繼承自ActionResult,目前支持字節數組、流和泛型集合為參數的Excel文件下載
  3. 支持傳遞下載文件名,參數名fileDownloadName,如不傳則自動生成唯一的文件名

核心實現

Magicodes.IE.Excel.AspNetCore中,我們添加了自定義的ActionResult——XlsxFileResult,核心參考代碼如下所示:

    /// <summary>
    /// Excel文件ActionResult
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class XlsxFileResult<T> : XlsxFileResultBase where T : class, new()
    {
        /// <summary>
        ///
        /// </summary>
        /// <param name="data"></param>
        /// <param name="fileDownloadName"></param>
        public XlsxFileResult(ICollection<T> data, string fileDownloadName = null)
        {
            FileDownloadName = fileDownloadName;
            Data = data;
        }

        public string FileDownloadName { get; }
        public ICollection<T> Data { get; }

        public async override Task ExecuteResultAsync(ActionContext context)
        {
            var exporter = new ExcelExporter();
            var bytes = await exporter.ExportAsByteArray(Data);
            var fs = new MemoryStream(bytes);
            await DownloadExcelFileAsync(context, fs, FileDownloadName);
        }
    }

    /// <summary>
    ///
    /// </summary>
    public class XlsxFileResult : XlsxFileResultBase
    {
        /// <summary>
        ///
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="fileDownloadName"></param>
        public XlsxFileResult(Stream stream, string fileDownloadName = null)
        {
            Stream = stream;
            FileDownloadName = fileDownloadName;
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="bytes"></param>
        /// <param name="fileDownloadName"></param>

        public XlsxFileResult(byte[] bytes, string fileDownloadName = null)
        {
            Stream = new MemoryStream(bytes);
            FileDownloadName = fileDownloadName;
        }


        public Stream Stream { get; protected set; }
        public string FileDownloadName { get; protected set; }


        public async override Task ExecuteResultAsync(ActionContext context)
        {
            await DownloadExcelFileAsync(context, Stream, FileDownloadName);
        }
    }

    /// <summary>
    /// 基類
    /// </summary>
    public class XlsxFileResultBase : ActionResult
    {
        /// <summary>
        /// 下載Excel文件
        /// </summary>
        /// <param name="context"></param>
        /// <param name="stream"></param>
        /// <param name="downloadFileName"></param>
        /// <returns></returns>
        protected virtual async Task DownloadExcelFileAsync(ActionContext context,
                                                            Stream stream,
                                                            string downloadFileName)
        {
            var response = context.HttpContext.Response;
            response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

            if (downloadFileName == null)
            {
                downloadFileName = Guid.NewGuid().ToString("N") + ".xlsx";
            }

            if (string.IsNullOrEmpty(Path.GetExtension(downloadFileName)))
            {
                downloadFileName += ".xlsx";
            }

            context.HttpContext.Response.Headers.Add("Content-Disposition", new[] {
                "attachment; filename=" +HttpUtility.UrlEncode(downloadFileName)
            });
            await stream.CopyToAsync(context.HttpContext.Response.Body);
        }
    }

歡迎大家多多PR並且前來解鎖更多玩法。

知識點總結

敲黑板,麻煩有空幫點點,為了德瑪西亞:

ASP.NET Core Web API 中控制器操作的返回類型 | Microsoft Docs

Reference

https://github.com/dotnetcore/Magicodes.IE

最后

有興趣有精力的朋友可以幫忙PR一下單元測試,由於精力有限,先手測了,參考:

ASP.NET Core 中的測試控制器邏輯 | Microsoft Docs

寫個功能幾分鍾到十幾分鍾,碼個文檔要半天,就此結束。

Magicodes.IE:導入導出通用庫,支持Dto導入導出、模板導出、花式導出以及動態導出,支持Excel、Csv、Word、Pdf和Html。

相關庫會一直更新,在功能體驗上有可能會和本文教程有細微的出入,請以相關具體代碼、版本日志、單元測試示例為准。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM