开源导入导出库Magicodes.IE 多sheet导入教程

多Sheet导入教程说明

本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入。

要点

  • 多个相同格式的Sheet数据导入

  • 多个不同格式的Sheet数据导入

主要步骤

1. 多个相同格式的Sheet数据导入

1.1 创建导入Sheet的Dto

主要代码如下所示:

  • 学生数据Dto

 /// <summary>/// 导入学生数据Dto/// IsLabelingError:是否标注数据错误/// </summary>
[ExcelImporter(IsLabelingError = true)]public class ImportStudentDto
{/// <summary>///     序号/// </summary>[ImporterHeader(Name = "序号")]public long SerialNumber { get; set; }/// <summary>///     学籍号/// </summary>[ImporterHeader(Name = "学籍号", IsAllowRepeat = false)][MaxLength(30, ErrorMessage = "学籍号字数超出最大限制,请修改!")]public string StudentCode { get; set; }/// <summary>///     姓名/// </summary>[ImporterHeader(Name = "姓名")][Required(ErrorMessage = "学生姓名不能为空")][MaxLength(50, ErrorMessage = "名称字数超出最大限制,请修改!")]public string Name { get; set; }/// <summary>///     身份证号码/// </summary>[ImporterHeader(Name = "身份证号", IsAllowRepeat = false)][Required(ErrorMessage = "身份证号不能为空")][MaxLength(18, ErrorMessage = "身份证字数超出最大限制,请修改!")]public string IdCard { get; set; }/// <summary>///     性别/// </summary>[ImporterHeader(Name = "性别")][Required(ErrorMessage = "性别不能为空")][ValueMapping("男", 0)][ValueMapping("女", 1)]public Genders Gender { get; set; }/// <summary>///     家庭地址/// </summary>[ImporterHeader(Name = "家庭住址")][Required(ErrorMessage = "家庭地址不能为空")][MaxLength(200, ErrorMessage = "家庭地址字数超出最大限制,请修改!")]public string Address { get; set; }/// <summary>///     家长姓名/// </summary>[ImporterHeader(Name = "家长姓名")][Required(ErrorMessage = "家长姓名不能为空")][MaxLength(50, ErrorMessage = "家长姓名数超出最大限制,请修改!")]public string Guardian { get; set; }/// <summary>///     家长联系电话/// </summary>[ImporterHeader(Name = "家长联系电话")][MaxLength(20, ErrorMessage = "家长联系电话字数超出最大限制,请修改!")]public string GuardianPhone { get; set; }/// <summary>///     学号/// </summary>[ImporterHeader(Name = "学号")][MaxLength(30, ErrorMessage = "学号字数超出最大限制,请修改!")]public string StudentNub { get; set; }/// <summary>///     宿舍号/// </summary>[ImporterHeader(Name = "宿舍号")][MaxLength(20, ErrorMessage = "宿舍号字数超出最大限制,请修改!")]public string DormitoryNo { get; set; }/// <summary>///     QQ/// </summary>[ImporterHeader(Name = "QQ号")][MaxLength(30, ErrorMessage = "QQ号字数超出最大限制,请修改!")]public string QQ { get; set; }/// <summary>///     民族/// </summary>[ImporterHeader(Name = "民族")][MaxLength(2, ErrorMessage = "民族字数超出最大限制,请修改!")]public string Nation { get; set; }/// <summary>///     户口性质/// </summary>[ImporterHeader(Name = "户口性质")][MaxLength(10, ErrorMessage = "户口性质字数超出最大限制,请修改!")]public string HouseholdType { get; set; }/// <summary>///     联系电话/// </summary>[ImporterHeader(Name = "学生联系电话")][MaxLength(20, ErrorMessage = "手机号码字数超出最大限制,请修改!")]public string Phone { get; set; }/// <summary>///     状态///     测试可为空的枚举类型/// </summary>[ImporterHeader(Name = "状态")]public StudentStatus? Status { get; set; }/// <summary>///     备注/// </summary>[ImporterHeader(Name = "备注")][MaxLength(200, ErrorMessage = "备注字数超出最大限制,请修改!")]public string Remark { get; set; }/// <summary>///     是否住校(宿舍)/// </summary>[ImporterHeader(IsIgnore = true)]public bool? IsBoarding { get; set; }/// <summary>///     所属班级id/// </summary>[ImporterHeader(IsIgnore = true)]public Guid ClassId { get; set; }/// <summary>///     学校Id/// </summary>[ImporterHeader(IsIgnore = true)]public Guid? SchoolId { get; set; }/// <summary>///     校区Id/// </summary>[ImporterHeader(IsIgnore = true)]public Guid? CampusId { get; set; }/// <summary>///     专业Id/// </summary>[ImporterHeader(IsIgnore = true)]public Guid? MajorsId { get; set; }/// <summary>///     年级Id/// </summary>[ImporterHeader(IsIgnore = true)]public Guid? GradeId { get; set; }
}

