ExcelToObject.NPOI 两行代码导出Excel报表、读取Excel数据

时间:2022-12-13 15:08:48

简介

作为一个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页:导入基本信息
      ExcelToObject.NPOI 两行代码导出Excel报表、读取Excel数据

    • 第二个Sheet页:导入字典配置信息列表
      ExcelToObject.NPOI 两行代码导出Excel报表、读取Excel数据

  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的属性名称一致

    • 人员信息

ExcelToObject.NPOI 两行代码导出Excel报表、读取Excel数据

ExcelToObject.NPOI 两行代码导出Excel报表、读取Excel数据

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

ExcelToObject.NPOI 两行代码导出Excel报表、读取Excel数据

  • 字典配置信息

ExcelToObject.NPOI 两行代码导出Excel报表、读取Excel数据

ExcelToObject.NPOI 两行代码导出Excel报表、读取Excel数据

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

  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页内的名称管理器的值与对应代码中的类的属性名称相同,从而进行匹配,达到智能读取的功能