最近在做 MVC 项目的时候遇到项目的导出,下面总结下两种导出到excel 的方法

第一种方法: 将文件写到本地,然后返回这个File 或者返回这个 File 的绝对地址

   其中  _hostingEnvironment  可以在全局读取的配置文件的工具类 Globals 中配置

  直接上代码:

private IHostingEnvironment _hostingEnvironment;public XlsxController(IHostingEnvironment hostingEnvironment){_hostingEnvironment = hostingEnvironment;}public IActionResult ExportData(int programmeId){//获取方案名称var programmeName = ProgrammeService.GetProgrammeNameById(programmeId);//获取列表内容var dataFromDb = ProgrammeService.GetProgrammeStatisticEnrolmentExportList(programmeId);var data = dataFromDb.Select(a => new ProgrammeStatisticsEnrolmentDetailsExportViewModel{UserName = a.UserName,Phone = a.Phone,EnrolTime = a.EnrolTimeStr}).ToList();var sWebRootFolder = _hostingEnvironment.WebRootPath;var sFileName = $"XXX-{programmeName}.xlsx";var file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));using (var package = new ExcelPackage(file)){//如果之前有同名的文件先删除然后重新创建 var count = package.Workbook.Worksheets.Count; if (count > 0){for (var i = 0; i < count; i++){package.Workbook.Worksheets.Delete(i + 1);}package.File.Delete();}// 添加worksheet ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1");//添加头 worksheet.Cells[1, 1].Value = "姓名";worksheet.Cells[1, 2].Value = "手机号";worksheet.Cells[1, 3].Value = "报名时间";//添加值 for (var i = 0; i < data.Count; i++){worksheet.Cells[$"A{i + 2}"].Value = data[i].UserName;worksheet.Cells[$"B{i + 2}"].Value = data[i].Phone;worksheet.Cells[$"C{i + 2}"].Value = data[i].EnrolTime;}package.Save();}var returnFile = File(sFileName, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");returnFile.FileDownloadName = sFileName;return returnFile;}

第二种方法: 用写流文件的方法 将文件写入浏览器

  这里首先我们需要一个导出的工具类 如下:

    /// <summary>/// 公共工具类/// </summary>public class CommonHelper{//获取列名委托方法public delegate string GetColumnName(string columnName);#region 导入导出Excel相关/// <summary>/// 将泛类型集合List类转换成DataTable/// </summary>/// <param name="list">泛类型集合</param>/// <returns>返回转换后的DataTable</returns>public static DataTable ListToDataTable<T>(List<T> entitys){//生成DataTable的structurevar dt = new DataTable();try{//检查泛型实体是否为空if (entitys == null || entitys.Count < 1){return dt;}//取出第一个实体的所有Propertievar entityType = entitys[0].GetType();var entityProperties = entityType.GetProperties();for (var i = 0; i < entityProperties.Length; i++){dt.Columns.Add(entityProperties[i].Name);}//将所有entity添加到DataTable中foreach (object entity in entitys){//检查所有的的实体都为同一类型if (entity.GetType() != entityType){throw new Exception("要转换的集合元素类型不一致");}var entityValues = new object[entityProperties.Length];for (var i = 0; i < entityProperties.Length; i++){entityValues[i] = entityProperties[i].GetValue(entity, null);}dt.Rows.Add(entityValues);}}catch (Exception e){Console.WriteLine(e);}return dt;}/// <summary>/// 将dataTable转换为Excel字节流/// </summary>/// <param name="dt"></param>/// <param name="getColumnName"></param>/// <returns></returns>public static byte[] GetExcelForXLSX(DataTable dt, GetColumnName getColumnName){var xssfworkbook = new XSSFWorkbook();var sheet = xssfworkbook.CreateSheet("Sheet");//表头var row = sheet.CreateRow(0);for (var i = 0; i < dt.Columns.Count; i++){var cell = row.CreateCell(i);//列名称,数据库中字段var columnName = dt.Columns[i].ColumnName;var convertColumnName = getColumnName(columnName);cell.SetCellValue(convertColumnName);}//数据for (var i = 0; i < dt.Rows.Count; i++){var row1 = sheet.CreateRow(i + 1);for (var j = 0; j < dt.Columns.Count; j++){var cell = row1.CreateCell(j);cell.SetCellValue(dt.Rows[i][j].ToString());}}//转为字节数组var stream = new MemoryStream();xssfworkbook.Write(stream);var buf = stream.ToArray();return buf;}#endregion}

  

  然后我们就可以导出了

     /// <summary>/// 表格列名称/// </summary>      private static string GetColumnNameForDetail(string columnName){switch (columnName){case "UserName":return CommonConst.Column_Programme_Detail_UserName;case "Phone":return CommonConst.Column_Programme_Detail_Phone;case "EnrolTime":return CommonConst.Column_Programme_Detail_EnrolTime;default:return String.Empty;}}/// <summary>/// 导出excel/// </summary>
        [HttpGet]public void ExportData(int programmeId){//获取方案名称var programmeName = ProgrammeService.GetProgrammeNameById(programmeId);//获取列表内容var dataFromDb = ProgrammeService.GetProgrammeStatisticEnrolmentExportList(programmeId);var data = dataFromDb.Select(a => new ProgrammeStatisticsEnrolmentDetailsExportViewModel{UserName = a.UserName,Phone = a.Phone,EnrolTime = a.EnrolTimeStr}).ToList();var sFileName = string.Format(CommonConst.Export_Programme_Detail_Excel_Name, programmeName);var dataTable = CommonHelper.ListToDataTable(data);var result = CommonHelper.GetExcelForXLSX(dataTable, GetColumnNameForDetail);Response.ContentType = ResponseConfigure.ContentTypeExcel;SetResponseHeaderForDetail(sFileName);Response.Body.Write(result);Response.Body.Flush();Response.Body.Close();}/// <summary>/// 设定导出的标头内容/// </summary>/// <param name="fileName">导出的文件名</param>private void SetResponseHeaderForDetail(string fileName){Response.Headers.Add(ResponseConfigure.ContentDisposition,ResponseConfigure.Attachment + HttpUtility.UrlEncode(fileName));}

 

转载于:https://www.cnblogs.com/teng-0802/p/9271919.html

.NET CORE 2.1 导出excel文件的两种方法相关推荐

  1. php原生导出excel文件的两种方法

    第一种方法: $filename='文件名称';$filetitle='你的标题';if($_POST){set_time_limit(10000):$title = '';ini_set('memo ...

  2. SAS导出EXCEL文件的几种方法

    SAS学习 SAS导出EXCEL文件的几种方法 以下基于SAS 9.3简体中文版 一.proc export proc export data=a.dataname outfile='D:\excel ...

  3. Ruby读取Excel文件的两种方法

    用Ruby读取Excel文件的两种重要方式 1. 通常做法,查阅微软提供的API了,需要包含win32, 在ruby前加入,require 'win32ole' 例如: require 'win32o ...

  4. web导出excel文件的几种方法

    KimmKing kimmking@163.com 2009年9月4日10:19:09 总的来说,两种方法:服务器端生成和浏览器端生成. 服务器端生成就是:根据用户请求,获取相应的数据,使用poi/j ...

  5. oraclek导出表_Oracle导出DMP文件的两种方法

    导出: 方法一:利用PL/SQL Developer工具导出: 菜单栏---->Tools---->Export Tables,如下图,设置相关参数即可: 方法二:利用cmd的操作命令导入 ...

  6. Oracle导出DMP文件的两种方法

    导出: 方法一: 利用PL/SQL Developer工具导出: 菜单栏----> Tools---->Export Tables,如下图,设置相关参数即可: 方法二: 利用cmd的操作命 ...

  7. C#读写txt文件的两种方法介绍[转]

    C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...

  8. 文字转语音文件的两种方法

    文件转语音文件的两种方法.小伙伴们在日常的工作.学习或是生活当中,是否遇到过以下这种情况.在工作中每天要阅读大量文件资料,在学习中每天要阅读各种课文,在生活中也会观看各种小说.但是长时间的用眼阅读,就 ...

  9. 导入mdf文件的两种方法

    导入mdf文件的两种方法: 1: 在企业管理器里面的菜单 操作->所有任务->附加数据库里面,根据需求填写就搞定了. 2:在查询分析器里执行如下语句 exec sp_attach_db ' ...

最新文章

  1. 粗浅看 java反射机制
  2. TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'的解决方法等
  3. Mysql数据类型TINYINT(1)与BOOLEAN踩坑记
  4. 行业动态_天才、忽悠与炮灰
  5. win10系统改win7设置bios方法图文教程
  6. Zabbix自动发现规则
  7. 输入一个正整数,求出它是几位数
  8. DBFS解二阶魔方——一次c++学习之旅
  9. C语言中输出26个字母
  10. divi模板下载_适用于任何WordPress主题的Divi Builder插件
  11. linux下查看进程+杀死进程方法大全
  12. relative会脱离文档流吗_脱离文档流和恢复文档流的方法
  13. python timer详解_python线程定时器Timer实现原理解析
  14. [英语阅读]经济不景气金融从业者外遇增多
  15. Java笔记--自己工作涉及
  16. 重启虚拟机异常:Unmount and run xfs_repair
  17. sql数据库查询计算机学院,SQL简单查询-2
  18. tensorflow识别验证码
  19. 脚本自动定时打开链接_双12的自动领能量脚本,傻瓜才不用
  20. 监视器的功能,光源分类,TFSF光源斜入射的实例(有/无边界)

热门文章

  1. 后处理安装_核燃料后处理设施中的热室
  2. 宝塔挂载linux硬盘,宝塔移动硬盘挂载Linux服务器挂载ntfs移动硬盘
  3. java用if判断输入字符_java怎么用if判断输入的是不是数字
  4. 下一代CC++测试框架TestNG++入门指导【转】
  5. windows下多tomcat部署
  6. Android抽屉(SlidingDrawer --类似android通知栏下拉效果)
  7. SSRS: How to Display Checkbox on Report
  8. 将Windows MyEclipse的web项目移植到Debian下
  9. emacs之配置8,gdb调试设置
  10. 360公布权威机构对扣扣保镖的测试报告