1.2 创建导Excel入Dto

主要代码如下所示:

  • 学生数据Dto

 public class ImportClassStudentDto
{[ExcelImporter(SheetName = "1班导入数据")]public ImportStudentDto Class1Students { get; set; }[ExcelImporter(SheetName = "2班导入数据")]public ImportStudentDto Class2Students { get; set; }}

如上述代码所示,我们定义了班级学生数据Dto,主要注意事项如下:

  1. Excel的Dto类上面不用导入相关的加特性。

  2. Excel的Dto类里面的属性未Sheet的Dto类型,ExcelImporter特性离的SheetName参数来设置具体某一个Sheet名。

1.3 Excel模板

注意:Excel里的多个Sheet列名必须一致(对应同一个Sheet的Dto类型)

模板目录:src\Magicodes.ExporterAndImporter.Tests\TestFiles\Import\班级学生基础数据导入.xlsx

第一个Sheet:

第二个Sheet:

1.4 导入代码

IExcelImporter Importer = new ExcelImporter();var filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Import", "班级学生基础数据导入.xlsx");//获取到的导入结果为一个字典类型,Key为Sheet名,Value为Sheet对应的数据
var importDic = await Importer.ImportSameSheets<ImportClassStudentDto, ImportStudentDto>(filePath);//遍历字典,获取每个Sheet的数据
foreach (var item in importDic)
{var import = item.Value;//导入的Sheet数据var studentList = import.Data.ToList();
}

2. 多个不同格式的Sheet数据导入

2.1 创建导入Sheet的Dto

主要代码如下所示:

  • 学生数据Dto同上

  • 缴费日志数据Dto :

/// <summary>///     缴费日志导入Dto/// </summary>/// <autogeneratedoc />
[ExcelImporter(IsLabelingError = true)]public class ImportPaymentLogDto
{/// <summary>///     学生姓名/// </summary>[ImporterHeader(Name = "学生姓名")][Required(ErrorMessage = "学生姓名为必填项")][MaxLength(30, ErrorMessage = "学生姓名不能超过15位")]public string Name { get; set; }/// <summary>///     身份证号码/// </summary>[ImporterHeader(Name = "身份证号码")][Required(ErrorMessage = "身份证号码为必填项")][MaxLength(18, ErrorMessage = "身份证号码不能超过18位")][MinLength(18, ErrorMessage = "身份证号码不能小于18位")]public string IdCard { get; set; }/// <summary>///     缴费类型/// </summary>[ImporterHeader(Name = "缴费类型")][Required(ErrorMessage = "缴费类型为必填项")]public string CostType { get; set; }/// <summary>///     金额/// </summary>[ImporterHeader(Name = "金额")][Range(0.01, 1000000, ErrorMessage = "收费金额区间为1~100万")][Required(ErrorMessage = "金额为必填项")]public decimal Amount { get; set; }/// <summary>///     缴费日期/// </summary>[ImporterHeader(Name = "缴费日期")][MaxLength(8, ErrorMessage = "缴费日期不能超过8位")][RegularExpression("\\d{6,8}", ErrorMessage = "缴费日期只能输入6到8位数字例如201908/20190815")]public string PayDate { get; set; }/// <summary>///     收据编号///     多个使用逗号分隔,仅线下收据/// </summary>[ImporterHeader(Name = "收据编号")][MaxLength(200, ErrorMessage = "收据编号不能超过200位")]public string ReceiptCodes { get; set; }/// <summary>///     备注/// </summary>[ImporterHeader(Name = "备注")][MaxLength(500, ErrorMessage = "备注不能超过500位")]public string Remarks { get; set; }/// <summary>///     创建时间/// </summary>[ImporterHeader(IsIgnore = true)]public DateTime? CreationTime { get; set; }/// <summary>///     收费项目id/// </summary>[ImporterHeader(IsIgnore = true)]public int? ChargeProjectId { get; set; }/// <summary>///     班级Id/// </summary>[ImporterHeader(IsIgnore = true)]public Guid? ClassId { get; set; }/// <summary>///     班级名称/// </summary>[ImporterHeader(IsIgnore = true)]public string ClassName { get; set; }/// <summary>///     年级Id/// </summary>[ImporterHeader(IsIgnore = true)]public Guid? GradeId { get; set; }/// <summary>///     年级信息/// </summary>[ImporterHeader(IsIgnore = true)]public string GradeName { get; set; }/// <summary>///     专业Id/// </summary>[ImporterHeader(IsIgnore = true)]public Guid? MajorId { get; set; }/// <summary>///     专业信息/// </summary>[ImporterHeader(IsIgnore = true)]public string MajorName { get; set; }/// <summary>///     校区Id/// </summary>[ImporterHeader(IsIgnore = true)]public Guid? CampusId { get; set; }/// <summary>///     校区名称/// </summary>[ImporterHeader(IsIgnore = true)]public string CampusName { get; set; }/// <summary>///     学校Id/// </summary>[ImporterHeader(IsIgnore = true)]public Guid? SchoolId { get; set; }/// <summary>///     学校信息/// </summary>[ImporterHeader(IsIgnore = true)]public string SchoolName { get; set; }
}  

2.2 创建导Excel入Dto

主要代码如下所示:

  • 班级学生基础数据及缴费流水数据Dto

 public  class ImportStudentAndPaymentLogDto
{[ExcelImporter(SheetName = "1班导入数据")]public ImportStudentDto Class1Students { get; set; }[ExcelImporter(SheetName = "缴费数据")]public ImportPaymentLogDto Class2Students { get; set; }
}

2.3 Excel模板

模板目录:src\Magicodes.ExporterAndImporter.Tests\TestFiles\Import\学生基础数据及缴费流水号导入.xlsx

学生基础数据Sheet:

缴费流水号Sheet:

2.4 导入代码

IExcelImporter Importer = new ExcelImporter();var filePath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Import", "学生基础数据及缴费流水号导入.xlsx");//获取到的导入结果为一个字典类型,Key为Sheet名,Value为Sheet对应的数据
var importDic = await Importer.ImportMultipleSheet<ImportStudentAndPaymentLogDto>(filePath);//遍历字典,获取每个Sheet的数据
foreach (var item in importDic)
{var import = item.Value;//导入的Sheet数据,if (item.Key == "1班导入数据"){//多个不同类型的Sheet返回的值为object,需要进行类型转换ImportStudentDto dto = (ImportStudentDto) import.Data.ElementAt(0);}if (item.Key == "缴费数据"){ImportPaymentLogDto dto = (ImportPaymentLogDto)import.Data.ElementAt(0);}
}

Reference

https://github.com/dotnetcore/Magicodes.IE

转载是一种动力 分享是一种美德

如果喜欢作者的文章,请关注【麦扣聊技术】订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文作者:tanyongzheng

文档官网:docs.xin-lai.com

QQ群:

