前言:
在之前的幾篇部落格中寫過.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://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLzUTOyYDM2EzNx0yM5QTOzMDMxATOwkDMwIDMy0SO5EjNzMTMvwVOwAjMwIzLclTOxYzMzEzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.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哦,謝謝。
相關執行個體連結位址:
GitHub完整執行個體位址:
https://github.com/YSGStudyHards/NPOI-ExportWordAndExcel-ImportExcelData
.NET Core使用NPOI導出複雜,美觀的Excel詳解:
https://www.cnblogs.com/Can-daydayup/p/12501400.html
.NET Core使用NPOI導出複雜Word詳解:
https://www.cnblogs.com/Can-daydayup/p/11588531.html
.NET Core使用NPOI将Excel中的資料批量導入到MySQL:
https://www.cnblogs.com/Can-daydayup/p/12593165.html
ASP.NET Core MVC+Layui使用EF Core連接配接MySQL執行簡單的CRUD操作:
作者:追逐時光者
作者簡介:一個熱愛程式設計,善于分享,喜歡學習、探索、嘗試新事物,新技術的程式猿。
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果該篇文章對您有幫助的話,可以點一下右下角的【♥推薦♥】,希望能夠持續的為大家帶來好的技術文章,文中可能存在描述不正确或錯誤的地方,歡迎指正、補充,不勝感激 !