.NET Core使用NPOI将Excel中的数据批量导入到MySQL

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: .NET Core使用NPOI将Excel中的数据批量导入到MySQL

前言:

  在之前的几篇博客中写过.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://img2020.cnblogs.com/blog/1336199/202009/1336199-20200909010339493-1716062953.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包管理器=>程序包管理器控制台:

1336199-20200316010608628-1137886985.png

搜索:NPOI进行安装:

1336199-20200316010732879-614926042.png

二、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哦,谢谢。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
2月前
|
关系型数据库 MySQL Java
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
|
9月前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
200 5
|
5月前
|
网络协议 定位技术 网络安全
IPIP.NET-IP地理位置数据
IPIP.NET 是一家专注于 IP 地理位置数据的提供商,基于 BGP/ASN 数据与全球 800+ 网络监测点技术,提供高精度的 IPv4 和 IPv6 定位服务。其核心服务包括地理位置查询、详细地理信息和网络工具等,广泛应用于网络安全、广告营销、CDN 优化等领域。数据覆盖全球,支持多语言,每日更新确保实时性。IPIP.NET 提供 API 接口、离线数据库及多种语言 SDK,方便开发者集成使用。
686 0
|
9月前
|
关系型数据库 MySQL Linux
Linux下mysql数据库的导入与导出以及查看端口
本文详细介绍了在Linux下如何导入和导出MySQL数据库,以及查看MySQL运行端口的方法。通过这些操作,用户可以轻松进行数据库的备份与恢复,以及确认MySQL服务的运行状态和端口。掌握这些技能,对于日常数据库管理和维护非常重要。
342 8
|
10月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
166 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
9月前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
167 1
|
9月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
9月前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
208 3
|
11月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
182 2
|
3月前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
550 1

推荐镜像

更多