ASP.NET 开源导入导出库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,主要注意事项如下:
- Excel的Dto类上面不用导入相关的加特性。
- 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);
}
}
来自:tanyongzheng
Reference
https://github.com/dotnetcore/Magicodes.IE
ASP.NET 开源导入导出库Magicodes.IE 多Sheet导入教程的更多相关文章
- 开源导入导出库Magicodes.IE 多sheet导入教程
原文作者:tanyongzheng 多Sheet导入教程 说明 本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入. 要点 多个相同格式的Sheet数据导 ...
- ASP.NET 开源导入导出库Magicodes.IE 完成Csv导入导出
Magicodes.IE Csv导入导出 说明 本章主要说明如何使用Magicodes.IE.Csv进行Csv导入导出. 主要步骤 1.安装包Magicodes.IE.Csv Install-Pack ...
- ASP.NET 开源导入导出库Magicodes.IE 完成Excel图片导入导出
Magicodes.IE Excel图片导入导出 为了更好的根据实际功能来迭代,从2.2的里程碑规划开始,我们将结合社区的建议和意见来进行迭代,您可以点此链接来提交您的意见和建议: https://g ...
- ASP.NET 开源导入导出库Magicodes.IE 导出Pdf教程
基础教程之导出Pdf收据 说明 本教程主要说明如何使用Magicodes.IE.Pdf完成Pdf收据导出 要点 导出PDF数据 自定义PDF模板 导出单据 如何批量导出单据 导出特性 PdfExpor ...
- .NET 开源导入导出库 Magicodes.IE 2.5发布
今天我们发布了2.5版本,这当然也离不开大家对Magicodes.IE的支持,今天我也是跟往常一样列举了该版本一些重要的更新内容. 当然也要说一下,在这个版本中我们设计了全新的LOGO Excel导出 ...
- 开源导入导出库Magicodes.IE 导出教程
要点 导出特性 如何导出Excel表头 如何导出数据.如何进行数据的切割.如何使用筛选器 导出特性 ExporterAttribute Name: 名称(当前Sheet 名称) HeaderFontS ...
- .NET Core开源导入导出库 Magicodes.IE 2.3发布
在2.3这一版本的更新中,我们迎来了众多的使用者.贡献者,在这个里程碑中我们也添加并修复了一些功能.对于新特点的功能我将在下面进行详细的描述,当然也欢迎更多的人可以加入进来,再或者也很期待大家来提is ...
- Magicodes.IE 2.3重磅发布——.NET Core开源导入导出库
在2.3这一版本的更新中,我们迎来了众多的使用者.贡献者,在这个里程碑中我们也添加并修复了一些功能.对于新特点的功能我将在下面进行详细的描述,当然也欢迎更多的人可以加入进来,再或者也很期待大家来提is ...
- Spring MVC 实现Excel的导入导出功能(1:Excel的导入)
简介 这篇文章主要记录自己学习上传和导出Excel时的一些心得,企业办公系统的开发中,经常会收到这样的需求:批量录入数据.数据报表使用 Excel 打开,或者职能部门同事要打印 Excel 文件,而他 ...
随机推荐
- Java实现 LeetCode 593 有效的正方形(判断正方形)
593. 有效的正方形 给定二维空间中四点的坐标,返回四点是否可以构造一个正方形. 一个点的坐标(x,y)由一个有两个整数的整数数组表示. 示例: 输入: p1 = [0,0], p2 = [1,1] ...
- Java实现 LeetCode 241 为运算表达式设计优先级
241. 为运算表达式设计优先级 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 +, - 以及 * . 示例 ...
- java实现古堡算式
** 古堡算式** 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA 他对华生说:"ABCDE应该代表不同的数字,问号也代表某个数字!" 华生 ...
- K8S-PV和PVC的实践
一.什么是PV和PVC? PV的全称是Persistent Volume,翻译过来为持久化存储卷,是对底层的共享存储的一种抽象,PV由管理员进行创建和配置,主要含存储能力.访问模式.存储类型.回收策略 ...
- 数据结构与算法-python描述-双向链表
# coding:utf-8 # 双向链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历链表 # add(item) 链表头部添加 # ...
- HDU - 2639 Bone Collector II 题解
题目大意 一个人收藏骨头,有 n 个骨头,每个骨头有体积和价值,问能够装在容量为 V 的背包中,能获得的第 k 大(去重后)价值是多少. 样例 样例输入 1 5 10 2 1 2 3 4 5 5 4 ...
- 树莓派学习--安装GPIO Zero
GPIO ZERO 在Raspbian的映像内默认安装,对于其他系统 先更新存储库列表: sudo apt update 对于python3: sudo apt install python3-gpi ...
- mac 排查被占端口
Last login: Wed Sep :: on ttys000 sam:~ sam$ sudo lsof -i : Password: COMMAND PID USER FD TYPE DEVIC ...
- 别人开发三年30k,而我才12K,看完他面试前狂刷的面试题,我惊了
朋友做Java开发三年多的时间了,在老东家勤勤恳恳工作了三年多,工资也就是从刚开始的8K涨到了12K,天天给我吐槽他的工资低.2019年中下旬开始就一直在各种地方找资源,刷面试题,想要“骑驴找马”,所 ...
- (五)pom文件详解
<?xml version="1.0" encoding="UTF-8"?> <!--是所有pom.xml的根元素,并且在里面定义了命名空间和 ...