(文章目录) 前言 ExcelMapper 是一个基于 MIT 协议的开源组件,通过操作 C# 中的数据模型来进行 Excel 的读取和写入。它提供了非常简洁的 API,甚至可以通过一行代码读取或写入 Excel 数据。
(文章目录)
前言
ExcelMapper 是一个基于 MIT 协议的开源组件,通过操作 C# 中的数据模型来进行 Excel 的读取和写入。它提供了非常简洁的 API,甚至可以通过一行代码读取或写入 Excel 数据。
核心功能
- 读取和写入 Excel 文件
- 使用纯托管 NPOI 库而不是 Jet 数据库引擎(NPOI 用户组)
- 使用标题行(列名)或列索引(无标题行)映射到 Excel 文件
- 映射嵌套对象(父/子对象)
- 阅读时可选择跳过空白行
- 保存回文件时保留格式
- (可选)让映射器跟踪对象
- 通过约定、属性或方法调用将列映射到属性
- 对数字列和日期时间列使用自定义或内置数据格式
- 根据属性类型映射公式或公式结果
- 映射 JSON
- 获取/保存动态对象
- 使用记录
- 提供自定义对象工厂
GitHub网址:https://github.com/mganss/ExcelMapper
一、.NET Core使用ExcelMapper
1.使用 Nuget 搜索并安装 ExcelMapper
2.从Excel文件中读取对象
var products = new ExcelMapper("products.xlsx").Fetch<Product>();
public class Product
{
public string Name { get; set; }
public int NumberInStock { get; set; }
public decimal Price { get; set; }
}
3.属性映射
3.1 映射到特定列名称
public class Product
{
public string Name { get; set; }
[Column("Number")]
public int NumberInStock { get; set; }
public decimal Price { get; set; }
}
3.2 映射到列索引
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; }
}
var products = new ExcelMapper("products.xlsx") { HeaderRow = false }.Fetch<Product>();
请注意,列索引不需要是连续的。映射到列索引时,需要通过属性或方法显式映射每个属性。您可以将列索引与列名组合在一起,以指定显式列顺序,同时仍使用标题行。
3.3 通过方法调用映射
除了在实体类上加特性的方式,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");
3.4 多个映射
您可以将单个列映射到多个属性,但您需要了解从对象映射回 Excel 时应发生的情况。若要指定要映射回 Excel 的单个属性,请添加映射到同一列的所有其他属性的属性。或者,可以在通过方法调用进行映射时使用该方法。
public class Product
{
public decimal Price { get; set; }
[Column("Price", MappingDirections.ExcelToObject)]
public string PriceString { get; set; }
}
// or
excel.AddMapping<Product>("Price", p => p.PriceString).FromExcelOnly();
Column默认情况下,属性是继承的,如果将属性添加到 Base 中的属性,则会导致单个重写属性的多个映射 和派生类。若要防止出现这种情况,请在基类中的属性上将该属性设置为 false。
3.5 动态映射
你可以不定义实体类,直接使用 dynamic 类型获取数据,如下
var products = new ExcelMapper("products.xlsx").Fetch(); // -> IEnumerable<dynamic>
products.First().Price += 1.0;
3.6 忽略属性
public class Product
{
public string Name { get; set; }
[Ignore]
public int Number { get; set; }
public decimal Price { get; set; }
}
// or
var excel = new ExcelMapper("products.xlsx");
excel.Ignore<Product>(p => p.Price);
3.7 特定数据格式
public class Product
{
[DataFormat(0xf)]
public DateTime Date { get; set; }
[DataFormat("0%")]
public decimal Number { get; set; }
}
更多属性使用清参考官网
4.写入 Excel 文件
1、纯写入
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 },
};
new ExcelMapper().Save("products.xlsx", products, "Products");
2、读取写入
var products = new ExcelMapper("products.xlsx").Fetch<Product>().ToList();
products[1].Price += 1.0m;
excel.Save("products.out.xlsx");
3、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();