编程交流群<85318032> 

产品交流群<897857351>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 Azure AD 在 Azure Front Door 下登录失败的问题

点击上方关注“汪宇杰博客” ^_^导语最近我给博客系统加上了 Azure Front Door&#xff0c;集齐了12项 Azure 服务打算召唤神龙。没想到刚上线&#xff0c;Azure AD 的单点登录就爆了。OIDC 跳转错误当我尝试登录博客后台的时候&#xff0c;OIDC的跳转URL突然变成了 https://ed…

《Unit Testing》2.1 经典学派如何做测试隔离

经典学派如何解决隔离问题首先&#xff0c;再回顾一下单元测试的三个重要特性&#xff1a;验证一小段代码&#xff08;或者叫一个单元&#xff09;执行速度快使用隔离的方式进行针对第一个特性就会引出一个问题&#xff1a;多小的一段代码才足够小&#xff1f;如果你采用针对每…

Hacker News热文:请停止学习框架,学习领域驱动设计(DDD)(获500个点赞)

在 Hacker News 上获得接近 500 个点赞的一篇名为《停止学习框架》的文章称&#xff1a;我们是程序员&#xff0c;每天都在了解最新的技术&#xff0c;每天都在学习编程语言、框架和库&#xff0c;因为我们知道的现代编程工具越多越好&#xff0c;对吧&#xff1f;不停地追随 A…

C#跨平台开源项目实战(WPF/Android/IOS/Blazor)

个人介绍由于本人从业WPF开发, 考虑到国内的WPF开发环境并不是很好, 资源少、项目案例少, 所以导致很多初学者就已经断了念头。所以我作为WPF的从业者, 就在2019年,开始了发布自己的WPF相关的免费教学视频。发布开源的项目实践, WPF的基础视频、项目实践视频, 包括WPF UI设计视…

[开源] .Net 使用 ORM 访问 神舟通用数据库(神通)

前言天津神舟通用数据技术有限公司&#xff08;简称“神舟通用公司”&#xff09;&#xff0c;隶属于中国航天科技集团&#xff08;CASC&#xff09;。是国内从事数据库、大数据解决方案和数据挖掘分析产品研发的专业公司。公司获得了国家核高基科技重大专项重点支持&#xff0…

在 Xunit 中使用依赖注入

在 Xunit 中使用依赖注入Intro之前写过一篇 xunit 的依赖注入相关的文章&#xff0c;但是实际使用起来不是那么方便今天介绍一个基于xunit和微软依赖注入框架的“真正”的依赖注入使用方式 ——— Xunit.DependencyInjection, 来自大师的作品&#xff0c;让你在测试代码里使用依…

C#由转换二进制所引起的思考,了解下?

【导读】最近遇到很有意思转换二进制的问题&#xff0c;有部分童鞋俨然已了解&#xff0c;可能也有一部分童鞋没碰到过也就不知情&#xff0c;这里我们来深入学习下转换二进制所带来的问题。在写此篇文章时&#xff0c;非常开心&#xff0c;收到再一次连任MVP的邮件&#xff0c…

.Net Core In Docker 在容器内编译并发布

Docker可以说是现在微服务&#xff0c;DevOps的基础&#xff0c;咱们.Net Core自然也得上Docker。.Net Core发布到Docker容器的教程网上也有不少&#xff0c;但是今天还是想来写一写。你搜.Net core程序发布到Docker网上一般常见的有两种方案&#xff1a;1、在本地编译成Dll文件…

带你深入探究云原生时代的分布式操作系统 Kubernetes

过去几年&#xff0c;以 docker、kubernetes 为代表的容器技术已发展为一项通用技术&#xff0c;BAT、滴滴、京东、头条等大厂&#xff0c;都争相把容器和 k8s 项目作为技术重心&#xff0c;试图“放长线钓大鱼”。就说腾讯吧&#xff0c;目前基本所有业务都跑在云上&#xff0…

C# 9.0 新特性之 Lambda 弃元参数

