多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);
}
}

来自:tanyongzheng

Reference

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

ASP.NET 开源导入导出库Magicodes.IE 多Sheet导入教程的更多相关文章

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

    原文作者:tanyongzheng 多Sheet导入教程 说明 本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入. 要点 多个相同格式的Sheet数据导 ...

  2. ASP.NET 开源导入导出库Magicodes.IE 完成Csv导入导出

    Magicodes.IE Csv导入导出 说明 本章主要说明如何使用Magicodes.IE.Csv进行Csv导入导出. 主要步骤 1.安装包Magicodes.IE.Csv Install-Pack ...

  3. ASP.NET 开源导入导出库Magicodes.IE 完成Excel图片导入导出

    Magicodes.IE Excel图片导入导出 为了更好的根据实际功能来迭代,从2.2的里程碑规划开始,我们将结合社区的建议和意见来进行迭代,您可以点此链接来提交您的意见和建议: https://g ...

  4. ASP.NET 开源导入导出库Magicodes.IE 导出Pdf教程

    基础教程之导出Pdf收据 说明 本教程主要说明如何使用Magicodes.IE.Pdf完成Pdf收据导出 要点 导出PDF数据 自定义PDF模板 导出单据 如何批量导出单据 导出特性 PdfExpor ...

  5. .NET 开源导入导出库 Magicodes.IE 2.5发布

    今天我们发布了2.5版本,这当然也离不开大家对Magicodes.IE的支持,今天我也是跟往常一样列举了该版本一些重要的更新内容. 当然也要说一下,在这个版本中我们设计了全新的LOGO Excel导出 ...

  6. 开源导入导出库Magicodes.IE 导出教程

    要点 导出特性 如何导出Excel表头 如何导出数据.如何进行数据的切割.如何使用筛选器 导出特性 ExporterAttribute Name: 名称(当前Sheet 名称) HeaderFontS ...

  7. .NET Core开源导入导出库 Magicodes.IE 2.3发布

    在2.3这一版本的更新中,我们迎来了众多的使用者.贡献者,在这个里程碑中我们也添加并修复了一些功能.对于新特点的功能我将在下面进行详细的描述,当然也欢迎更多的人可以加入进来,再或者也很期待大家来提is ...

  8. Magicodes.IE 2.3重磅发布——.NET Core开源导入导出库

    在2.3这一版本的更新中,我们迎来了众多的使用者.贡献者,在这个里程碑中我们也添加并修复了一些功能.对于新特点的功能我将在下面进行详细的描述,当然也欢迎更多的人可以加入进来,再或者也很期待大家来提is ...

  9. Spring MVC 实现Excel的导入导出功能(1:Excel的导入)

    简介 这篇文章主要记录自己学习上传和导出Excel时的一些心得,企业办公系统的开发中,经常会收到这样的需求:批量录入数据.数据报表使用 Excel 打开,或者职能部门同事要打印 Excel 文件,而他 ...

随机推荐

  1. Java实现 洛谷 P6183 [USACO10MAR]The Rock Game S(DFS)

    P6183 [USACO10MAR]The Rock Game S 输入输出样例 输入 3 输出 OOO OXO OXX OOX XOX XXX XXO XOO OOO PS: 因为每一位只有两种可能 ...

  2. Java实现十六进制转十进制

    基础练习 十六进制转十进制 时间限制:1.0s 内存限制:512.0MB 提交此题 锦囊1 锦囊2 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进 ...

  3. Java实现 蓝桥杯 历届试题 斐波那契

    试题 历届试题 斐波那契 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 - (x=1,2) f(x) = f(x-1) ...

  4. Java实现 LeetCode 449 序列化和反序列化二叉搜索树

    449. 序列化和反序列化二叉搜索树 序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建. 设计一个算法 ...

  5. java 实现 蓝桥杯 算法提高 排列数

    问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入一个数n 求0~9十个数的全排列中的第n个(第1个为0123456789). 输入 ...

  6. Python学习之求阶乘篇

    描述 给定一个数n,范围为0≤n≤100,请你编程精确的求出n的阶乘n!. 输入 输入数据有多行,每行一个整数n,当n<0时输入结束. 输出 输出n的阶乘. 样例输入 1234-1 样例输出 1 ...

  7. 学习ASP.NET Core(10)-全局日志与xUnit系统测试

    上一篇我们介绍了数据塑形,HATEOAS和内容协商,并在制器方法中完成了对应功能的添加:本章我们将介绍日志和测试相关的概念,并添加对应的功能 一.全局日志 在第一章介绍项目结构时,有提到.NET Co ...

  8. 如何向这些CA来申请数字证书呢?

    申请的过程大致是: 1.自己本地先生成一对密匙,然后拿着自己的公匙以及其他信息(比如说企业名称啊什么的)去CA申请数字证书. 2.CA在拿到这些信息后,会选择一种单向Hash算法(比如说常见的MD5) ...

  9. Lavarel 执行:php artisan migrate时报错

    错误如下: 执行:php artisan migrate时报错: [PDOException]SQLSTATE[HY000] [2002] Connection refused 解决办法: 第一步:. ...

  10. Redis Desktop Manager无法连接虚拟机中启动的redis服务问题排查步骤

    Redis Desktop Manager下载地址 https://redisdesktop.com/download 安装好以后连接linux服务器上的Redis服务器错误: 问题排查: 1.检查R ...