zoukankan      html  css  js  c++  java
  • .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)。

    项目实现效果图:

    一、引入NPOI NuGet:

    NPOI GitHub源码地址:

    https://github.com/tonyqus/npoi

    版本说明:

      NPOI 2.4.1 (注意不同版本可能使用的姿势有点小差别,注意有同学可能会问现在NPOI的最新稳定版不是2.5.1吗?为什么还是用2.4.1呢?因为2.5.1还有些属性与之前的2.4.1不是很兼容,因此我们这里还是继续使用2.4.1,功能上能够完全能够满足我们的需求)。

    程序包管理器控制台输入一下命令安装:

    Install-Package NPOI -Version 2.4.1

    通过NuGet管理解决方案安装:

    选择=>工具=>NuGet包管理器=>程序包管理器控制台:

     搜索:NPOI进行安装:

    二、ASP.NET Core使用EF Core连接MySQL执行简单的CRUD操作:

      因为该篇文章会涉及到MySQL数据库的操作,所以前提我们需要有一点的CRUD的基础。这里就不做详细的讲解了,可以参考之前写的一篇文章,ASP.NET Core MVC+Layui使用EF Core连接MySQL执行简单的CRUD操作:

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

    三、使用NPOI获取Excel数据注意点:

    1、关于Excel的版本问题:

    做过Excel相关工作的人应该都清楚Office Excel的格式有两种:

    a、一种是.XLS是03版的Office Excel,无法打开高版本的。

    b、一种是.XLSX是07版(或者07以上的)的Office Excel,可以打开低版本的。

    所以我们在使用NPOI导入数据时不同格式获取Excel工作簿对象也有所不同,如下代码所示:

                    //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
    

    2、NPOI获取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

    四、通用的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详解:

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

    .NET Core使用NPOI导出复杂Word详解:

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

    .NET Core使用NPOI将Excel中的数据批量导入到MySQL:

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

    ASP.NET Core MVC+Layui使用EF Core连接MySQL执行简单的CRUD操作:

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

  • 相关阅读:
    NHibernate 转载
    net中Json对单引号和特殊字符串的处理
    C#过滤非法字符
    Linq Distinct 扩展
    (转)Windows启动过程分析预引导
    special content filetypes require specialized software to use
    存储器
    (转)MAPISendMail调用系统默认的邮件客户端发邮件
    FrameControllerModel
    (转)c++的四种类型转换
  • 原文地址:https://www.cnblogs.com/Can-daydayup/p/12593165.html
Copyright © 2011-2022 走看看