.NetCore實現Execl匯入資料處理(EppLus、NPOI)
阿新 • • 發佈:2020-08-07
1、Excel .xls 和 .xlsx 有什麼區別?
區別如下:
1、檔案格式不同。.xls 是一個特有的二進位制格式,其核心結構是複合文件型別的結構,而.xlsx 的核心結構是 XML 型別的結構,
採用的是基於 XML 的壓縮方式,使其佔用的空間更小。.xlsx 中最後一個 x 的意義就在於此。
2、版本不同。.xls是excel2003及以前版本生成的檔案格式,而.xlsx是excel2007及以後版本生成的檔案格式。
3、相容性不同。.xlsx格式是向下相容的,可相容.xls格式。
2、一號種子選手(EppLus)
EPPlus是一個使用Open Office XML(xlsx)檔案格式,能讀寫Excel 2007/2010 檔案的開源元件, 在匯出Excel的時候不需要電腦上安裝office,官網為:http://epplus.codeplex.com/。 基本上Excel上的各種功能(例如圖表、VBA、資料透視表、加密、資料驗證等)Epplus都能實現, 它的一個缺點就是不支援匯出2003版的Excel,也就是.XLS檔案。
2.1 EppLus實現
(1)新增包 EPPlus (注意:EPPlus.Core已棄用) (2)Execl匯入資料使用EPPlus處理例項: /// <summary> /// 獲取Exel批量使用者資料(EppLus) /// </summary> /// <param name="context"></param> /// <param name="msg"></param> /// <returns></returns> public List<BatchUsersReq> GetBatchUsersData(HttpContext context,out string msg) { msg = "資料處理成功"; // 獲取上傳檔案字尾 var extension = Path.GetExtension(context.Request.Form.Files[0].FileName).ToUpper(); if(!extension.Contains("XLSX")) { msg = "檔案格式不正確,只支援XLSX檔案"; return null; } // 限制單次只能上傳5M float fileSize = context.Request.Form.Files[0].Length / 1024 / 1024; if(fileSize > 5) { msg = "檔案大小超過限制"; return null; } try { Stream stream = context.Request.Form.Files[0].OpenReadStream(); using (var package = new ExcelPackage(stream)) { // 獲取Exel指定工作簿,"Sheet1"也可以用索引代替 ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"]; // 獲取資料行數 int RowNum = worksheet.Dimension.Rows; // 待處理資料儲存列表 List<BatchUsersReq> usersData = new List<BatchUsersReq>(); // 獲取每行資料 for (int row = 1; row <= RowNum; row++) { usersData.Add(new BatchUsersReq { // 獲取每列資料 Account = worksheet.Cells[row, 1].Value.ToString(), Password = worksheet.Cells[row, 2].Value.ToString(), Name = worksheet.Cells[row, 3].Value.ToString(), Sex = worksheet.Cells[row, 4].Value.ToString(), UserRole = worksheet.Cells[row, 5].Value.ToString() }); } return usersData; } } catch(Exception e) { msg = "資料異常"; } return null; }
3、二號種子選手(NPOI)
NPOI是一個開源專案,可以讀/寫xls,doc,ppt檔案,有著廣泛的應用。NPIO官網地址:http://npoi.codeplex.com/
使用NPOI能夠幫助開發者在沒有安裝微軟Office的情況下讀寫Office 97-2003的檔案,支援的檔案格式包括xls, doc, ppt等。
NPOI是構建在POI 3.x版本之上的,它可以在沒有安裝Office的情況 下對Word/Excel文件進行讀寫操作。
3.1 NPOI實現
(1)新增包 DotNetCore.NPOI (2)Execl匯入資料使用EPPlus處理例項: /// <summary> /// 獲取Execl批量使用者資料 NPOI /// </summary> /// <param name="file">execl</param> /// <param name="msg"></param> /// <returns></returns> public List<BatchUsersReq> GetBatchUsersData(IFormFile file,out string msg) { msg = "資料處理成功"; // 獲取上傳檔案字尾 string ext = Path.GetExtension(file.FileName).ToLower(); if(!ext.Contains("xls") && !ext.Contains("xlsx")) { msg = "檔案有誤,只支援上傳XLS、XLSX檔案"; return null; } // 限制單次只能上傳5M float fileSize = file.Length / 1024 / 1024; if (fileSize > 5) { msg = "檔案大小超過限制"; return null; } try { // 檔案流處理 MemoryStream ms = new MemoryStream(); file.CopyTo(ms); ms.Seek(0, SeekOrigin.Begin); // 根據Excel版本進行處理 IWorkbook workbook = ext == ".xls" ? (IWorkbook)new HSSFWorkbook(ms) : new XSSFWorkbook(ms); // 獲取Excel第一張工作簿 ISheet sheet = workbook.GetSheetAt(0); // 獲取資料行數 int num = sheet.LastRowNum; // 待處理使用者資料 List<BatchUsersReq> users = new List<BatchUsersReq>(); for (int i = 1; i <= num; i++) { // 獲取指定行資料 IRow row = sheet.GetRow(i); BatchUsersReq user = new BatchUsersReq(); // 獲取指定列資料 user.Account = row.GetCell(0).ToString(); user.Password = row.GetCell(1).ToString(); user.Name = row.GetCell(2).ToString(); user.Sex = row.GetCell(3).ToString(); user.UserRole = row.GetCell(4).ToString(); users.Add(user); } return users; } catch(Exception e) { msg = "資料處理出錯"; } return null; }