前言
作为一个后端开发人员,工作中处理 Excel 的场景有很多,本文介绍了一个在 C# 中高效读写 Excel 的组件,可以极大的提升效率。
简介
ExcelMapper
是一个基于 MIT 协议的开源组件,通过操作 C# 中的数据模型来进行 Excel 的读取和写入。
它提供了非常简洁的 API,甚至可以通过一行代码读取或写入 Excel 数据。
核心功能
-
读取和写入 Excel 文件 -
支持 xls 和 xlsx 格式。 -
通过约定、属性或方法调用把 Excel 列映射到 C# 的对象属性。 -
读取文件后,支持修改保存。
如何使用
首先,使用 Nuget 搜索并安装 ExcelMapper 到项目中。
接下来,使用下面的代码,读取 products Excel 文件,非常简洁。
var products = new ExcelMapper("products.xlsx").Fetch<Product>();
当然,上面需要 Excel 文件中包含标题行,它会从第一个 Sheet 中读取数据,并且标题名称要和对象的属性名称相等(这里忽略大小写)。
使用特性映射到属性
下面的实体类中,使用了 Column 特性映射 Excel 中的标题名到 C# 中对象的属性。
public class Product { [Column("名称")] public string Name { get; set; } public int NumberInStock { get; set; } [Column("价格")] public decimal Price { get; set; } }
使用列索引映射到属性
当 Excel 数据中没有标题时,可以使用索引映射的方式,如下
var excelMapper = new ExcelMapper() { HeaderRow = false }; var products = await excelMapper.FetchAsync<Product>("products.xlsx"); public class Product { [Column(1)] public string? Name { get; set; } [Column(Letter = "C")] public int NumberInStock { get; set; } [Column(4)] public decimal Price { get; set; } }
这里的索引支持数字 1,2,3,4,也支持 Excel 对应的 A, B, C, D。
通过代码配置映射
除了在实体类上加特性的方式,ExcelMapper 还支持使用代码的方式手动映射,如下
var excel = new ExcelMapper("products.xls"); excel.AddMapping<Product>("Number", p => p.NumberInStock); excel.AddMapping<Product>(1, p => p.NumberInStock); excel.AddMapping(typeof(Product), "Number", "NumberInStock"); excel.AddMapping(typeof(Product), ExcelMapper.LetterToIndex("A"), "NumberInStock");
动态类型支持
你可以不定义实体类,直接使用 dynamic 类型获取数据,如下
var products = new ExcelMapper("products.xlsx").Fetch(); // -> IEnumerable<dynamic> products.First().Price += 1.0;
写入 Excel 文件
写入数据也非常简单,调用 Save 方法并传入对象即可,如下
var products = new List<Product> { new Product { Name = "Nudossi", NumberInStock = 60, Price = 1.99m }, new Product { Name = "Halloren", NumberInStock = 33, Price = 2.99m }, new Product { Name = "Filinchen", NumberInStock = 100, Price = 0.99m }, }; var excelMapper = new ExcelMapper(); excelMapper.Save("products.xlsx", products, "Products"); await excelMapper.SaveAsync("products.xlsx", products, "Products");
JSON 支持
你可以非常方便的把 Excel 中的数据映射到 Json 类型中,通过使用 Json 特性或者 AsJson 方法,如下
public class ProductJson { [Json] public Product Product { get; set; } } // or var excel = new ExcelMapper("products.xls"); excel.AddMapping<ProductJson>("Product", p => p.Product).AsJson();
如果你在寻找在 C# 中操作 Excel 的工具,绝对可以尝试下高效的ExcelMapper
文章评论