.NET Core使用NPOI將Excel中的數據批量導入到MySQL

前言:

  在以前的幾篇博客中寫過.NET Core使用NPOI導出Word和Excel的文章,今天把一樣咱們平常開發中比較經常使用的使用Excel導入數據到MySQL數據庫中的文章給安排上。與此同時還把NPOI-ExportWordAndExcel-ImportExcelData這個開源項目升級到了.NET Core 3.1版本(注意以前一直是在.NET Core2.2的基礎上開發的),升級的過程當中遇到了很多坑,在項目中會有一些註釋關於升級到.NET Core3.1須要修改的代碼這裏就不作詳細的講解了能夠Clone項目,或者是直接查看官方文檔.NET Core相關版本的遷移指南(https://docs.microsoft.com/zh-cn/aspnet/core/migration/22-to-30?view=aspnetcore-3.1&tabs=visual-studio)。html

項目實現效果圖:

1、引入NPOI NuGet:

NPOI GitHub源碼地址:

https://github.com/tonyqus/npoigit

版本說明:

  NPOI 2.4.1 (注意不一樣版本可能使用的姿式有點小差異,注意有同窗可能會問如今NPOI的最新穩定版不是2.5.1嗎?爲何仍是用2.4.1呢?由於2.5.1還有些屬性與以前的2.4.1不是很兼容,所以咱們這裏仍是繼續使用2.4.1,功能上可以徹底可以知足咱們的需求)。github

程序包管理器控制檯輸入一下命令安裝:

Install-Package NPOI -Version 2.4.1

經過NuGet管理解決方案安裝:

選擇=>工具=>NuGet包管理器=>程序包管理器控制檯:

 搜索:NPOI進行安裝:

2、ASP.NET Core使用EF Core鏈接MySQL執行簡單的CRUD操做:

  由於該篇文章會涉及到MySQL數據庫的操做,因此前提咱們須要有一點的CRUD的基礎。這裏就不作詳細的講解了,能夠參考以前寫的一篇文章,ASP.NET Core MVC+Layui使用EF Core鏈接MySQL執行簡單的CRUD操做:數據庫

http://www.javashuo.com/article/p-xxkscsby-k.html工具

3、使用NPOI獲取Excel數據注意點:

一、關於Excel的版本問題:

作過Excel相關工做的人應該都清楚Office Excel的格式有兩種:visual-studio

a、一種是.XLS是03版的Office Excel,沒法打開高版本的。ui

a、一種是.XLSX是07版(或者07以上的)的Office Excel,能夠打開低版本的。lua

因此咱們在使用NPOI導入數據時不一樣格式獲取Excel工做簿對象也有所不一樣,以下代碼所示:spa

                //Workbook對象表明一個工做簿,首先定義一個Excel工做薄
                IWorkbook workbook;

                //XSSFWorkbook 適用XLSX格式,HSSFWorkbook 適用XLS格式
                #region 判斷Excel版本
                switch (fileType)
                {
                    //.XLSX是07版(或者07以上的)的Office Excel
                    case ".xlsx":
                        workbook = new XSSFWorkbook(stream);
                        break;
                    //.XLS是03版的Office Excel
                    case ".xls":
                        workbook = new HSSFWorkbook(stream);
                        break;
                    default:
                        throw new Exception("Excel文檔格式有誤");
                }
                #endregion

二、NPOI獲取Excel單元格中不一樣類型的數據:

注意,我們填寫在Excel單元格中的數據可能爲多種不一樣的數據類型,所以咱們須要對單元格中的數據類型作判斷而後在獲取,不然程序會報異常。excel

                            #region NPOI獲取Excel單元格中不一樣類型的數據
                            //獲取指定的單元格信息
                            var cell = row.GetCell(j);
                            switch (cell.CellType)
                            {
                                //首先在NPOI中數字和日期都屬於Numeric類型
                                //經過NPOI中自帶的DateUtil.IsCellDateFormatted判斷是否爲時間日期類型
                                case CellType.Numeric when DateUtil.IsCellDateFormatted(cell):
                                    dataRow[j] = cell.DateCellValue;
                                    break;
                                case CellType.Numeric:
                                    //其餘數字類型
                                    dataRow[j] = cell.NumericCellValue;
                                    break;
                                //空數據類型
                                case CellType.Blank:
                                    dataRow[j] = "";
                                    break;
                                //公式類型
                                case CellType.Formula:
                                {
                                    HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(workbook);
                                    dataRow[j] = eva.Evaluate(cell).StringValue;
                                    break;
                                }
                                //布爾類型
                                case CellType.Boolean:
                                    dataRow[j] = row.GetCell(j).BooleanCellValue;
                                    break;
                                //錯誤
                                case CellType.Error:
                                    dataRow[j] = HSSFErrorConstants.GetText(row.GetCell(j).ErrorCellValue);
                                    break;
                                //其餘類型都按字符串類型來處理(未知類型CellType.Unknown,字符串類型CellType.String)
                                default:
                                    dataRow[j] = cell.StringCellValue;
                                    break;
                            }
                            #endregion

4、通用的NPOI Excel導入數據幫助類(NpoiExcelImportHelper):

/**
 * Author:追逐時光者
 * Description:Npoi數據導入幫助類
 * Description:2020年9月8日
 */
using System;
using System.Data;
using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

namespace YY_Utility
{
    public class NpoiExcelImportHelper
    {
        private static NpoiExcelImportHelper _excelImportHelper;

        public static NpoiExcelImportHelper _
        {
            get => _excelImportHelper ?? (_excelImportHelper = new NpoiExcelImportHelper());
            set => _excelImportHelper = value;
        }

        /// <summary>
        /// 讀取excel表格中的數據,將Excel文件流轉化爲dataTable數據源  
        /// 默認第一行爲標題 
        /// </summary>
        /// <param name="stream">excel文檔文件流</param>
        /// <param name="fileType">文檔格式</param>
        /// <param name="isSuccess">是否轉化成功</param>
        /// <param name="resultMsg">轉換結果消息</param>
        /// <returns></returns>
        public DataTable ExcelToDataTable(Stream stream, string fileType, out bool isSuccess, out string resultMsg)
        {
            isSuccess = false;
            resultMsg = "Excel文件流成功轉化爲DataTable數據源";
            var excelToDataTable = new DataTable();

            try
            {
                //Workbook對象表明一個工做簿,首先定義一個Excel工做薄
                IWorkbook workbook;

                //XSSFWorkbook 適用XLSX格式,HSSFWorkbook 適用XLS格式
                #region 判斷Excel版本
                switch (fileType)
                {
                    //.XLSX是07版(或者07以上的)的Office Excel
                    case ".xlsx":
                        workbook = new XSSFWorkbook(stream);
                        break;
                    //.XLS是03版的Office Excel
                    case ".xls":
                        workbook = new HSSFWorkbook(stream);
                        break;
                    default:
                        throw new Exception("Excel文檔格式有誤");
                }
                #endregion

                var sheet = workbook.GetSheetAt(0);
                var rows = sheet.GetRowEnumerator();

                var headerRow = sheet.GetRow(0);
                int cellCount = headerRow.LastCellNum;//最後一行列數(即爲總列數)

                //獲取第一行標題列數據源,轉換爲dataTable數據源的表格標題名稱
                for (var j = 0; j < cellCount; j++)
                {
                    var cell = headerRow.GetCell(j);
                    excelToDataTable.Columns.Add(cell.ToString());
                }

                //獲取Excel表格中除標題覺得的全部數據源,轉化爲dataTable中的表格數據源
                for (var i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
                {
                    var dataRow = excelToDataTable.NewRow();

                    var row = sheet.GetRow(i);

                    if (row == null) continue; //沒有數據的行默認是null 

                    for (int j = row.FirstCellNum; j < cellCount; j++)
                    {
                        if (row.GetCell(j) != null)//單元格內容非空驗證
                        {
                            #region NPOI獲取Excel單元格中不一樣類型的數據
                            //獲取指定的單元格信息
                            var cell = row.GetCell(j);
                            switch (cell.CellType)
                            {
                                //首先在NPOI中數字和日期都屬於Numeric類型
                                //經過NPOI中自帶的DateUtil.IsCellDateFormatted判斷是否爲時間日期類型
                                case CellType.Numeric when DateUtil.IsCellDateFormatted(cell):
                                    dataRow[j] = cell.DateCellValue;
                                    break;
                                case CellType.Numeric:
                                    //其餘數字類型
                                    dataRow[j] = cell.NumericCellValue;
                                    break;
                                //空數據類型
                                case CellType.Blank:
                                    dataRow[j] = "";
                                    break;
                                //公式類型
                                case CellType.Formula:
                                {
                                    HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(workbook);
                                    dataRow[j] = eva.Evaluate(cell).StringValue;
                                    break;
                                }
                                //布爾類型
                                case CellType.Boolean:
                                    dataRow[j] = row.GetCell(j).BooleanCellValue;
                                    break;
                                //錯誤
                                case CellType.Error:
                                    dataRow[j] = HSSFErrorConstants.GetText(row.GetCell(j).ErrorCellValue);
                                    break;
                                //其餘類型都按字符串類型來處理(未知類型CellType.Unknown,字符串類型CellType.String)
                                default:
                                    dataRow[j] = cell.StringCellValue;
                                    break;
                            }
                            #endregion
                        }
                    }
                    excelToDataTable.Rows.Add(dataRow);
                }

                isSuccess = true;
            }
            catch (Exception e)
            {
                resultMsg = e.Message;
            }

            return excelToDataTable;
        }
    }
}

總結:

  關於.NET Core 使用NPOI導入數據和導出Word,Excel數據的教程到這裏就告一段落了,假如你們感興趣的話或者對你們有幫助的話不要忘記了前往NPOI-ExportWordAndExcel-ImportExcelData 項目中給我一個star哦,謝謝。

相關實例連接地址:

GitHub完整實例地址:

https://github.com/YSGStudyHards/NPOI-ExportWordAndExcel-ImportExcelData

.NET Core使用NPOI導出複雜,美觀的Excel詳解:

http://www.javashuo.com/article/p-yhcendvt-kx.html

.NET Core使用NPOI導出複雜Word詳解:

http://www.javashuo.com/article/p-eqwdorft-dm.html

.NET Core使用NPOI將Excel中的數據批量導入到MySQL:

http://www.javashuo.com/article/p-blmkjyvd-mx.html

ASP.NET Core MVC+Layui使用EF Core鏈接MySQL執行簡單的CRUD操做:

https://www.cnblogs.com/Can-daydayup/p/12593599.html

相關文章
相關標籤/搜索