在以前的幾篇博客中寫過.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