简介

作为一个dotnet开发者,经常面对业务系统中大量报表导入导出,经常写了一堆的重复代码。最近发现一个操作excel的神器:ExcelToObject.NPOI,两行代码就能导出一个报表,两行代码就能读取excel数据。就像作者说的:让操作excel变成了操作对象。下面让我们来看看这个组件

项目地址:

https://gitee.com/fengwuyan/ExcelToObject

项目示例

  1. 在项目中引入 ExcelToObject.NPOI
  1. dotnet add package ExcelToObject.Npoi --version 1.0.0
  1. 在Program或Startup类中添加服务
  1. service.AddExcelToObjectNpoiService();
  1. 以下以一个业务来举例,一个导入业务需要同时导入两个数据源,我们先把Excel模板定义好。

    • 第一个Sheet页:导入基本信息

    • 第二个Sheet页:导入字典配置信息列表

  2. 以下为导入两个数据sheet的代码

    • 构造函数注入IExcelFactory 对象
    • 使用ReadByNameManagerReadListByNameManager 方法分别读取单个对象和读取list列表
  1. private readonly IExcelFactory _excelFactory;
  2. public FileAppService(IExcelFactory excelFactory)
  3. {
  4. _excelFactory = excelFactory;
  5. }
  6. public Task ImportAsync(Stream fileStream)
  7. {
  8. using var excelService = _excelFactory.Create(fileStream);
  9. var userImportInput = excelService.ReadByNameManager<UserImportExportDto>("基本信息");
  10. var settingImportInputList = excelService.ReadListByNameManager<SettingImportExportDto>("字典配置");
  11. Console.WriteLine($"姓名:{userImportInput.Name}、年龄:{userImportInput.Age}");
  12. settingImportInputList.ForEach(e => Console.WriteLine($"类别名称:{e.CategoryName}、字典项名称:{e.ItemName}、字典项值:{e.Value}"));
  13. //写入到数据库
  14. }

详细操作

  1. 分别定义对应数据Sheet页的DTO

    • 人员信息dto
  1. /// <summary>
  2. /// 用户导入导出dto
  3. /// </summary>
  4. public class UserImportExportDto
  5. {
  6. /// <summary>
  7. /// 姓名
  8. /// </summary>
  9. public string Name { get; set; }
  10. /// <summary>
  11. /// 年龄
  12. /// </summary>
  13. public int Age { get; set; }
  14. /// <summary>
  15. /// 性别
  16. /// </summary>
  17. public string Gender { get; set; }
  18. /// <summary>
  19. /// 身份证号
  20. /// </summary>
  21. public string IDCard { get; set; }
  22. /// <summary>
  23. /// 毕业院校
  24. /// </summary>
  25. public string School { get; set; }
  26. /// <summary>
  27. /// 简介
  28. /// </summary>
  29. public string Profile { get; set; }
  30. }
  • 字典配置信息dto
  1. /// <summary>
  2. /// 字典配置
  3. /// </summary>
  4. public class SettingImportExportDto
  5. {
  6. /// <summary>
  7. /// 字典类别编码
  8. /// </summary>
  9. public string CategoryCode { get; set; }
  10. /// <summary>
  11. /// 字典类别名称
  12. /// </summary>
  13. public string CategoryName { get; set; }
  14. /// <summary>
  15. /// 字典项编码
  16. /// </summary>
  17. public string ItemCode { get; set; }
  18. /// <summary>
  19. /// 字典项名称
  20. /// </summary>
  21. public string ItemName { get; set; }
  22. /// <summary>
  23. /// 字典值
  24. /// </summary>
  25. public string Value { get; set; }
  26. /// <summary>
  27. /// 备注
  28. /// </summary>
  29. public string Remark { get; set; }
  30. }
  1. 设置Excel模板内每个Sheet的名称管理器,名称管理器的值与DTO的属性名称一致

    • 人员信息

  1. 最终每个对应的数据区都配置好了名称管理器之后的效果:

  • 字典配置信息

配置好之后,就可以了。总结就两步:

  1. 定义导入导出dto
  2. 配置excel模板的名称管理器

写入操作

写入操作也是一样的流程

  1. 建立对应DTO
  2. 配置excel模板
  3. 调用WriteByNameManagerWriteListByNameManager 方法写入数据到对应Sheet,调用Write 写入到excel文件。
  1. public async Task<string> ExportAsync()
  2. {
  3. var userDto = new UserImportExportDto();
  4. var settingDtoList = new List<SettingImportExportDto>();
  5. var excelTemplateFilePath = "";
  6. using var excelService = _excelFactory.Create(File.Open(excelTemplateFilePath, FileMode.Open, FileAccess.Read));
  7. excelService.WriteByNameManager(userDto, "基本信息");
  8. excelService.WriteListByNameManager(settingDtoList, "字典配置");
  9. var resultFileSavePath = "";
  10. excelService.Write(File.Open(resultFileSavePath, FileMode.OpenOrCreate, FileAccess.ReadWrite));
  11. return resultFileSavePath;
  12. }

总结

