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

摘要:
使用EPPlus操作Excel:1,导入EPPlus包,并在包管理控制台中执行命令以安装依赖包:1PM˃install PackageEPPlus。核心版本1.5.42.导出Excel① 当使用EFCore操作数据库时,数据源使用List集合来方便导出。② 将IHostingEnvironment注入控制器的构造函数,以获取网站的根目录路径,从而设置导出Excel文件的路径。ExcelPackage类实现IDisposable接口,可以使用释放对象。ExcelWorksheet类可以设置Excel表格样式,但设置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 = newFileInfo(path);
21     //如果文件存在
22     if(file.Exists)
23 {
24         //删除文件
25 file.Delete();
26         //重新创建文件对象
27         file = newFileInfo(path);
28   }
29     //创建ExcelPackage对象
30     using (ExcelPackage package = newExcelPackage(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 publicIActionResult ImportExcel()
2 {
3     try
4 {
5         //先将要导入的文件上传到程序根目录
6         //获取前端传过来的文件
7         var files =Request.Form.Files;
8         var filePath = "";
9         foreach (var item infiles)
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 = newFileInfo(filePath);
26         if (file != null)
27 {
28             //创建ExcelPackage对象
29             using (ExcelPackage package = newExcelPackage(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 = newUserInfo();
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!

免责声明:文章转载自《ASP.NET Core使用EPPlus导入导出Excel》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【存储器相关】RAM、SRAM、SDRAM、ROM、EPROM、EEPROM、Flash存储器区别Algorithm算法库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PDF合并

要求:将多个table导出到一个PDF里,然后打印。  问题分析:要求将四个table放一个PDF打印,四个table的列各不相同,第一个是表头,其他三个是列表,列比表头多很多,如果直接生成一个excel,然后再直接导出会发现有些列在PDF中换行了。  原因:因为excle可打印的区域是有限制的,可打印的地方如下方法可见:文件-打印-设置-打印选择区域(如...

POI导出excel模板三种方式

POI简介 POI是Apache软件基金会用java编写的免费开源的跨平台的Java API,提供API给java程序对Microsoft Office格式档案读和写的功能,一般用来操作Excel文件。用javaPOI导出Excel时,需要考虑Excel版本和数据量的问题。 JavaPOI导出Excel有三种形式: (1) 第一种HSSFWorkbook...

java 读CSV 和 Excel

1、csv和excel读写对比  开发中经常遇到数据导入和导出功能,csv 和 excel是最常见的数据格式,本文比较了下csv和excel读写相同数据的效率:  测试数据格式一 用上面模板数据生成的测试: 耗时时间统计:  测试数据格式二 生成数据: 耗时统计: 相同格式相同行数对比: csv文件比excel文件稍大 csv读取/写入比ex...

Java使用POI解析Excel表格

概述 Excel表格是常用的数据存储工具,项目中经常会遇到导入Excel和导出Excel的功能。 常见的Excel格式有xls和xlsx。07版本以后主要以基于XML的压缩格式作为默认文件格式xlsx。新格式主要是使用了OpenXML标准,结合了XML与Zip压缩技术。在这里就不细说,感兴趣的读者可以自行去查找相关知识。本文将重点以这两种文件格式的解析来展...

使用C#和Excel进行报表开发-生成统计图Chart

    原文地址:http://www.opent.cn/a/094/1235.shtml     有的Web项目选用Excel作为报表方案,在服务器端生成Excel文件,然后传送到客户端,由客户端进行打印。在国内的环境下,相对PDF方式,Excel的安装率应该比pdf阅读器的安装率要高,同时,微软也为C#操作Excel提供了完备的接口,虽然ZedGrap...

vbs读取excel的一个实例

功能:在excel中对ip与loginType这两列进行遍历读取。本程序依赖于excel文件的"sheet2"表单中具有这两列。 dim dictTarget, objExcel '从交换机台账中提取ip/loginType数据 getDictTarget objExcel.Quit 'Msgbox dictTarget.Count '遍历所有ip,进...