简介

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

项目地址:

https://gitee.com/fengwuyan/ExcelToObject

项目示例

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

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

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

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

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

详细操作

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

    • 人员信息dto
/// <summary>
/// 用户导入导出dto
/// </summary>
public class UserImportExportDto
{
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 性别
/// </summary>
public string Gender { get; set; }
/// <summary>
/// 身份证号
/// </summary>
public string IDCard { get; set; }
/// <summary>
/// 毕业院校
/// </summary>
public string School { get; set; }
/// <summary>
/// 简介
/// </summary>
public string Profile { get; set; }
}
  • 字典配置信息dto
 /// <summary>
/// 字典配置
/// </summary>
public class SettingImportExportDto
{
/// <summary>
/// 字典类别编码
/// </summary>
public string CategoryCode { get; set; }
/// <summary>
/// 字典类别名称
/// </summary>
public string CategoryName { get; set; } /// <summary>
/// 字典项编码
/// </summary>
public string ItemCode { get; set; }
/// <summary>
/// 字典项名称
/// </summary>
public string ItemName { get; set; }
/// <summary>
/// 字典值
/// </summary>
public string Value { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
}
  1. 设置Excel模板内每个Sheet的名称管理器,名称管理器的值与DTO的属性名称一致

    • 人员信息

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

  • 字典配置信息

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

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

写入操作

写入操作也是一样的流程

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

总结

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. Windows 下JDK绿色免安装制作教程

    java自从被oracle收购后,windows下新的版本只有安装版.没有zip免安装. windows安装版有一下坏处 会写注册表 会将java.exe,javaw.exe 等解压到C:\Windo ...

  2. 升级Gogs版本

    今天早上收到阿里云发的报警短信,大致内容如下: 前提分析: 公司代码代码仓库使用是Gogs搭建的,版本是0.11.34,二进制方式安装的,连接的是其他主机上的MySQL数据库,因此被检测到有这个漏洞 ...

  3. 彻底掌握Makeifle(三)

    彻底掌握Makeifle(三) 前言 在前面的文章彻底掌握Makefile(一)和彻底掌握Makefile(二)当中,我们简要的介绍了一些常见的makefile使用方法,在本篇文章当中我们将继续介绍一 ...

  4. OpenJudge 1.5.35:求出e的值

    35:求出e的值 总时间限制:1000ms 内存限制:65536kB 描述 利用公式e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! 求e . 输入 输入只有一行,该行包 ...

  5. Springboot之 Mybatis 多数据源实现

    简介 上篇讲解了 JPA 多数据源实现:这篇讲解一下 Mybatis 多数据源实现 .主要采用将不同数据库的 Mapper 接口分别存放到不同的 package,Spring 去扫描不同的包,注入不同 ...

  6. 关于aws-Global区的新账户的一些限制坑点

    在使用global-aws的时候,遇到几个限制坑点记录如下(都是需要发请求找aws服务支持才能提高) 1.关于Elastic IPs的限制,默认为 5,这样在ec2下的Elastic IPs中最多只能 ...

  7. P6189 [NOI Online #1 入门组] 跑步 (DP/根号分治)

    (才了解到根号分治这样的妙方法......) 将每个数当成一种物品,最终要凑成n,这就是一个完全背包问题,复杂度O(n2),可以得80分(在考场上貌似足够了......) 1 #include < ...

  8. BUUCTF-PWN-第一页writep(32题)

    温故而知新,可以为师矣.所以花了几天时间重新做了下 buuctf 的 pwn 题,先发下第一页共 32 题的题解.还有如果题解都很详细那么本文就太长了,写起来也浪费时间,所以比较简单的题就直接丢 ex ...

  9. VMware vSphere 8.0 正式版下载

    请访问原文链接:https://sysin.org/blog/vmware-vsphere-8/,查看最新版.原创作品,转载请保留出处. 作者主页:www.sysin.org vSphere 8.0 ...

  10. 【C++】spdlog光速入门,C++logger最简单最快的库

    参考文档:https://spdlog.docsforge.com/master/ spdlog简介 Very fast, header only, C++ logging library. 一个he ...