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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM