简介
作为一个dotnet开发者,经常面对业务系统中大量报表导入导出,经常写了一堆的重复代码。最近发现一个操作excel的神器:ExcelToObject.NPOI,两行代码就能导出一个报表,两行代码就能读取excel数据。就像作者说的:让操作excel变成了操作对象。下面让我们来看看这个组件
项目地址:
https://gitee.com/fengwuyan/ExcelToObject
项目示例
- 在项目中引入
ExcelToObject.NPOI
dotnet add package ExcelToObject.Npoi --version 1.0.0
- 在Program或Startup类中添加服务
service.AddExcelToObjectNpoiService();
-
以下以一个业务来举例,一个导入业务需要同时导入两个数据源,我们先把Excel模板定义好。
-
第一个Sheet页:导入基本信息

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

-
-
以下为导入两个数据sheet的代码
- 构造函数注入
IExcelFactory对象 - 使用
ReadByNameManager和ReadListByNameManager方法分别读取单个对象和读取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}")); //写入到数据库 }
详细操作
- 分别定义对应数据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; } }
-
设置Excel模板内每个Sheet的名称管理器,名称管理器的值与DTO的属性名称一致
- 人员信息


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

- 字典配置信息


配置好之后,就可以了。总结就两步:
- 定义导入导出dto
- 配置excel模板的名称管理器
写入操作
写入操作也是一样的流程
- 建立对应DTO
- 配置excel模板
- 调用
WriteByNameManager和WriteListByNameManager方法写入数据到对应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页内的名称管理器的值与对应代码中的类的属性名称相同,从而进行匹配,达到智能读取的功能