public async Task<ActionResult> ExportDataToExcel()
        {
            //查询出的数据
            var list = new List<TestDataViewModel>();

            list.Add(new TestDataViewModel
            {
                PlanSubject = "test1",
                MobileNo = "13577778888",
                TelcoOperatorText = "移动"
            });
            list.Add(new TestDataViewModel
            {
                PlanSubject = "test2",
                MobileNo = "13577779999",
                TelcoOperatorText = "移动"
            });
            list.Add(new TestDataViewModel
            {
                PlanSubject = "test3",
                MobileNo = "8077778888",
                TelcoOperatorText = "电信"
            });
            //var model = await DataTrafficGiftRecordQueryEntry.SelectAsync();

            //已经领取了流量
            //var hasGetList = model.Where(m => !string.IsNullOrWhiteSpace(m.MobileNo) && m.MobileNo.Length == 11);
            //var result = hasGetList.MapList<DataTrafficGiftRecordViewModel>().ToList();

            var setting = new ExcelExportOption<TestDataViewModel>
            {
                FileName = "客户领取流量记录",
                DefaultRowHeight = 270
            };
            if (list.Count() >= 65535)
                setting.Description = "结果数据总数:" + list.Count() + "但Excel最多支持65535条数据, 请分开条件导出";
            setting.Source = list.Take(65534);
            var colums = new List<ExcelColum<TestDataViewModel>>
            {
                new ExcelColum<TestDataViewModel>
                {
                    Name = "赠送计划标题",
                    Width = 7000,
                    ColumType = ExcelColumType.String,
                    ResultFunc = x => x.PlanSubject
                },
                new ExcelColum<TestDataViewModel>
                {
                    Name = "手机号码",
                    Width = 7000,
                    ColumType = ExcelColumType.String,
                    ResultFunc = x => x.MobileNo
                },

                 new ExcelColum<TestDataViewModel>
                {
                    Name = "手机运营商",
                    Width = 7000,
                    ColumType = ExcelColumType.String,
                    ResultFunc = x => x.TelcoOperatorText
                },
            };

            setting.Colums = colums;

            //发送文件路径到客户端
            var steam = ExcelUtility.ExportToStream(setting);
            var filename = HttpUtility.UrlEncode(setting.FileName + DateTime.Now.ToString("_yyyyMMdd-HHmmss") + ".xls", System.Text.Encoding.UTF8);
            return File(steam, "application/vnd.ms-excel", filename);
            //Response.AddHeader("Content-Disposition", $"attachment;filename={filename}");
            //Response.Clear();
            //Response.BinaryWrite(steam.GetBuffer());
            //Response.End();
        }
        /// <summary>
        /// 导出数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="setting"></param>
        /// <returns></returns>
        public static MemoryStream ExportToStream <T>(ExcelExportOption <T> setting)
        {
            var cols        = setting.Colums.Count();
            var hssworkbook = new HSSFWorkbook();
            var sheet1      = hssworkbook.CreateSheet("Sheet1");

            if (setting.DefaultRowHeight > 0)
            {
                sheet1.DefaultRowHeight = setting.DefaultRowHeight;
            }

            var docSummaryInfo = PropertySetFactory.CreateDocumentSummaryInformation();

            docSummaryInfo.Company = string.Empty;
            var summaryInfo = PropertySetFactory.CreateSummaryInformation();

            summaryInfo.Subject = setting.Title;
            hssworkbook.DocumentSummaryInformation = docSummaryInfo;
            hssworkbook.SummaryInformation         = summaryInfo;

            //自动调整某列宽度
            for (var i = 0; i < cols; i++)
            {
                sheet1.AutoSizeColumn(i, true);
            }

            var currentRowIndex = 0;

            //设置标题信息
            if (!String.IsNullOrWhiteSpace(setting.Title))
            {
                var row0 = sheet1.CreateRow(currentRowIndex);
                for (var i = 0; i < cols; i++)
                {
                    row0.CreateCell(i).Row.Height = 600;
                }
                row0.GetCell(0).SetCellValue(setting.Title);

                currentRowIndex++;

                //标题样式
                sheet1.AddMergedRegion(new CellRangeAddress(0, 0, 0, cols - 1));
                var titlestyle = hssworkbook.CreateCellStyle();
                titlestyle.WrapText = true;
                var titleFont = hssworkbook.CreateFont();
                titleFont.FontHeight = 20 * 20;
                titlestyle.SetFont(titleFont);
                titlestyle.Alignment = HorizontalAlignment.Center;
                sheet1.GetRow(0).GetCell(0).CellStyle = titlestyle;
            }

            //设置描述信息
            if (!string.IsNullOrWhiteSpace(setting.Description))
            {
                var row1 = sheet1.CreateRow(currentRowIndex);
                for (var i = 0; i < cols; i++)
                {
                    row1.CreateCell(i).Row.Height = 1000;
                }
                row1.GetCell(0).SetCellValue(setting.Description);

                currentRowIndex++;

                //描述样式
                sheet1.AddMergedRegion(new CellRangeAddress(1, 1, 0, cols - 1));
            }

            //设置列分组
            if (setting.ColumGroups != null && setting.ColumGroups.Any())
            {
                var rowGroup   = sheet1.CreateRow(currentRowIndex);
                var columGroup = setting.ColumGroups;

                for (var i = 0; i < cols; i++)
                {
                    var cell = rowGroup.CreateCell(i, CellType.String);
                    cell.SetCellValue(String.Empty);
                    cell.Row.Height = 500;
                }
                var groupStyle = hssworkbook.CreateCellStyle();
                var groupFont  = hssworkbook.CreateFont();
                groupFont.FontHeight = 15 * 15;
                groupFont.IsBold     = true;
                groupStyle.SetFont(groupFont);
                groupStyle.Alignment = HorizontalAlignment.Center;

                var excelColumGroups = columGroup as ExcelColumGroup[] ?? columGroup.ToArray();
                for (var j = excelColumGroups.Length - 1; j >= 0; j--)
                {
                    var cell = rowGroup.GetCell(excelColumGroups.ElementAt(j).StartIndex);
                    cell.SetCellValue(excelColumGroups.ElementAt(j).Name);
                    cell.CellStyle = groupStyle;
                    sheet1.AddMergedRegion(new CellRangeAddress(2, 2, excelColumGroups.ElementAt(j).StartIndex, excelColumGroups.ElementAt(j).StartIndex + excelColumGroups.ElementAt(j).Cols - 1));
                }

                currentRowIndex++;
            }

            //列头行索引
            var columHeaderRowIndex = currentRowIndex;

            //列头样式
            var headerfont = hssworkbook.CreateFont();

            headerfont.FontHeightInPoints = 12;
            headerfont.IsBold             = true;
            var headerstyle = hssworkbook.CreateCellStyle();

            headerstyle.SetFont(headerfont);

            //设置列头信息
            var row2 = sheet1.CreateRow(columHeaderRowIndex);

            for (var i = 0; i < cols; i++)
            {
                var cell = row2.CreateCell(i);
                cell.Row.Height = 500;
                cell.SetCellValue(setting.Colums.ElementAt(i).Name);
                cell.CellStyle = headerstyle;
            }

            var dataStyle = hssworkbook.CreateCellStyle();

            //水平对齐
            dataStyle.Alignment = HorizontalAlignment.Left;
            //垂直对齐
            dataStyle.VerticalAlignment = VerticalAlignment.Top;
            //自动换行
            dataStyle.WrapText = true;
            //输出数据
            for (var i = 0; i < setting.Source.Count(); i++)
            {
                var model   = setting.Source.ElementAt(i);
                var rowTemp = sheet1.CreateRow(i + columHeaderRowIndex + 1);

                //Type modelType = model.GetType();
                //PropertyInfo[] properties = modelType.GetProperties();
                //var proDic = new Dictionary<string, PropertyInfo>();
                //foreach (var item in properties)
                //{
                //    proDic.Add(item.Name, item);
                //}
                for (var j = 0; j < setting.Colums.Count(); j++)
                {
                    rowTemp.CreateCell(j).SetCellValueT(
                        setting.Colums.ElementAt(j).ColumType,
                        dataStyle,
                        setting.Colums.ElementAt(j).ResultFunc == null ? setting.Colums.ElementAt(j).ResultByFieldName(model, setting.Colums.ElementAt(j).FieldName) : (setting.Colums.ElementAt(j).ResultFunc(model)));
                }
            }

            HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(hssworkbook);
            //对设定并可行的列求和
            var containSum = setting.Colums.Any(item => item.DoColumSum);

            if (containSum)
            {
                var style = hssworkbook.CreateCellStyle();
                var font  = hssworkbook.CreateFont();
                font.FontHeight = 15 * 15;
                font.IsBold     = true;
                font.Color      = HSSFColor.Blue.Index;


                style.SetFont(font);


                //求和 SUM(A2:A12)
                var letter   = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                var totalRow = sheet1.CreateRow(columHeaderRowIndex + 1 + setting.Source.Count());
                for (var x = 0; x < setting.Colums.Count(); x++)
                {
                    var rowName = x == 0 ? "A" : (x > 26 ? letter.ElementAt(x / 26).ToString() + letter.ElementAt(x % 26).ToString() : letter.ElementAt(x % 26).ToString());
                    if (setting.Colums.ElementAt(x).DoColumSum)
                    {
                        var tempCell = totalRow.CreateCell(x);
                        tempCell.CellFormula = "SUM(" + rowName + (columHeaderRowIndex + 2) + ":" + rowName + (columHeaderRowIndex + 1 + setting.Source.Count()) + ")";
                        tempCell.CellStyle   = style;
                        e.EvaluateInCell(tempCell);
                    }
                    else
                    {
                        var temp = totalRow.CreateCell(x);
                        temp.CellStyle = style;
                        if (x == 0)
                        {
                            temp.SetCellValue("合计");
                        }
                    }
                }
            }

            //表格样式
            for (var i = 0; i < cols; i++)
            {
                if (setting.Colums.ElementAt(i).Width > 0)
                {
                    sheet1.SetColumnWidth(i, setting.Colums.ElementAt(i).Width);
                }
            }

            var stream = new MemoryStream();

            hssworkbook.Write(stream);
            return(stream);
        }
        public async Task ExportDataToExcel2()

        {
            //查询出的数据
            // 1.获取数据集合
            var list = new List<UserViewModel>() {
                    new UserViewModel{Name="刘一",Age=22,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=80,MathScores=90}},
                    new UserViewModel{Name="陈二",Age=23,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=81,MathScores=91} },
                    new UserViewModel{Name="张三",Age=24,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=82,MathScores=92} },
                    new UserViewModel{Name="李四",Age=25,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=83,MathScores=93} },
                    new UserViewModel{Name="王五",Age=26,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=84,MathScores=94} },
                };

            var setting = new ExcelExportOption<UserViewModel>
            {
                FileName = "客户领取流量记录",
                DefaultRowHeight = 270
            };
            if (list.Count() >= 65535)
                setting.Description = "结果数据总数:" + list.Count() + "但Excel最多支持65535条数据, 请分开条件导出";
            setting.Source = list.Take(65534);


            // 2.设置单元格抬头
            // key:实体对象属性名称,可通过反射获取值
            // value:Excel列的名称
            Dictionary<string, string> cellheader = new Dictionary<string, string> {
                    { "Name", "姓名" },
                    { "Age", "年龄" },
                    { "GenderName", "性别" },
                    { "TranscriptsEn", "成绩" },
                    { "TranscriptsEn.ChineseScores", "语文成绩" },
                    { "TranscriptsEn.MathScores", "数学成绩" },
                };

            //发送文件路径到客户端
            var urlPath = ExcelUtility.ExportExcel(cellheader, list, "学生成绩");
            System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
            HttpContext.Response.ContentType = "text/plain";
            HttpContext.Response.Write(js.Serialize(urlPath)); // 返回Json格式的内容
            //var column = new List<ExcelColum<UserViewModel>>
            //{
            //    new ExcelColum<UserViewModel>
            //    {
            //        Name = "姓名",
            //        Width = 7000,
            //        ColumType = ExcelColumType.String,
            //        ResultFunc = x => x.Name
            //    },
            //    new ExcelColum<UserViewModel>
            //    {
            //        Name = "年龄",
            //        Width = 7000,
            //        ColumType = ExcelColumType.String,
            //        ResultFunc = x => x.Age
            //    },
            //    new ExcelColum<UserViewModel>
            //    {
            //        Name = "性别",
            //        Width = 7000,
            //        ColumType = ExcelColumType.String,
            //        ResultFunc = x => x.GenderName
            //    },
            //    new ExcelColum<UserViewModel>
            //    {
            //        Name = "语文成绩",
            //        Width = 7000,
            //        ColumType = ExcelColumType.String,
            //        ResultFunc = x => x.TranscriptsEn.ChineseScores
            //    },
            //     new ExcelColum<UserViewModel>
            //    {
            //        Name = "数学成绩",
            //        Width = 7000,
            //        ColumType = ExcelColumType.String,
            //        ResultFunc = x => x.TranscriptsEn.MathScores
            //    },
            //};
            //var option = new ExcelExportOption<UserViewModel>
            //{
            //    Title = "学生成绩",
            //    Source = list,
            //    Colums = column
            //};
            //var filename = $"民办初中-{DateTime.Now:yyyyMMddHHmmssfff}.xls";
            //var file = ExcelUtility.ExportToStream<UserViewModel>(option);
            //return File(file, "application/vnd.ms-excel", filename);
        }