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!

相關文章
相關標籤/搜索