1. 程式人生 > 實用技巧 >.NetCore實現Execl匯入資料處理(EppLus、NPOI)

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