開發過程當中,常常會遇到導入導出數據的需求,本篇博客介紹在.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!