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

    搞定

  • 相关阅读:
    springmvc
    POJ 3683 Priest John's Busiest Day
    POJ 3678 Katu Puzzle
    HDU 1815 Building roads
    CDOJ UESTC 1220 The Battle of Guandu
    HDU 3715 Go Deeper
    HDU 3622 Bomb Game
    POJ 3207 Ikki's Story IV
    POJ 3648 Wedding
    HDU 1814 Peaceful Commission
  • 原文地址:https://www.cnblogs.com/jhli/p/9993070.html
Copyright © 2011-2022 走看看