在.net core中導入Excel


引言

之前在.net Framework中經常有Excel的導入導出,現在.net core越來越流行,我們就來講一下在.net core中是如何導入Excel到DataSet中的。

 

環境

  • .net Core
  • NPOI (通過Nuget進行安裝)

創建ExcelHelper

    public class ExcelHeler
    {

        private static ILogger<ExcelHeler> logger;
        /// <summary>
        /// 讀取Excel多Sheet數據
        /// </summary>
        /// <param name="filePath">文件路徑</param>
        /// <param name="sheetName">Sheet名</param>
        /// <returns></returns>
        public static DataSet ReadExcelToDataSet(string filePath, string sheetName = null)
        {
            if (!File.Exists(filePath))
            {
                //logger.LogError($"未找到文件{filePath}");
                return null;
            }
            //獲取文件信息
            FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            IWorkbook workbook = WorkbookFactory.Create(fs);
            //獲取sheet信息
            ISheet sheet = null;
            DataSet ds = new DataSet();
            if (!string.IsNullOrEmpty(sheetName))
            {
                sheet = workbook.GetSheet(sheetName);
                if (sheet == null)
                {
                    //logger.LogError($"{filePath}未找到sheet:{sheetName}");
                    return null;
                }
                DataTable dt = ReadExcelFunc(workbook, sheet);
                ds.Tables.Add(dt);
            }
            else
            {
                //遍歷獲取所有數據
                int sheetCount = workbook.NumberOfSheets;
                for (int i = 0; i < sheetCount; i++)
                {
                    sheet = workbook.GetSheetAt(i);
                    if (sheet != null)
                    {
                        DataTable dt = ReadExcelFunc(workbook, sheet);
                        if (dt != null) ds.Tables.Add(dt);
                    }
                }
            }
            return ds;
        }

        /// <summary>
        /// 讀取Excel多Sheet數據
        /// </summary>
        /// <param name="filePath">文件路徑</param>
        /// <param name="sheetName">Sheet名</param>
        /// <returns></returns>
        public static DataSet ReadExcelToDataSet(FileStream fs, string sheetName = null)
        {
            IWorkbook workbook = WorkbookFactory.Create(fs);
            //獲取sheet信息
            ISheet sheet = null;
            DataSet ds = new DataSet();
            if (!string.IsNullOrEmpty(sheetName))
            {
                sheet = workbook.GetSheet(sheetName);
                if (sheet == null)
                {
                    //logger.LogError($"{filePath}未找到sheet:{sheetName}");
                    return null;
                }
                DataTable dt = ReadExcelFunc(workbook, sheet);
                ds.Tables.Add(dt);
            }
            else
            {
                //遍歷獲取所有數據
                int sheetCount = workbook.NumberOfSheets;
                for (int i = 0; i < sheetCount; i++)
                {
                    sheet = workbook.GetSheetAt(i);
                    if (sheet != null)
                    {
                        DataTable dt = ReadExcelFunc(workbook, sheet);
                        if(dt !=null)
                            ds.Tables.Add(dt);
                    }
                }
            }
            return ds;
        }

        /// <summary>
        /// 讀取Excel信息
        /// </summary>
        /// <param name="workbook">工作區</param>
        /// <param name="sheet">sheet</param>
        /// <returns></returns>
        private static DataTable ReadExcelFunc(IWorkbook workbook, ISheet sheet)
        {
            DataTable dt = new DataTable();
            //獲取列信息
            IRow cells = sheet.GetRow(sheet.FirstRowNum);
            //空數據化返回
            if (cells == null) return null;
            int cellsCount = cells.PhysicalNumberOfCells;
            //空列返回
            if (cellsCount == 0) return null;
            int emptyCount = 0;
            int cellIndex = sheet.FirstRowNum;
            List<string> listColumns = new List<string>();
            bool isFindColumn = false;
            while (!isFindColumn)
            {
                emptyCount = 0;
                listColumns.Clear();
                for (int i = 0; i < cellsCount; i++)
                {
                    if (string.IsNullOrEmpty(cells.GetCell(i).StringCellValue))
                    {
                        emptyCount++;
                    }
                    listColumns.Add(cells.GetCell(i).StringCellValue);
                }
                //這里根據邏輯需要,空列超過多少判斷
                if (emptyCount == 0)
                {
                    isFindColumn = true;
                }
                cellIndex++;
                cells = sheet.GetRow(cellIndex);
            }

            foreach (string columnName in listColumns)
            {
                if (dt.Columns.Contains(columnName))
                {
                    //如果允許有重復列名,自己做處理
                    continue;
                }
                dt.Columns.Add(columnName, typeof(string));
            }
            //開始獲取數據
            int rowsCount = sheet.PhysicalNumberOfRows;
            var rowIndex = 1;
            DataRow dr = null;
            //空數據化返回
            if(rowsCount <= 1) { return null; }
            for (int i = rowIndex; i < rowsCount; i++)
            {
                cells = sheet.GetRow(i);
                dr = dt.NewRow();
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    //這里可以判斷數據類型
                    switch (cells.GetCell(j).CellType)
                    {
                        case CellType.String:
                            dr[j] = cells.GetCell(j).StringCellValue;
                            break;
                        case CellType.Numeric:
                            dr[j] = cells.GetCell(j).NumericCellValue.ToString();
                            break;
                        case CellType.Unknown:
                            dr[j] = cells.GetCell(j).StringCellValue;
                            break;
                    }
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
    }

  

如何調用

        /// <summary>
        /// 通過Excel上傳所有導游的返款
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ResultModel<bool> UploadGuideRebates()
        {
            var account = GetAccountInformation();
            AccountInfo accountInfo = new AccountInfo()
            {
                UserName = account.Log_OperationPerson,
                DeviceId = account.Log_Device
            };
            var resultModel = new ResultModel<bool>();

            try
            {
                var files = Request.Form.Files;
                long size = files.Sum(f => f.Length);
                //判斷是否存在該設備的日志文件夾
                string webRootPath = hostingEnv.WebRootPath;
                string filePath = webRootPath + $"/GuideRebatesFiles/";

                if (!Directory.Exists(filePath))
                {
                    Directory.CreateDirectory(filePath);
                }

                foreach (var formFile in files)
                {
                    if (formFile.Length > 0)
                    {
                        string fileExt = formFile.FileName.Split('.')[1]; //文件擴展名,不含“.”
                        long fileSize = formFile.Length; //獲得文件大小,以字節為單位
                        string newFileName = Guid.NewGuid() + "." + fileExt; //隨機生成新的文件名 

                        string fileNamePath = Path.Combine(filePath, newFileName);
                        using (var stream = new FileStream(fileNamePath, FileMode.Create))
                        {
                            formFile.CopyTo(stream);
                            stream.Flush();
                        }
              //調用ExcelHelper方法
                        DataSet ds = ExcelHeler.ReadExcelToDataSet(fileNamePath);

                        guideService.UpdateGuideRebatesList(accountInfo, ds.Tables[0]);
                    }
                }
                //var guideList = guideService.GetGuideList(accountInfo);



                resultModel.Success = true;
            }
            catch (Exception ex)
            {
                resultModel.SetResult(false, ErrorType.InnerExction, null, new List<string> { "內部異常,請稍后重試!" });
            }
            return resultModel;
        }    

  


免責聲明!

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



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