1.获取到需要导出的数据   因为这个对象是PagedResulDto类型的   所以封装成Table的时候  传pageList.Items就可以了

            PagedResultDto<SearchSatisfactionUnfeedbackTaskLineOutput> pageList = await feedbackService.SearchSatisfactionUnfeedbackTaskLine(input);
            DataTable dt = SatisfactionDataTable(pageList.Items);
            return ExportExcel(dt);

2.把数据放到Table中

        private DataTable SatisfactionDataTable(IReadOnlyList<SearchSatisfactionUnfeedbackTaskLineOutput> list)
        {
            DataTable dt = new DataTable("满意度问卷调查");
            //添加列
            dt.Columns.Add(new DataColumn() { ColumnName = nameof(SearchSatisfactionUnfeedbackTaskLineOutput.FeedbackTime), Caption = "回访日期", DataType = typeof(string) });
            dt.Columns.Add(new DataColumn() { ColumnName = nameof(SearchSatisfactionUnfeedbackTaskLineOutput.CustomerName), Caption = "客户姓名", DataType = typeof(string) });
            dt.Columns.Add(new DataColumn() { ColumnName = nameof(SearchSatisfactionUnfeedbackTaskLineOutput.Telephone), Caption = "联系电话", DataType = typeof(string) });
            dt.Columns.Add(new DataColumn() { ColumnName = nameof(SearchSatisfactionUnfeedbackTaskLineOutput.AccountModelProvinceName), Caption = "省", DataType = typeof(string) });
            dt.Columns.Add(new DataColumn() { ColumnName = nameof(SearchSatisfactionUnfeedbackTaskLineOutput.AccountModelCityName), Caption = "市", DataType = typeof(string) });
            dt.Columns.Add(new DataColumn() { ColumnName = nameof(SearchSatisfactionUnfeedbackTaskLineOutput.QualityScore), Caption = "产品实物质量(50%)", DataType = typeof(string) });
            dt.Columns.Add(new DataColumn() { ColumnName = nameof(SearchSatisfactionUnfeedbackTaskLineOutput.TimelinessScore), Caption = "交付及时性(20%)", DataType = typeof(string) });
            dt.Columns.Add(new DataColumn() { ColumnName = nameof(SearchSatisfactionUnfeedbackTaskLineOutput.ServiceScore), Caption = "服务质量(15%)", DataType = typeof(string) });
            dt.Columns.Add(new DataColumn() { ColumnName = nameof(SearchSatisfactionUnfeedbackTaskLineOutput.AppearanceScore), Caption = "产品外观(15%)", DataType = typeof(string) });
            dt.Columns.Add(new DataColumn() { ColumnName = nameof(SearchSatisfactionUnfeedbackTaskLineOutput.QuestionnaireContent), Caption = "综合评价及建议", DataType = typeof(string) });
            dt.Columns.Add(new DataColumn() { ColumnName = nameof(SearchSatisfactionUnfeedbackTaskLineOutput.remarks), Caption = "备注", DataType = typeof(string) });
            dt.Columns.Add(new DataColumn() { ColumnName = nameof(SearchSatisfactionUnfeedbackTaskLineOutput.FeedbackData), Caption = "得分", DataType = typeof(string) });
            foreach (var model in list)
            {
                //添加行
                DataRow row = dt.NewRow();
                row[nameof(SearchSatisfactionUnfeedbackTaskLineOutput.FeedbackTime)] = model.FeedbackTime.Value.ToLongDateString();
                row[nameof(SearchSatisfactionUnfeedbackTaskLineOutput.CustomerName)] = model.CustomerName;
                row[nameof(SearchSatisfactionUnfeedbackTaskLineOutput.Telephone)] = Publics.MaskTelephone(model.Telephone);
                row[nameof(SearchSatisfactionUnfeedbackTaskLineOutput.AccountModelProvinceName)] = model.AccountModelProvinceName;
                row[nameof(SearchSatisfactionUnfeedbackTaskLineOutput.AccountModelCityName)] = model.AccountModelCityName;
                row[nameof(SearchSatisfactionUnfeedbackTaskLineOutput.QualityScore)] = model.QualityScore;
                row[nameof(SearchSatisfactionUnfeedbackTaskLineOutput.TimelinessScore)] = model.TimelinessScore;
                row[nameof(SearchSatisfactionUnfeedbackTaskLineOutput.ServiceScore)] = model.ServiceScore;
                row[nameof(SearchSatisfactionUnfeedbackTaskLineOutput.AppearanceScore)] = model.AppearanceScore;
                row[nameof(SearchSatisfactionUnfeedbackTaskLineOutput.QuestionnaireContent)] = model.QuestionnaireContent;
                row[nameof(SearchSatisfactionUnfeedbackTaskLineOutput.remarks)] = model.remarks;
                row[nameof(SearchSatisfactionUnfeedbackTaskLineOutput.FeedbackData)] = model.FeedbackData;
                dt.Rows.Add(row);
            }
            return dt;

        }

