.NET 中使用 ExcelMapper 高效读写 Excel

作为一个后端开发人员,工作中处理 Excel 的场景有很多,本文介绍了一个在 C# 中高效读写 Excel 的组件,可以极大的提升效率。

简介

ExcelMapper 是一个基于 MIT 协议的开源组件,通过操作 C# 中的数据模型来进行 Excel 的读取和写入。它提供了非常简洁的 API,甚至可以通过一行代码读取或写入 Excel 数据。.

核心功能

•  读取和写入 Excel 文件

•  支持 xls 和 xlsx 格式。

•  通过约定、属性或方法调用把 Excel 列映射到 C# 的对象属性。

•  读取文件后,支持修改保存。

如何使用

首先,使用 Nuget 搜索并安装 ExcelMapper 到项目中。

.NET 中使用 ExcelMapper 高效读写 Excel

接下来,使用下面的代码,读取 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。

.NET 中使用 ExcelMapper 高效读写 Excel

通过代码配置映射

除了在实体类上加特性的方式,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 。

项目地址

https://github.com/mganss/ExcelMapper