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 { /// <summary> /// 導出列表到excel文件 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="data">需要導出的列表數據</param> /// <param name="headers">需要自定義的字段和表頭值</param> /// <returns></returns> public static MemoryStream ExportListToExcel<T>(List<T> data, Dictionary<string, string> 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里的調用代碼
/// <summary> /// 交易記錄,導出 /// </summary> /// <param name="req">查詢條件</param> /// <param name="token">登錄令牌</param> /// <returns></returns> [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<CrmTradeRecordExportData>(); 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<string, string> { { "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來告訴客戶端文件的名字,方便客戶端處理。
搞定
