隐藏

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

发布:2023/3/24 22:09:08作者:管理员 来源:本站 浏览次数:444

前言:

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

项目实现效果图:

https://img2020.cnblogs.com/blog/1336199/202009/1336199-20200909010339493-1716062953.gif

一、引入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哦,谢谢。