前言

总是有很多朋友咨询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快速导出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. 关于Excel中表格转Markdown格式的技巧

    背景介绍 Excel文件转Markdown格式的Table是经常会遇到的场景. Visual Studio Code插件 - Excel to Markdown table Excel to Mark ...

  2. 阿里P7大佬带你解密Sentinel

    概述 在接连写了两篇关于限流的文章(<面试补习>- 你来说说什么是限流?, 限流神器Sentinel,不了解一下吗?)后,总感觉还差最后一点内容来闭环整个限流相关的内容,这两天在翻查相关文 ...

  3. Redis启动正常,一段时间后报错,连不上redis

    Redis报错 1.redis在最终目标上移动临时数据库文件时出错 错误:redis:Error moving temp DB file temp-13792.rdb on the final des ...

  4. 整理!企业选择好用的CRM系统的要点(上)

    随着市场经济的发展,对任何行业的企业来说,客户都是非常重要的一个部分.CRM系统帮助企业做到以客户为中心,它可以根据客户的具体要求进行跟进和反馈,在很大程度上提高公司的客户服务水平和客户满意度,进而提 ...

  5. 最新的.NET 热重载介绍

    今天,我们很高兴的向您介绍 Visual Studio 2019 版本 16.11(预览版 1)和 .NET 6 中的 dotnet watch 命令行工具(预览版 4)中的 .NET 热重载体验的可 ...

  6. Mysql:报错message from server: "Too many connections"(连接太多)

    报错信息 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source re ...

  7. ThreadLocal底层原理学习

    1. 是什么? 首先ThreadLocal类是一个线程数据绑定类, 有点类似于HashMap<Thread, 你的数据> (但实际上并非如此), 它所有线程共享, 但读取其中数据时又只能是 ...

  8. 苦B程序员的数据验证之路

    发生了什么事 在一次苦B程序员和苦C程序员的结对编程中发生的一段对话 代码是这样的: public void deleteAllExtendAclsFromContent(String content ...

  9. 从三道题目入门frida

    偶然从看雪看到了一篇入门frida的题目,正好苦于没练手的东西,直接上手一波 1.第一题jadx打开,也没有壳和混淆,整体非常清晰,判断的逻辑也很简单 发现其实就是两个输入框,一个用户名一个密码,先拼 ...

  10. ARTS第十一周

    受辞职考研和新冠肺炎疫情影响,一直没更.遗憾,数学和专业课再高点就有戏了.继续. 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3. ...