.NetCore實現Execl導入數據處理(EppLus、NPOI)


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;
    }

4、踩坑心得

   在使用一個庫之前一定要多了解全面,多幾個庫對比然后選擇符合自己需求的。
   我剛開始參考的EppLus博文里面並沒有說Epplus不支持.xls,IF判斷邏輯也是兩種都支持。
   而我恰巧是上傳的.xls格式,導致代碼在讀取工作簿的時候就報錯,我以為是文件流的問題導致讀取不到所以折騰了很久。
   后來百度知道了Epplus不支持.xls,於是機智的我的直接手動把.xls改成了.xlsx。(哭唧唧) 
   結果當然還是不行,於是我又幾番百度了解到了NPOI……


免責聲明!

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



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