3.把table中的数据放到xlsx工作表中  创建XSSFWorkbook对象和ISheet对象 需要引用NPOI包 可以在官网下载

        private FileResult ExportExcel(DataTable dt)
        {
            //操作xlsx表的对象
            XSSFWorkbook book = new XSSFWorkbook();
            //创建一个工作表
            ISheet sheet = book.CreateSheet(dt.TableName);
            ;
            //给xlsx工作表创建第0行
            IRow headerRow = sheet.CreateRow(rowIndex);
            rowIndex++;
            //设置样式
            ICellStyle style = book.CreateCellStyle();
            style.VerticalAlignment = VerticalAlignment.Center;
            //循环table中的列名  放到xlsx中当列名
            ; i < dt.Columns.Count; i++)
            {
                //获取当前列 创建第i个单元格 把列名放到单元格中
                DataColumn column = dt.Columns[i];
                ICell cell = headerRow.CreateCell(i);
                cell.SetCellValue(column.Caption);
            }
            //循环table中的数据
            foreach (DataRow dataRow in dt.Rows)
            {
                //在xlsx工作表中创建第rowIndex行
                IRow row = sheet.CreateRow(rowIndex);
                ; i < dt.Columns.Count; i++)
                {
                    //每次都创建一个cell单元格 来接收当前列的数据值
                    DataColumn column = dt.Columns[i];
                    ICell cell = row.CreateCell(i);
                    if (column.DataType == typeof(string))
                    {
                        if (dataRow[column] != null)
                        {
                            cell.SetCellValue(dataRow[column].ToString());
                        }
                    }
                    else if (column.DataType == typeof(int))
                    {
                        if (dataRow[column] != null)
                        {
                            cell.SetCellValue(double.Parse(dataRow[column].ToString()));
                        }
                    }
                    else if (column.DataType == typeof(DateTime))
                    {
                        if (dataRow[column] != null)
                        {
                            //cell.SetCellValue(DateTime.Parse(dataRow[column].ToString()));
                            cell.SetCellValue(dataRow[column].ToString());
                        }
                    }
                }
                rowIndex++;
            }
            ; i < dt.Columns.Count; i++)
            {
                //设置第i列宽度自适应
                sheet.AutoSizeColumn(i);
            }

            var ms = new NPOIMemoryStream();
            book.Write(ms);
            ms.Flush();
            ms.Position = ;
            return File(ms, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", dt.TableName + ".xlsx");
        }

4.导出需要用到的一个对象

    public class NPOIMemoryStream : MemoryStream
    {
        /// <summary>
        /// 获取流是否关闭
        /// </summary>
        public bool IsColse
        {
            get;
            private set;
        }

        public NPOIMemoryStream(bool colse = false)
        {
            IsColse = colse;
        }

        public override void Close()
        {
            if (IsColse)
            {
                base.Close();
            }
        }
    }

5.返回是调用File()  第一个参数 当前流  第二个参数 book(当前xlsx工作表的地址  可以调试看到)  第三个参数要下载的xlsx的名字

关于ISheet接口中的属性方法介绍

https://github.com/dotnetcore/NPOI/blob/master/src/NPOI/SS/UserModel/Sheet.cs

关于Stream、FileStream、MemoryStream的区别

***********************************

最新文章

  1. js正则获取url所带参数值
  2. 2016 Multi-University Training Contest 1 J.Subway
  3. Linux_用户级_常用命令(5):rm
  4. CNN中的BN
  5. Add Binary &lt;leetcode&gt;
  6. 机器学习技法--学习笔记04--Soft SVM
  7. 50+ 响应式的Prestashop电商主题
  8. 动态规划(树形DP):HDU 5834 Magic boy Bi Luo with his excited tree
  9. UIWebvView 解决onClick 延迟相应问题
  10. [2013-01-15]The Little Schemer 学习笔记
  11. [bzoj1187][HNOI2007]神奇游乐园
  12. Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name:
  13. SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解
  14. Spring Cloud (4)zool 路由网关
  15. session(会话)研究(一)基础
  16. Java_正确理解ThreadLocal
  17. sqlserver 修改表字段长度
  18. Mybatis框架中Mapper文件传值参数获取。【Mybatis】
  19. 【转载】使用Exp和Expdp导出数据的性能对比与优化
  20. C#使用自定义字体

热门文章

  1. javaweb笔记09—(session会话及验证码问题)
  2. Android平台MediaCodec避坑指北
  3. LogUtil工具
  4. 电影编码JPEG2000与H.264
  5. html5-Input类型
  6. opencv学习之路(15)、形态学其他操作(开、闭、顶帽、黑帽、形态学梯度)
  7. js的原型prototype究竟是什么?
  8. MSYS2 更换国内源
  9. Spyder 调出绘图界面
  10. Asp.Net 之 js/jquery获取服务器端控件