EPPlus 用来操作excel非常方便,不用依赖微软的office包,所以推荐使用。
下面是具体步骤和代码
首先用nuget安装 EPPlus.Core 我装的版本是 1.5.4
然后就可以用 ExcelPackage 操作一个sheet了
这里我们直接返回给前端的是一个文件流,所以生成的是 MemoryStream
通用类代码
using OfficeOpenXml;using System.Collections.Generic;using System.IO;namespace Common{ public class ExcelHelper { ////// 导出列表到excel文件 /// ////// 需要导出的列表数据 /// 需要自定义的字段和表头值 /// public static MemoryStream ExportListToExcel (List data, Dictionary headers = null) { using (var package = new ExcelPackage()) { var worksheet = package.Workbook.Worksheets.Add("sheet1"); worksheet.Cells.LoadFromCollection(data, true); if (headers != null) { for (int i = 0; i < worksheet.Dimension.End.Column; i++) { var name = worksheet.Cells[1, i + 1]?.Value?.ToString(); if (string.IsNullOrEmpty(name) == false && headers.ContainsKey(name)) { worksheet.Cells[1, i + 1].Value = headers[name]; } } } return new MemoryStream(package.GetAsByteArray()); } } }}
因为自定义对象data里的字段都是英文的,生成的表头也是英文,所以这里我是传了一个自定义的 header 字典,来配置表头中英文的对应关系。
在api里的调用代码
////// 交易记录,导出 /// /// 查询条件 /// 登录令牌 ///[HttpGet("export")] public IActionResult CrmTradeRecordListExport([FromQuery] CrmTradeRecordListReq req, [FromHeader] [Required] string token) { req.LoginUserInfo = _loginUser; req.PageIndex = "1"; req.PageSize = int.MaxValue.ToString(); var resp = _DoInvoke(req, _assetsService.CrmTradeRecordList); if (resp.Status == 1) { var data = new List (); foreach (var item in resp.Data.List) { data.Add(new CrmTradeRecordExportData { TradeTime = item.TradeTime, MerchName = item.MerchName, MerchTypeName = item.MerchTypeName, TradeAccount = item.TradeAccount, Price = item.Price, TradeTypeName = item.TradeTypeName, StatusName = item.StatusName, }); } var headers = new Dictionary { { "TradeTime", "交易时间" } ,{ "MerchName", "商品名称" } ,{ "MerchTypeName", "商品类型"} ,{ "TradeAccount","交易账户"} ,{ "Price","金额(元)" } ,{ "TradeTypeName","" } ,{ "StatusName","状态"} }; var filename = $@"{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx"; var stream = ExcelHelper.ExportListToExcel(data, headers); Response.Headers[HeaderNames.ContentDisposition] = new ContentDispositionHeaderValue("attachment") { FileName = filename }.ToString(); return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); } throw new GeduException(resp.Message, code: resp.Code); }
重点代码黄色标注,其他的都是我自己的业务逻辑,可以不用参考。
注意返回的时候可以加一个header来告诉客户端文件的名字,方便客户端处理。
搞定