作为一个后端开发人员,工作中处理 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();
当然,上面需要 Excel 文件中包含标题行,它会从第一个 Sheet 中读取数据,并且标题名称要和对象的属性名称相等(这里忽略大小写)。
使用特性映射到属性
下面的实体类中,使用了 Column 特性映射 Excel 中的标题名到 C# 中对象的属性。
{
[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("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("Number", p => p.NumberInStock);
excel.AddMapping(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
products.First().Price += 1.0;
写入 Excel 文件
写入数据也非常简单,调用 Save 方法并传入对象即可,如下
var products = new List
{
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("Product", p => p.Product).AsJson();
如果您在寻找在 C# 中操作 Excel 的工具,绝对可以尝试下高效的 ExcelMapper 。
项目地址
https://github.com/mganss/ExcelMapper
来源:Dotnet 工具箱