博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET CORE 2.1 导出excel文件的两种方法
阅读量:7260 次
发布时间:2019-06-29

本文共 7411 字,大约阅读时间需要 24 分钟。

最近在做 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;        }

 

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

 

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

///     /// 公共工具类    ///     public class CommonHelper    {        //获取列名委托方法        public delegate string GetColumnName(string columnName);        #region 导入导出Excel相关        ///         /// 将泛类型集合List类转换成DataTable        ///         /// 泛类型集合        /// 
返回转换后的DataTable
public static DataTable ListToDataTable
(List
entitys) { //生成DataTable的structure var dt = new DataTable(); try { //检查泛型实体是否为空 if (entitys == null || entitys.Count < 1) { return dt; } //取出第一个实体的所有Propertie var 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; } ///
/// 将dataTable转换为Excel字节流 /// ///
///
///
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 }

  

  然后我们就可以导出了

 

    ///         /// 表格列名称        ///               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;            }        }        ///         /// 导出excel        ///         [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();        }        ///         /// 设定导出的标头内容        ///         /// 导出的文件名        private void SetResponseHeaderForDetail(string fileName)        {            Response.Headers.Add(ResponseConfigure.ContentDisposition,                ResponseConfigure.Attachment + HttpUtility.UrlEncode(fileName));        }

 

 

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

你可能感兴趣的文章
VC中字符串由于版本不同而导致的错误问题
查看>>
分布式缓存技术redis学习(一)——redis简介以及linux上的安装
查看>>
为什么kafka使用磁盘而不是内存
查看>>
创立一个站点的前前后后(起因,域名,云平台,备案,CDN等等)(1)
查看>>
天朝git的使用
查看>>
什么是 HTTPS
查看>>
BPF and eBPF linux
查看>>
如何解决MySQL在高版本需要指明是否进行SSL连接问题
查看>>
[PAL算法说明]SAP HANA PAL线性回归预测分析Linear Regression算法说明LRREGRESSION
查看>>
JAVA学习课第二十八届(多线程(七))- 停止-threaded多-threaded面试题
查看>>
Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
查看>>
我的vim配置
查看>>
C#获取微信二维码显示到wpf
查看>>
时间戳和字符串之间的互相转换
查看>>
Android Studio导入第三方类库的方法
查看>>
oracle学习总结3
查看>>
041 添加分区以及分析函数和窗口函数
查看>>
The type Date is ambiguous
查看>>
MVC 5使用ViewBag(对象)显示数据
查看>>
python多版本共存
查看>>