zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    【scala语言入门】二、匿名函数
    【scala语言入门】 一、apply与unapply
    关于timeOut超时后是否会回滚的思考
    [算法]-插入排序
    【oenCV系列】 写视频
    【Opencv系列】
    Factory Method模式精解(C++版本)
    Template Method模式精解(C++版本)
    Adapter模式精解(C++版本)
    迭代器模式精解(C++版本)
  • 原文地址:https://www.cnblogs.com/gygg/p/11422959.html
Copyright © 2011-2022 走看看