zoukankan      html  css  js  c++  java
  • 【netcore基础】.NET Core使用EPPlus实现MVC API里的Excel导出功能 配置中文表头

    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来告诉客户端文件的名字,方便客户端处理。

    搞定

  • 相关阅读:
    UVA-1595 Symmetry
    UVA-10763 Foreign Exchange
    剑指Offer
    剑指Offer
    剑指Offer
    剑指Offer
    剑指Offer
    剑指Offer
    剑指Offer
    剑指Offer
  • 原文地址:https://www.cnblogs.com/jhli/p/9993070.html
Copyright © 2011-2022 走看看