阅读本文大概需要不到 1 分钟。弃元&#xff08;Discards&#xff09; 是在 C# 7.0 的时候开始支持的&#xff0c;它是一种人为丢弃不使用的临时虚拟变量。语法上它是用来赋值的&#xff0c;但它却不被分配存储空间&#xff0c;即没有值&#xff0c;所以不能从中读取值。弃元用…

应用交付老兵眼中的Envoy, 云原生时代下的思考

Envoy 是云原生时代的明星&#xff0c;其本质是反向代理负载均衡类软件&#xff0c;领域上归于应用交付&#xff0c;那么作为应用交付领域的老兵如何看待 Envoy&#xff0c;Envoy 又引发了哪些关于传统应用交付领域的思考&#xff1f;关于作者林静&#xff0c;F5 软件方向解决方…

asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!

背景最近一段时间&#xff0c;陆陆续续的把手里头项目都迁移到了k8s中&#xff0c;期间遇到很多的坑&#xff0c;并且也学到了许多k8s的知识&#xff08;从0-1&#xff09;&#xff0c;大家都知道k8s中的一大特性是自动扩容&#xff0c;对此结合自己的业务发现很是有“用武之地…

如何优雅做系统错误提示?

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「149」篇原创敬上大家好&#xff0c;我是Z哥。不管是日常的工作中还是生活中&#xff0c;我们每天会用到很多软件系统。不知道你有没有过这样的感受&#xff0c;当…

搭建一套ASP.NET Core+Nacos+Spring Cloud Gateway项目

前言伴随着随着微服务概念的不断盛行&#xff0c;与之对应的各种解决方案也层出不穷。这毕竟是一个信息大爆发的时代&#xff0c;各种编程语言大行其道&#xff0c;各有各的优势。但是有一点未曾改变&#xff0c;那就是他们服务的方式&#xff0c;工作的时候各司其职&#xff0…

如何在ASP.NET Core中集成ElasticSearch

本文来自&#xff1a;https://www.blexin.com/en-US/Article/Blog/How-to-integrate-ElasticSearch-in-ASPNET-Core-70图片我敢打赌&#xff0c;您肯定会被要求向Web应用程序中添加高级搜索功能&#xff0c;而且通常是全文的类似Google的搜索。在技术电子商务的开发过程中&…

了解下C#由转换二进制所引起的思考

【导读】最近遇到很有意思转换二进制的问题&#xff0c;有部分童鞋俨然已了解&#xff0c;可能也有一部分童鞋没碰到过也就不知情&#xff0c;这里我们来深入学习下转换二进制所带来的问题。在写此篇文章时&#xff0c;非常开心&#xff0c;收到再一次连任MVP的邮件&#xff0c…

如何利用.NETCore向Azure EventHubs准实时批量发送数据?

最近在做一个基于Azure云的物联网分析项目&#xff1a;.netcore采集程序向Azure事件中心(EventHubs)发送数据&#xff0c;通过Azure EventHubs Capture转储到Azure BlogStorage&#xff0c;供数据科学团队分析。为什么使用Azure事件中心&#xff1f;Azure事件中心是一种Azure上…

C++实现二叉树

代码如下: #include<iostream> #include <queue> #include <stack> using namespace std;class BinTree { private:class TreeNode{public:int data;TreeNode *left;TreeNode *right;TreeNode ():data(0),left(nullptr),right(nullptr){}TreeNode(int e):da…

MySql :Could not create connection to database server.

错误&#xff1a; Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException:Error querying database. Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. The error …

Vue 3拖更,尤雨溪介绍最新进展

Vue.js 作者尤雨溪近日介绍了 Vue 3 的最新进展。尤雨溪表示&#xff0c;由于在 Vue 3 上花费的大部分时间都投入到了设计和构建稳定的内核上&#xff0c;不过要让整个框架处于"ready"状态&#xff0c;不仅仅是内核的问题&#xff0c;还需要有兼容版本的支持库 &…