21

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

 3 years ago
source link: http://www.cnblogs.com/Can-daydayup/p/12593165.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言:

在之前的几篇博客中写过.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 )。

项目实现效果图:

EBNfUj.gif!mobile

一、引入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包管理器=>程序包管理器控制台:

IBFnyei.png!mobile

搜索:NPOI进行安装:

aeMf6b7.png!mobile

二、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,无法打开高版本的。

a、一种是.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操作:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK