.NET Core使用NPOI將Excel中的數據批量導入到MySQL
- 2020 年 9 月 11 日
- 筆記
- 【.NET Core】, 【ASP.NET Core】, 【EF Core】, 【MySQL】, 【Npoi】
前言:
在之前的幾篇博客中寫過.NET Core使用NPOI導出Word和Excel的文章,今天把同樣我們日常開發中比較常用的使用Excel導入數據到MySQL數據庫中的文章給安排上。與此同時還把NPOI-ExportWordAndExcel-ImportExcelData這個開源項目升級到了.NET Core 3.1版本(注意之前一直是在.NET Core2.2的基礎上開發的),升級的過程中遇到了不少坑,在項目中會有一些注釋關於升級到.NET Core3.1需要修改的代碼這裡就不做詳細的講解了可以Clone項目,或者是直接查看官方文檔.NET Core相關版本的遷移指南(//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,無法打開高版本的。
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完整實例地址:
//github.com/YSGStudyHards/NPOI-ExportWordAndExcel-ImportExcelData