添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

总是有很多朋友咨询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。

相关库会一直更新,在功能体验上有可能会和本文教程有细微的出入,请以相关具体代码、版本日志、单元测试示例为准。

前言总是有很多朋友咨询Magicodes.IE如何基于ASP.NET Core导出Excel,出于从框架的体验和易用性的角度,决定对Excel的导出进行独立封装,以便于大家更易于使用,开箱即用。注意:Magicodes.IE是从框架的易用性和体验的角度对Excel导出进行了封装,但是希望大家先理解原理后再使用。1.安装包Install-Package Magicodes.IE.Exce...
本文件只需修改一个属性,直接替换官方文件,引入即可解决导出excel的数字变成科学计数法的问题。 有个项目需要用到jquery 的easyui和导出excel,发现官方下载的datagrid-export.js有几处bug,例如导出excel格式,长数字会默认按科学计数法显示或没了零开头的数字,不符合所见即所得要求。 首先说明前提条件,前端网页结果显示是正常无误的,用txt文本打开导出的字段也是正常的零开头的长位数字“012345678910”。 这个问题,如果靠客户端的excel或wps打开再转换单元格格式的话(比如单元格逐个添加单引号“'”或者设置文本再粘贴或分列导入等方法),往往要求操作员复杂操作,教学又麻烦,实在是多此一举。本人尝试了网上几种方法,开始尝试在mssql服务器后端sql语句中,select选择字段时候用过“convert(varchar,字段)as 新字段名”、“转义字符——“\'”、“\t”、“ ”、“’”、“&apos;”等等几种,无效!因此可以判断后台输出类型与导出excel的字段格式无关,放弃后端sql更改操作。 本项目利用的是jquery扩展的datagrid-export.js输出excel,所以,前端输出文件格式的字段类型控制才是解决问题的关键所在。 > 今天项目用到了导出table表格,但表头有点特殊,多个合并的单元格。 > 搜索了半天,发现有博主使用 ``xlsx.full.min.js`` 做过此类功能,使用的是vue+elementUI,特在该基础上改进和封装了一下,兼容普通HTML的js引入。 > 包含 ``xlsx.full.util.js``、xlsx.full.min.js、index.html、vue.demo.html [HttpPost] [Route("[area]/[controller]/[action]")] public IActionResult DownloadEmployee(DownloadEmployeeInput input) Magicodes.IE是一个导入导出通用库,支持Dto导入导出以及动态导出,支持Excel、Word、Pdf、Csv和Html。在本篇教程,笔者将讲述如何使用Magicodes.IE进行花式导出。 在本篇教程,笔者主要讲述如何使用IE进行花式导出并满足客户爸爸的需求。 同一个数据源拆分Sheet导出 通常情况下,客户爸爸的需求是比较正常的,比如在数据量大时,希望将数据进...
一个导入导出通用库,支持Dto导入导出以及动态导出,支持Excel、Word、Pdf、Csv和Html。在本篇教程,笔者将讲述如何使用Magicodes.IE的导入导出筛选器。在开始之前,我们需要先了解Magicodes.IE目前支持的筛选器: IImportResultFilter 导入结果筛选器,可以修改导入结果包括验证错误信息(比如动态修改错误标注) IImportHeaderFilter 导入列头筛选器,可以修改列名、值映射集合等等 IExporterHe
导入导出通用库,通过导入导出DTO模型来控制导入和导出,支持Excel、Word、Pdf和Html。 GitHub地址:https://github.com/xin-lai/Magicodes.IE 1.安装包Magicodes.IE.Csv Install-Package Magicodes.IE.Csv 2.使用Magicodes.IE.Csv导出Csv 通过如下代码片段我们将导出的内容通过相应的特性做出相应的处理. ExporterHeaderAttrib 导入导出通用库,支持Dto导入导入,模板导出,花式导出以及动态导出,支持Excel,Csv,Word,Pdf和HTML。 GitHub: : 编码云(手动同步,不维护): : :hot_beverage:进行中 2021-02-31 :triangular_flag:已完成 2020-10-30 :triangular_flag:已完成 2020-09-30 :triangular_flag:已完成 2020-06-30 :triangular_flag:已完成 2020-04-31 :triangular_flag:已完成 2020-03-15 Azure开发运营 建立状态: Azure DevOps覆盖率(主): Azure DevOps涵盖范围(开发): Azure De 本教程主要说明如果使用Magicodes.IE.Excel完成教材订购表的Excel模板导出。 本教程使用Magicodes.IE.Excel来完成Excel模板导出 需要通过创建Dto来完成导出 需要按要求准备Excel模板 1.安装包Magicodes.IE.Excel 在本篇教程中,我们仅演示使用Excel来完成学生数据的导入。我们需要在已准备好的工...
可以使用EPPlus库的EPPlus.Interfaces命名空间来实现简单的导出Excel文件。具体来说,您需要在您的MVC项目中引用EPPlus库,并使用以下代码段将数据导出Excel文件中: var package = new ExcelPackage(); var worksheet = package.Workbook.Worksheets.Add("WorksheetName"); worksheet.Cells.LoadFromCollection(yourDataCollection, true); var fileBytes = package.GetAsByteArray(); return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "FileName.xlsx"); 请注意,您需要将“yourDataCollection”替换为所需导出的数据集合。