作为一个后端开发人员,工作中处理 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 的列索引映射到属性
当 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 。
项目地址