前言:
在之前的几篇博客中写过.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源码地址:
版本说明:
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操作:
三、使用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日*/
usingSystem;usingSystem.Data;usingSystem.IO;usingNPOI.HSSF.UserModel;usingNPOI.SS.UserModel;usingNPOI.XSSF.UserModel;namespaceYY_Utility
{public classNpoiExcelImportHelper
{private staticNpoiExcelImportHelper _excelImportHelper;public staticNpoiExcelImportHelper _
{get => _excelImportHelper ?? (_excelImportHelper = newNpoiExcelImportHelper());set => _excelImportHelper =value;
}///
///读取excel表格中的数据,将Excel文件流转化为dataTable数据源///默认第一行为标题///
/// excel文档文件流
/// 文档格式
/// 是否转化成功
/// 转换结果消息
///
public DataTable ExcelToDataTable(Stream stream, string fileType, out bool isSuccess, out stringresultMsg)
{
isSuccess= false;
resultMsg= "Excel文件流成功转化为DataTable数据源";var excelToDataTable = newDataTable();try{//Workbook对象代表一个工作簿,首先定义一个Excel工作薄
IWorkbook workbook;//XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式
#region 判断Excel版本
switch(fileType)
{//.XLSX是07版(或者07以上的)的Office Excel
case ".xlsx":
workbook= newXSSFWorkbook(stream);break;//.XLS是03版的Office Excel
case ".xls":
workbook= newHSSFWorkbook(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判断是否为时间日期类型
caseCellType.Numeric when DateUtil.IsCellDateFormatted(cell):
dataRow[j]=cell.DateCellValue;break;caseCellType.Numeric://其他数字类型
dataRow[j] =cell.NumericCellValue;break;//空数据类型
caseCellType.Blank:
dataRow[j]= "";break;//公式类型
caseCellType.Formula:
{
HSSFFormulaEvaluator eva= newHSSFFormulaEvaluator(workbook);
dataRow[j]=eva.Evaluate(cell).StringValue;break;
}//布尔类型
caseCellType.Boolean:
dataRow[j]=row.GetCell(j).BooleanCellValue;break;//错误
caseCellType.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;
}returnexcelToDataTable;
}
}
}
总结:
关于.NET Core 使用NPOI导入数据和导出Word,Excel数据的教程到这里就告一段落了,假如大家感兴趣的话或者对大家有帮助的话不要忘记了前往
相关实例链接地址:
GitHub完整实例地址:
.NET Core使用NPOI导出复杂,美观的Excel详解:
.NET Core使用NPOI导出复杂Word详解:
.NET Core使用NPOI将Excel中的数据批量导入到MySQL:
ASP.NET Core MVC+Layui使用EF Core连接MySQL执行简单的CRUD操作: