前言

总是有很多朋友咨询Magicodes.IE如何基于ASP.NET Core导出Excel,出于从框架的体验和易用性的角度,决定对Excel的导出进行独立封装,以便于大家更易于使用,开箱即用。

注意:Magicodes.IE是从框架的易用性和体验的角度对Excel导出进行了封装,但是希望大家先理解原理后再使用。

1.安装包

  1. Install-Package Magicodes.IE.Excel.AspNetCore

2.引用命名空间

using Magicodes.ExporterAndImporter.Excel.AspNetCore;

3.直接使用XlsxFileResult

参考Demo如下所示:

  1. [ApiController]
  2. [Route("api/[controller]")]
  3. public class XlsxFileResultTests : ControllerBase
  4. {
  5. /// <summary>
  6. /// 使用Byte数组导出Excel文件
  7. /// </summary>
  8. /// <returns></returns>
  9. [HttpGet("ByBytes")]
  10. public async Task<ActionResult> ByBytes()
  11. {
  12. //随机生成100条数据
  13. var list = GenFu.GenFu.ListOf<ExportTestDataWithAttrs>(100);
  14. var exporter = new ExcelExporter();
  15. var bytes = await exporter.ExportAsByteArray<ExportTestDataWithAttrs>(list);
  16. //使用XlsxFileResult进行导出
  17. return new XlsxFileResult(bytes: bytes);
  18. }
  19. /// <summary>
  20. /// 使用流导出Excel文件
  21. /// </summary>
  22. /// <returns></returns>
  23. [HttpGet("ByStream")]
  24. public async Task<ActionResult> ByStream()
  25. {
  26. //随机生成100条数据
  27. var list = GenFu.GenFu.ListOf<ExportTestDataWithAttrs>(100);
  28. var exporter = new ExcelExporter();
  29. var result = await exporter.ExportAsByteArray<ExportTestDataWithAttrs>(list);
  30. var fs = new MemoryStream(result);
  31. return new XlsxFileResult(stream: fs, fileDownloadName: "下载文件");
  32. }
  33. /// <summary>
  34. /// 使用泛型集合导出Excel文件
  35. /// </summary>
  36. /// <returns></returns>
  37. [HttpGet("ByList")]
  38. public async Task<ActionResult> ByList()
  39. {
  40. var list = GenFu.GenFu.ListOf<ExportTestDataWithAttrs>(100);
  41. return new XlsxFileResult<ExportTestDataWithAttrs>(data: list);
  42. }
  43. }

如上所示,引用 Magicodes.IE.Excel.AspNetCore之后,导出就会变得如此简单。值得注意的是:

  1. 使用XlsxFileResult需引用包Magicodes.IE.Excel.AspNetCore
  2. XlsxFileResult继承自ActionResult,目前支持字节数组、流和泛型集合为参数的Excel文件下载
  3. 支持传递下载文件名,参数名fileDownloadName,如不传则自动生成唯一的文件名

核心实现

Magicodes.IE.Excel.AspNetCore中,我们添加了自定义的ActionResult——XlsxFileResult,核心参考代码如下所示:

  1. /// <summary>
  2. /// Excel文件ActionResult
  3. /// </summary>
  4. /// <typeparam name="T"></typeparam>
  5. public class XlsxFileResult<T> : XlsxFileResultBase where T : class, new()
  6. {
  7. /// <summary>
  8. ///
  9. /// </summary>
  10. /// <param name="data"></param>
  11. /// <param name="fileDownloadName"></param>
  12. public XlsxFileResult(ICollection<T> data, string fileDownloadName = null)
  13. {
  14. FileDownloadName = fileDownloadName;
  15. Data = data;
  16. }
  17. public string FileDownloadName { get; }
  18. public ICollection<T> Data { get; }
  19. public async override Task ExecuteResultAsync(ActionContext context)
  20. {
  21. var exporter = new ExcelExporter();
  22. var bytes = await exporter.ExportAsByteArray(Data);
  23. var fs = new MemoryStream(bytes);
  24. await DownloadExcelFileAsync(context, fs, FileDownloadName);
  25. }
  26. }
  27. /// <summary>
  28. ///
  29. /// </summary>
  30. public class XlsxFileResult : XlsxFileResultBase
  31. {
  32. /// <summary>
  33. ///
  34. /// </summary>
  35. /// <param name="stream"></param>
  36. /// <param name="fileDownloadName"></param>
  37. public XlsxFileResult(Stream stream, string fileDownloadName = null)
  38. {
  39. Stream = stream;
  40. FileDownloadName = fileDownloadName;
  41. }
  42. /// <summary>
  43. ///
  44. /// </summary>
  45. /// <param name="bytes"></param>
  46. /// <param name="fileDownloadName"></param>
  47. public XlsxFileResult(byte[] bytes, string fileDownloadName = null)
  48. {
  49. Stream = new MemoryStream(bytes);
  50. FileDownloadName = fileDownloadName;
  51. }
  52. public Stream Stream { get; protected set; }
  53. public string FileDownloadName { get; protected set; }
  54. public async override Task ExecuteResultAsync(ActionContext context)
  55. {
  56. await DownloadExcelFileAsync(context, Stream, FileDownloadName);
  57. }
  58. }
  59. /// <summary>
  60. /// 基类
  61. /// </summary>
  62. public class XlsxFileResultBase : ActionResult
  63. {
  64. /// <summary>
  65. /// 下载Excel文件
  66. /// </summary>
  67. /// <param name="context"></param>
  68. /// <param name="stream"></param>
  69. /// <param name="downloadFileName"></param>
  70. /// <returns></returns>
  71. protected virtual async Task DownloadExcelFileAsync(ActionContext context,
  72. Stream stream,
  73. string downloadFileName)
  74. {
  75. var response = context.HttpContext.Response;
  76. response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
  77. if (downloadFileName == null)
  78. {
  79. downloadFileName = Guid.NewGuid().ToString("N") + ".xlsx";
  80. }
  81. if (string.IsNullOrEmpty(Path.GetExtension(downloadFileName)))
  82. {
  83. downloadFileName += ".xlsx";
  84. }
  85. context.HttpContext.Response.Headers.Add("Content-Disposition", new[] {
  86. "attachment; filename=" +HttpUtility.UrlEncode(downloadFileName)
  87. });
  88. await stream.CopyToAsync(context.HttpContext.Response.Body);
  89. }
  90. }

欢迎大家多多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快速导出Excel的更多相关文章

  1. asp.net mvc4使用NPOI 数据处理之快速导出Excel文档

    一.背景 在之前做的小项目里有一需求是:要求将一活动录入的数据进行统计,并以excel表格形式导出来,并且对表格格式要求并不高. 二.问题分析 鉴于用户只要求最终将数据库中的数据导出excel,对于格 ...

  2. DataGridView如何快速导出Excel

    从DataGridView或DataTable导出Excel文件,为了按照数据类型设置单元格格式,导出Excel时速度都比较慢,一直找不到好的办法. 最后从外文网站上找到解决办法,使用ws.get_R ...

  3. AX 利用windows粘贴板功能实现批量数据快速导出EXCEL

    static void test(Args _args) { int lineNum; int titleLines; SysExcelApplication excel; SysExcelWorkb ...

  4. PHP快速导出Excel文件 (采用xlsx Writer)

    <?php include_once("xlsxwriter.class.php"); ini_set('display_errors', 0); ini_set('log_ ...

  5. 利用PHPExcel快速导出excel

    <?php $objPHPExcel = new PHPExcel(); $objSheet = $objPHPExcel->getActiveSheet(); $array = arra ...

  6. 使用NPOI快速导出导入Excel

    这两天做项目需要导入导出EXCEL,是基于NPOI的封装,设计思路是使用DataTable,然后导出一个和DataTable一模一样的Excel表出来 github地址:https://github. ...

  7. C#弹出窗体、C#导出Excel、C#数据展示框、C#弹出框

    1.new 一个窗体,然后设置窗体属性. 2.添加数据展示控件,显示数据. 3.添加按钮控件,调用导出Excel代码,实现导出Excel功能. using System; using System.C ...

  8. c#使用NPOI快速导出到Excel

    接上篇博文<C#快速导出到excel>:由于此种方法不能导出成.xlsx格式,为解决此问题,本次分享使用NPOI. 参考:https://www.cnblogs.com/lazyneal/ ...

  9. 使用HTML,CSS快速导出数据到Excel

    在应用中经常会遇到要从系统或数据库中导出数据平面文件,一般是导出到txt,csv或excel.txt和csv一般用在系统间的数据交换, 而excel一般有较好的显示效果,可以按照一定的模板导出,导出就 ...

随机推荐

  1. Ruby升级的最新方法/CocoaPods安装

    今天安装cocoapods时候出现了下面的提示 Error installing pods:active support requires Ruby version >= 2.2.0//这个需求 ...

  2. 堆&&优先队列&&TreeMap

    题目描述 5710. 积压订单中的订单总数 题解 题目不难,主要是要读懂题意,一步步模拟,代码较长,需要细心检查. 坑较多,比如我犯了很多傻逼问题:想都不想就拿1<<9+7当作100000 ...

  3. AcWing 99. 激光炸弹

    地图上有n个目标,用整数x,y表示目标在地图上的位置,每个目标都有一个价值Wi. 注意:不同目标可能在同一位置. 现在有一种新型的激光炸弹,可以摧毁一个包含r个位置的正方形内的所有目标. 激光炸弹的投 ...

  4. Linux:linux网路路由命令

    查看路由 #查看所有路由信息 route -n 删除路由 #删除路由 route del default 修改路由 #修改路由 #先删除路由 route del default #在新建 route ...

  5. getopt模块的学习

    在运行程序时,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能.目前有短选项和长选项两种格式.短选项格式为"-"加上单个字母选项:长选项为"--"加 ...

  6. PHP 跨域问题 (转)

    通过设置Access-Control-Allow-Origin来实现跨域. 例如:客户端的域名是client.runoob.com,而请求的域名是server.runoob.com. 如果直接使用aj ...

  7. CSS 奇思妙想 | 巧妙的实现带圆角的三角形

    之前在这篇文章中 -- <老生常谈之 CSS 实现三角形>,介绍了 6 种使用 CSS 实现三角形的方式. 但是其中漏掉了一个非常重要的场景,如何使用纯 CSS 实现带圆角的三角形呢?,像 ...

  8. python log装饰器

    def log(func): #将原函数对象的指定属性复制给包装函数对象, 默认有 module.name.doc,或者通过参数选择 @functools.wraps(func) def wrappe ...

  9. ADC采集电流相关知识

    1.AD电流采样电路,是把电路中的电流用采样元件转换为电压信号,然后用ADC量化转换为相应的数字信号.需要你在被采集端串联一个采样电阻,然后采集采样电阻两端的电压,这样就可以把电流输出变换为电压输出. ...

  10. 华为交换机5855设置ssh

    配置思路 配置交换机密钥对 #生成RSA密钥对 设置vty登陆用户界面的认证方式为AAA认证 #设置远程认证方式 设置aaa用户信息 #本地用户名和密码 #本地用户服务类型 #本地用户授权等级 设置s ...