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,在此不做介绍。
使用EPPlus操作Excel:
1、引入EPPlus包,在程序包管理控制台中执行命令安装依赖包:
1 PM> Install-Package EPPlus.Core -Version 1.5.4
2、导出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。
ExcelPackage类实现了IDisposable接口,可以使用using进行对象释放。
ExcelWorksheet类可设置Excel表格样式,但设置Excel表格样式会增加内存负担,导出速度可能会变慢。
3、导入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 invocation
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!