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

时间:2022-05-23 21:52:41

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

下面是具体步骤和代码

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

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

然后就可以用 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 = ; i < worksheet.Dimension.End.Column; i++)
{
var name = worksheet.Cells[, i + ]?.Value?.ToString();
if (string.IsNullOrEmpty(name) == false && headers.ContainsKey(name))
{
worksheet.Cells[, i + ].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 = "";
req.PageSize = int.MaxValue.ToString(); var resp = _DoInvoke(req, _assetsService.CrmTradeRecordList);
if (resp.Status == )
{
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来告诉客户端文件的名字,方便客户端处理。

搞定