开发过程中,经常会遇到导入导出数据的需求,本篇博客介绍在.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()
 3     //数据源为list集合
 4     var query = (from u in _context.UserInfo
 5                  select new
 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");

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()
 3     try
 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     }

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

作者:Wahaha、
本博客是作者在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处。