在以前的几篇博客中写过.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
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
由于该篇文章会涉及到MySQL数据库的操做,因此前提咱们须要有一点的CRUD的基础。这里就不作详细的讲解了,能够参考以前写的一篇文章,ASP.NET Core MVC+Layui使用EF Core链接MySQL执行简单的CRUD操做:数据库
作过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
注意,我们填写在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
/** * 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哦,谢谢。
https://github.com/YSGStudyHards/NPOI-ExportWordAndExcel-ImportExcelData