EPPlus 用来操作excel非常方便,不用依赖微软的office包,所以推荐使用。

下面是具体步骤和代码

首先用nuget安装 EPPlus.Core 我装的版本是 1.5.4

然后就可以用 ExcelPackage 操作一个sheet了

这里我们直接返回给前端的是一个文件流,所以生成的是 MemoryStream

通用类代码

  1. using OfficeOpenXml;
  2. using System.Collections.Generic;
  3. using System.IO;
  4.  
  5. namespace Common
  6. {
  7. public class ExcelHelper
  8. {
  9. /// <summary>
  10. /// 导出列表到excel文件
  11. /// </summary>
  12. /// <typeparam name="T"></typeparam>
  13. /// <param name="data">需要导出的列表数据</param>
  14. /// <param name="headers">需要自定义的字段和表头值</param>
  15. /// <returns></returns>
  16. public static MemoryStream ExportListToExcel<T>(List<T> data, Dictionary<string, string> headers = null)
  17. {
  18. using (var package = new ExcelPackage())
  19. {
  20. var worksheet = package.Workbook.Worksheets.Add("sheet1");
  21. worksheet.Cells.LoadFromCollection(data, true);
  22.  
  23. if (headers != null)
  24. {
  25. for (int i = ; i < worksheet.Dimension.End.Column; i++)
  26. {
  27. var name = worksheet.Cells[, i + ]?.Value?.ToString();
  28. if (string.IsNullOrEmpty(name) == false && headers.ContainsKey(name))
  29. {
  30. worksheet.Cells[, i + ].Value = headers[name];
  31. }
  32. }
  33. }
  34.  
  35. return new MemoryStream(package.GetAsByteArray());
  36. }
  37. }
  38. }
  39. }

因为自定义对象data里的字段都是英文的,生成的表头也是英文,所以这里我是传了一个自定义的 header 字典,来配置表头中英文的对应关系。

在api里的调用代码

  1. /// <summary>
  2. /// 交易记录,导出
  3. /// </summary>
  4. /// <param name="req">查询条件</param>
  5. /// <param name="token">登录令牌</param>
  6. /// <returns></returns>
  7. [HttpGet("export")]
  8. public IActionResult CrmTradeRecordListExport([FromQuery] CrmTradeRecordListReq req, [FromHeader] [Required] string token)
  9. {
  10. req.LoginUserInfo = _loginUser;
  11. req.PageIndex = "";
  12. req.PageSize = int.MaxValue.ToString();
  13.  
  14. var resp = _DoInvoke(req, _assetsService.CrmTradeRecordList);
  15. if (resp.Status == )
  16. {
  17. var data = new List<CrmTradeRecordExportData>();
  18.  
  19. foreach (var item in resp.Data.List)
  20. {
  21. data.Add(new CrmTradeRecordExportData
  22. {
  23. TradeTime = item.TradeTime,
  24. MerchName = item.MerchName,
  25. MerchTypeName = item.MerchTypeName,
  26. TradeAccount = item.TradeAccount,
  27. Price = item.Price,
  28. TradeTypeName = item.TradeTypeName,
  29. StatusName = item.StatusName,
  30. });
  31. }
  32.  
  33. var headers = new Dictionary<string, string>
  34. {
  35. { "TradeTime", "交易时间" }
  36. ,{ "MerchName", "商品名称" }
  37. ,{ "MerchTypeName", "商品类型"}
  38. ,{ "TradeAccount","交易账户"}
  39. ,{"Price","金额(元)" }
  40. ,{"TradeTypeName","" }
  41. ,{"StatusName","状态"}
  42. };
  43.  
  44. var filename = $@"{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
  45. var stream = ExcelHelper.ExportListToExcel(data, headers);
  46.  
  47. Response.Headers[HeaderNames.ContentDisposition] = new ContentDispositionHeaderValue("attachment") { FileName = filename }.ToString();
  48. return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  49. }
  50.  
  51. throw new GeduException(resp.Message, code: resp.Code);
  52. }

重点代码黄色标注,其他的都是我自己的业务逻辑,可以不用参考。

注意返回的时候可以加一个header来告诉客户端文件的名字,方便客户端处理。

搞定

【netcore基础】.NET Core使用EPPlus实现MVC API里的Excel导出功能 配置中文表头的更多相关文章

  1. 【netcore基础】.Net core自动作业之Hangfire

    nuget搜索:Hangfire 安装即可,这里我选择的是 1.7.0-beta1 版本 我是用这个集成到了 mvc api里 这里需要在 Startup 文件里进行如下配置 在配置方法 Config ...

  2. 【netcore基础】ubuntu 16.04 搭建.net core 2.1 linux 运行环境 nginx反向代理 supervisor配置自启动

    今天来整理下 netcore 在 linux(ubuntu) 上的运行环境搭建 对应版本 ubuntu 16.04 .net core 2.1 nginx version: nginx/1.10.3 ...

  3. 【.NetCore学习】ubuntu16.04 搭建.net core mvc api 运行环境

    查看linux内核版本 uname -a 打印结果 python@ubuntu:~$ uname -a Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed ...

  4. 【netcore基础】CentOS 7.6.1810 搭建.net core 2.1 linux 运行环境 nginx反向代理 supervisor配置自启动

    之前写过一篇Ubuntu的环境搭建博客,感觉一些配置大同小异,这里重点记录下 nginx 作为静态 angular 项目文件服务器的配置 参考链接 [netcore基础]ubuntu 16.04 搭建 ...

  5. Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。

    Python3 与 C# 面向对象之-继承与多态   文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...

  6. .netCore+Vue 搭建的简捷开发框架 (4)--NetCore 基础 -2

    上节中,我们初步的介绍了一下NetCore的一些基础知识,为了控制篇幅(其实也是因为偷懒),我将NetCore 基础分为两部分来写. 0.WebAPI 项目的建立 1..NetCore 项目执行(加载 ...

  7. ASP.NET Core Razor页面 vs MVC

    作为.NET Core 2.0发行版的一部分,还有一些ASP.NET的更新.其中之一是添加了一个新的Web框架来创建"页面",而不需要复杂的ASP.NET MVC.新的Razor页 ...

  8. ASP.NET Core中使用自定义MVC过滤器属性的依赖注入

    除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作. ASP.NET Core中常用的 ...

  9. ASP.NET Core使用EPPlus操作Excel

    1.前言 本篇文章通过ASP.NET Core的EPPlus包去操作Excel(导入导出),其使用原理与NPOI类似,导出Excel的时候不需要电脑上安装office,非常好用 2.使用 新建一个AS ...

随机推荐

  1. IAAS、SAAS 和 PAAS 的区别、理解

    通俗的讲: 如果你是一个网站站长,想要建立一个网站.不采用云服务,你所需要的投入大概是:买服务器,安装服务器软件,编写网站程序.现在你追随潮流,采用流行的云计算,如果你采用IaaS服务,那么意味着你就 ...

  2. AngularJS中写一个包裹HTML元素的directive

    有这样的一个场景,这里有一个表单: <form role="form">    ...</form> 我们希望在form的外层动态包裹上一层. 有可能是这样 ...

  3. 使用Python学习selenium测试工具-4:查找元素

    转自:https://blog.csdn.net/wd168/article/details/51819930 web通常包含了Hyper Text Markup Language (HTML).Ca ...

  4. 《学习opencv》笔记——矩阵和图像操作——cvAnd、cvAndS、cvAvg and cvAvgSdv

    矩阵和图像的操作 (1)cvAnd函数 其结构 void cvAnd( //将src1和src2按像素点取"位与运算" const CvArr* src1,//第一个矩阵 cons ...

  5. Spark:实现行转列

    示例JAVA代码: import static org.apache.spark.sql.functions.col; import static org.apache.spark.sql.funct ...

  6. Vim命令相关

    在shell中,记住一些常用的vim命令,会在操作时候事半功倍. 光标移动 h,j,k,l,h #表示往左,j表示往下,k表示往右,l表示往上 Ctrl f #上一页 Ctrl b #下一页 w, e ...

  7. Windows视频桌面壁纸实现(libvlc)(类似于wall paper engine效果)

    简介 这个项目是很久之前的事情了,当时一个朋友正在研究一个国外的软件(wall paper engine ),可以在桌面壁纸层播放视频,也就差不多是动态壁纸的意思. 后来我也动手来实现这个功能,因为手 ...

  8. Eclipse环境安装Python插件PyDev

    转载自:http://blog.csdn.net/typa01_kk/article/details/49251247 clipse环境安装Python插件PyDev 软件准备,下载地址,先看安装,再 ...

  9. SNF快速开发平台3.0之--系统里广播的作用--迅速及时、简明扼要的把信息发送给接收者

    广播信息,即速度快捷.迅速及时.简明扼要的把信息发送给接收者. 当然在SNF快速开发平台上你也可以作为公告使用.不管当做什么使用要满足以下需求: 简单操作:页面操作简单 只需要输入内容就可以发送. 灵 ...

  10. malloc()參数为0的情况

    以下的代码片段输出是什么?为什么? char *ptr; ))==NULL) puts("Got a null pointer"); else puts("Got a v ...