ExcelToObject.NPOI两行代码导出excel报表及读取数据,是通过每个sheet页内的名称管理器的值与对应代码中的类的属性名称相同,从而进行匹配,达到智能读取的功能

ExcelToObject.NPOI 两行代码导出Excel报表、读取Excel数据的更多相关文章

  1. C#操作Excel文件(读取Excel,写入Excel)

    看到论坛里面不断有人提问关于读取excel和导入excel的相关问题.闲暇时间将我所知道的对excel的操作加以总结,如今共享大家,希望给大家可以给大家带了一定的帮助.另外我们还要注意一些简单的问题1 ...

  2. NPOI 导入Excel和读取Excel

    1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...

  3. NPOI操作excel之读取excel数据

    NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.  一.下载引用 去NPOI官网http://npoi.codeplex. ...

  4. c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件

    1.引用Microsoft.Office.Interop.Excel.dll 2.引用命名空间.使用别名 using System.Reflection; using Excel = Microsof ...

  5. SpringBoot(十三)_springboot上传Excel并读取excel中的数据

    今天工作中,发现同事在整理数据,通过excel上传到数据库.所以现在写了篇利用springboot读取excel中的数据的demo.至于数据的进一步处理,大家肯定有不同的应用场景,自行修改 pom文件 ...

  6. jxl读写excel, poi读写excel,word, 读取Excel数据到MySQL

    这篇blog是介绍: 1. java中的poi技术读取Excel数据,然后保存到MySQL数据中. 2. jxl读写excel 你也可以在 : java的poi技术读取和导入Excel了解到写入Exc ...

  7. ThinkPHP3.2.3使用PHPExcel类操作excel导入读取excel

    方法一: 1. 下载PHPExcel并保存在如下位置: 2. 在控制器中引用 vendor("PHPExcel.PHPExcel"); $objReader = \PHPExcel ...

  8. POI导入excel时读取excel数据的真实行数

    有很多时候会出现空的数据导致行数被识别多的情况 // 获取Excel表的真实行数 int getExcelRealRow(Sheet sheet) { boolean flag = false; fo ...

  9. NPOI复制模板导出Excel

    本人菜鸟实习生一枚,公司给我安排了一个excel导出功能.要求如下:1.导出excel文件有样式要求:2.导出excel包含一个或多个工作表:3.功能做活(我的理解就是excel样式以后可能会变方便维 ...

  10. php读取excel文件的实例代码

    php读取excel文件的实例代码. 代码: <?php /** * php读取excel文件 * by www.jbxue.com */ $this->loadexcel();//半酣p ...

随机推荐

  1. 2_jQuery

    一. jQuery介绍 1.1 什么是jQuery jQuery, 顾名思义, 也就是JavaScript和查询(Query), 它就是辅助JavaScript开发的js类库 1.2 jQuery核心 ...

  2. day42-反射01

    Java反射01 1.反射(reflection)机制 1.1反射机制问题 一个需求引出反射 请看下面问题: 根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi clas ...

  3. Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?

    Java19中引入了虚拟线程,虽然默认是关闭的,但是可以以Preview模式启用,这绝对是一个重大的更新,今天Java架构杂谈带大家开箱验货,看看这家伙实现了什么了不起的功能. 1 为什么需要虚拟线程 ...

  4. AVX图像算法优化系列一: 初步接触AVX。

    弄了SSE指令集,必然会在不同的场合不同的人群中了解到还有更为高级的AVX指令集的存在,早些年也确实有偶尔写点AVX的函数,但是一直没有深入的去了解,今年十一期间也没到那里去玩,一个人在家里抽空就折腾 ...

  5. Linux 下指定端口开放访问权限

    Linux 下指定端口开放访问权限 作者:Grey 原文地址: 博客园:Linux 下指定端口开放访问权限 CSDN:Linux 下指定端口开放访问权限 环境 CentOS 系和 Debian 系的防 ...

  6. Vue学习之--------脚手架的分析、Ref属性、Props配置(2022/7/28)

    欢迎大家加入我的社区:http://t.csdn.cn/Q52km 社区中不定时发红包 文章目录 1.脚手架的分析 2.ref属性 2.1 基础知识 2.2 代码实现 2.3 测试效果 3.Props ...

  7. 忘记了99乘法表啥样的了,python打印下看看

    for i in range(1,10): for j in range(1, i+1): if i == j: print(j, "x", i, "=", i ...

  8. MassTransit | .NET 分布式应用框架

    引言 A free, open-source distributed application framework for .NET. 一个免费.开源的.NET 分布式应用框架. -- MassTran ...

  9. 33.ModelSerializer详解

    ModelSerializer特点 根据Model模型的定义,自动生成字段 自动生成相应的验证器 实现create和update 自动默认将关系字段映射成PrimaryKeyRelatedField主 ...

  10. 鹅长微服务发现与治理巨作PolarisMesh实践-上

    @ 目录 概述 定义 核心功能 组件和生态 特色亮点 解决哪些问题 官方性能数据 架构原理 资源模型 服务治理 基本原理 服务注册 服务发现 安装 部署架构 集群安装 SpringCloud应用接入 ...