ASP.NET Core使用EPPlus导入导出Excel

开发过程当中,常常会遇到导入导出数据的需求,本篇博客介绍在.NET Core中如何使用EPPlus组件导入导出Excel

EPPlus:

EPPlus是使用Open Office XML格式(xlsx)读写Excel 2007/2010文件的 .net 开发库,能读写Excel 2007/2010文件,能够运行在Windows, Linux和Mac,官网地址:https://archive.codeplex.com/前端

在.net core中还可使用NOPI操做Excel,在此不作介绍。ajax

使用EPPlus操做Excel:

一、引入EPPlus包,在程序包管理控制台中执行命令安装依赖包:

1 PM> Install-Package EPPlus.Core -Version 1.5.4

二、导出Excel 

①使用EF Core操做数据库时,数据源用List集合方便导出。数据库

②在控制器的构造函数中注入 IHostingEnvironment 来获取网站根目录路径,以便设置导出Excel文件路径。浏览器

 1 public IActionResult OutputExcel()  2 {  3  //数据源为list集合
 4   var query = (from u in _context.UserInfo  5                  select new
 6  {  7  u.UId,  8  u.UName,  9  u.UPws, 10  u.UEmail, 11  u.UTel 12  }).ToList(); 13     //指定导出Excel文件路径
14     string sWebRootFolder = _hostingEnv.WebRootPath; 15     //文件名
16     string sFileName = $@"测试导出{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"; 17     //将两个字符串合并为一个路径
18     var path = Path.Combine(sWebRootFolder, sFileName); 19     //建立文件对象
20     FileInfo file = new FileInfo(path); 21     //若是文件存在
22     if (file.Exists) 23  { 24         //删除文件
25  file.Delete(); 26         //从新建立文件对象
27         file = new FileInfo(path); 28    } 29     //建立ExcelPackage对象
30     using (ExcelPackage package = new ExcelPackage(file)) 31   { 32         //添加新工做表到工做簿
33         ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("UserInfo"); 34         //将list集合加载到工做表中,打印表头
35         worksheet.Cells.LoadFromCollection(query, true); 36         //保存Excel
37  package.Save(); 38     }//释放资源
39     return View("Index"); 40 }

ExcelPackage类是EPPlus的入口类,解析一个Excel文件,生成ExcelWorkbook对象来表示一个Excel。app

ExcelPackage类实现了IDisposable接口,可使用using进行对象释放。函数

ExcelWorksheet类可设置Excel表格样式,设置Excel表格样式会增长内存负担,导出速度可能会变慢。post

三、导入Excel

导入,导出Excel方法,博主都使用Ajax请求,在导入Excel时,将文件路径传入后台时出现fackpath路径问题,后直接先将导入的文件保存在程序根目录中,而后再导入程序根目录中的文件测试

JavaScript代码: 网站

 1 $("#IExcel").click(function () {  2     var formdata = new FormData();//经过FormData构造函数建立一个空对象
 3     formdata.append('file', $("#Import")[0].files[0]);//经过append()方法来追加数据
 4  $.ajax({  5         type: "post",  6         url: "/Main/ImportExcel",  7         contentType: false,//不要去设置Content-Type请求头
 8         processData: false,//不要去处理发送的数据
 9  data: formdata, 10         success: function (data) { 11  alert(data.message); 12  }, 13         error: function () { 14             alert("导入失败!"); 15  } 16  }) 17 })

在使用FormData对象传输数据时,须设置浏览器不要去处理发送的数据和设置Content-Type请求头,不然JS将报错:Uncaught TypeError: Illegal invocationurl

C#代码: 

 1 public IActionResult ImportExcel()  2 {  3     try
 4  {  5         //先将要导入的文件上传到程序根目录  6         //获取前端传过来的文件
 7         var files = Request.Form.Files;  8         var filePath = "";  9         foreach (var item in files) 10  { 11             //获取文件名
12             filePath = item.FileName; 13             //指定文件上传路径
14             filePath = _hostingEnv.WebRootPath + $@"\{filePath}"; 15             //建立文件流
16             using (FileStream fs = System.IO.File.Create(filePath)) 17  { 18                 //将上载文件的内容复制到目标流
19  item.CopyTo(fs); 20                 //清除此流的缓冲区并致使将任何缓冲数据写入
21  fs.Flush(); 22  } 23  } 24         //建立文件对象
25         FileInfo file = new FileInfo(filePath); 26         if (file != null) 27  { 28             //建立ExcelPackage对象
29             using (ExcelPackage package = new ExcelPackage(file)) 30  { 31                 //访问Excel表中的第一张表
32                 ExcelWorksheet worksheet = package.Workbook.Worksheets[1]; 33                 //获取表格的行数
34                 int rowCount = worksheet.Dimension.Rows; 35                 //获取表格的列数
36                 int ColCount = worksheet.Dimension.Columns; 37                 var user = new List<UserInfo>(); 38                 for (int row = 1; row <= rowCount; row++) 39  { 40                     UserInfo userinfo = new UserInfo(); 41                     //指定行列赋值
42                     userinfo.UName = worksheet.Cells[row, 2].Value.ToString(); 43                     userinfo.UPws = worksheet.Cells[row, 3].Value.ToString(); 44                     userinfo.UEmail = worksheet.Cells[row, 4].Value.ToString(); 45                     userinfo.UTel = worksheet.Cells[row, 5].Value.ToString(); 46                     //将数据保存到实体中
47  _context.UserInfo.Add(userinfo); 48  _context.SaveChanges(); 49  } 50                 return Json(new { message = "导入成功!" }); 51  } 52  } 53         return null; 54  } 55     catch (Exception ex) 56  { 57         return Json(new { message = "导入失败!" + ex }); 58    } 59 }

ExcelWorkbook类表示了一个Excel文件,其Worksheets属性对应着Excel的各个Sheet。Worksheets属性会自动建立,不用担忧空指针异常,可是其Count可能为0。注意:在获取具体的Sheet时,索引号从1开始。

End!

相关文章
相关标签/搜索